基于session的登录权限控制及redis缓存引入

一、容器端session

  1、当浏览器第一次访问服务器时,使用request.getSession()方法,服务器会创建一个Session对象和具有JSESSIONID键值的cookie,成功返回后浏览器会得到一个包含sessionId的Cookie。

  2、浏览器再次访问服务器时,会携带具有JSESSIONID属性的cookie到服务器,再次使用request.getSession()方法时可以通过sessionId找到session对象。

二、session用于权限验证

  1、在Rquest.getSession()获得的session对象中存入用户权限标识、如已登录标识、角色权限标号等。

  2、再次登录时通过cookie中的JSESSIONID获得session对象,如果成功获得,则查找当前对象中是否有已登录标识、无则视为未登录状态,阻止某些请求。

  3、2过程中有存在登录标识的session对象再进一步根据角色权限信息判断是否继续当前请求。

三、容器端session问题

  1、多台服务器的情况下共享问题,即第一次登录时,请求被分到A服务器,那么session对象仅保存在A服务器中,下次访问到B服务器无session对象,会被当做未登录状态。

  a)这里负载均衡会根据哈希一致性原理将同一客户端的请求分配到同一个服务器上,所以在正常情况下,登录在A服务器,存登录信息的session在A服务器,下次访问继续请求到A服务器,这个可以保证。

    b)但是在非正常情况下,服务器down掉,或者某些奇葩的原因session丢失,用户就会在访问过程中多次被要求登录,严重影响用户体验。

  2、最终Session可能会是服务器性能影响的一个重要指标,如果单点的服务商用户量比较大,且随着业务的复杂度增加,每个登录的用户都会写入比较多的数据放入会话中(比如权限,通知,消息等)这样服务器容器就需要开辟一块很大的内存来存放这些众多的用户信息,而且用户在客户端不停的切换页面查询数据,后台就会在不停的循环查询存放所有会话的变量,会极大的影响服务器的效率和负载。

四、引入redis的目的

  1、基本思路、在第一次登录、使用request.getSession()获得session对象并设置后,将对应的信息已键值对的形式存入redis中(键:jsessioniid,值:session对象的json字符串),

  2、为减小服务器负担,服务器端的session对象仅保留简单的登录标识,其他共享信息,如权限、通知、消息保留在redis服务器中。、

  3、再次访问过程,登录身份信息先拿cookie中的jsessionId去resdis中寻找,找不到的情况下才去服务器中找对应的session对象,如存在对应的登录标识,再将复杂的身份信息查询后缓存回redis中。

  4、服务器挂掉的情况下,用户并不需要重新登录,redis中仍然保存着登录信息。redis挂掉的情况下,登录机制也不会崩溃,服务器仍然保留着基本的登录标识。 

原文地址:https://www.cnblogs.com/lyInfo/p/9142780.html