javax.servlet.http.HttpSession接口表示一个会话,我们可以把一个会话内需要共享的数据保存到HttSession对象中
session在访问tomcat服务器HttpServletRequest的getSession(true)/getSession()的时候创建,tomcat的ManagerBase类提供创建sessionid的方法:随机数+时间+jvmid;,session默认存储在服务器的内存中。
sessionid是一个会话的key,浏览器第一次访问服务器会在服务器端生成一个session,有一个sessionid和它对应。tomcat生成的sessionid叫做jsessionid。
所有支持Servlet规范的容器都自带session管理,于是大多数人都使用HttpSession
接口存放状态信息。事实上, servlet的session会使得应用服务器水平扩展变的非常困难,在应用编写时应该完全弃用HttpSession原生
接口。
session在web应用中主要有以下几个功能实现:
HttpSession
接口方案设计生成session id:
当用户登陆时,服务器生成一个全局唯一的字符串SESSION:日期:20位随机字符串
做为redis中hash数据结构的key名,然后将该标识做为cookie返回给客户端。 之后该用户的后续请求都会带上此cookie, 我们编写一个filter, 其作用为读取请求中的标识,从redis中取出该标识对应的数据,然后放到HttpServletRequest
对象中以供后续使用。
session过期:
使用redis自带的过期功能为session id设置过期时间,轻松实现session过期。
session追踪:
我们可以将每个用户的session id记录下来,如保存到数据库中,或者依然放在redis里,这样就可以查到某个注册用户所有session id, 轻松实现踢出登陆功能。
session更新:
通过AOP, 在每个请求完后之后,检查在请求处理过程中有没有更新session信息,如果有则将新数据刷新到Redis中。
方案特点:
将session转移到redis中后,只要做好redis的运维工作,我们的应用服务器已经是完全无状态的了,水平扩展时只需要添加机器而不需要改动任何一行代码。
HttpSession
spring session介绍:
Spring session为管理用户的会话信息提供了一个API和实现。它还提供了无缝的集成:
WebSocket——提供在接收WebSocket消息时保持HttpSession存活的能力
spring session主要得实现方式有:
http://blog.xqlee.com/article/297.html