1、容器端sessionredis
一、当浏览器第一次访问服务器时,使用request.getSession()方法,服务器会建立一个Session对象和具备JSESSIONID键值的cookie,成功返回后浏览器会获得一个包含sessionId的Cookie。json
二、浏览器再次访问服务器时,会携带具备JSESSIONID属性的cookie到服务器,再次使用request.getSession()方法时能够经过sessionId找到session对象。浏览器
2、session用于权限验证缓存
一、在Rquest.getSession()得到的session对象中存入用户权限标识、如已登陆标识、角色权限标号等。服务器
二、再次登陆时经过cookie中的JSESSIONID得到session对象,若是成功得到,则查找当前对象中是否有已登陆标识、无则视为未登陆状态,阻止某些请求。cookie
三、2过程当中有存在登陆标识的session对象再进一步根据角色权限信息判断是否继续当前请求。session
3、容器端session问题负载均衡
一、多台服务器的状况下共享问题,即第一次登陆时,请求被分到A服务器,那么session对象仅保存在A服务器中,下次访问到B服务器无session对象,会被当作未登陆状态。性能
a)这里负载均衡会根据哈希一致性原理将同一客户端的请求分配到同一个服务器上,因此在正常状况下,登陆在A服务器,存登陆信息的session在A服务器,下次访问继续请求到A服务器,这个能够保证。对象
b)可是在非正常状况下,服务器down掉,或者某些奇葩的缘由session丢失,用户就会在访问过程当中屡次被要求登陆,严重影响用户体验。
二、最终Session可能会是服务器性能影响的一个重要指标,若是单点的服务商用户量比较大,且随着业务的复杂度增长,每一个登陆的用户都会写入比较多的数据放入会话中(好比权限,通知,消息等)这样服务器容器就须要开辟一块很大的内存来存放这些众多的用户信息,并且用户在客户端不停的切换页面查询数据,后台就会在不停的循环查询存放全部会话的变量,会极大的影响服务器的效率和负载。
4、引入redis的目的
一、基本思路、在第一次登陆、使用request.getSession()得到session对象并设置后,将对应的信息已键值对的形式存入redis中(键:jsessioniid,值:session对象的json字符串),
二、为减少服务器负担,服务器端的session对象仅保留简单的登陆标识,其余共享信息,如权限、通知、消息保留在redis服务器中。、
三、再次访问过程,登陆身份信息先拿cookie中的jsessionId去resdis中寻找,找不到的状况下才去服务器中找对应的session对象,如存在对应的登陆标识,再将复杂的身份信息查询后缓存回redis中。
四、服务器挂掉的状况下,用户并不须要从新登陆,redis中仍然保存着登陆信息。redis挂掉的状况下,登陆机制也不会崩溃,服务器仍然保留着基本的登陆标识。