xqlee 1146 0 2017-11-08 17:16:09

文章位置:左搜> 编程技术> 正文

一.Java web中什么是HttpSession

javax.servlet.http.HttpSession接口表示一个会话,我们可以把一个会话内需要共享的数据保存到HttSession对象中

二.HttpSession由谁创建

    session在访问tomcat服务器HttpServletRequest的getSession(true)/getSession()的时候创建,tomcat的ManagerBase类提供创建sessionid的方法:随机数+时间+jvmid;,session默认存储在服务器的内存中。
    sessionid是一个会话的key,浏览器第一次访问服务器会在服务器端生成一个session,有一个sessionid和它对应。tomcat生成的sessionid叫做jsessionid。

三.HttpSession什么时候销毁

  • 超时;
  • 程序调用HttpSession.invalidate();
  • 程序关闭;

四.HttpSession持久化问题

    所有支持Servlet规范的容器都自带session管理,于是大多数人都使用HttpSession接口存放状态信息。事实上, servlet的session会使得应用服务器水平扩展变的非常困难,在应用编写时应该完全弃用HttpSession原生接口。

session在web应用中主要有以下几个功能实现:
  • session ID生成
  • session过期管理
  • session更新

4.1redis替代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的运维工作,我们的应用服务器已经是完全无状态的了,水平扩展时只需要添加机器而不需要改动任何一行代码。

4.2 spring session成熟方案替换HttpSession

spring session介绍:
Spring session为管理用户的会话信息提供了一个API和实现。它还提供了无缝的集成:
  • HttpSession——允许在应用程序容器中替换HttpSession(即Tomcat)中立的方式。附加功能,包括
  • 集群会话——Spring session使得支持集群会话而不被绑定到应用程序容器的特定解决方案变得微不足道。
  • 多个浏览器会话——Spring session支持在一个浏览器实例中管理多个用户会话(也就是说,多个经过身份验证的帐户类似于谷歌)。
  • RESTful api——Spring session允许在头文件中提供与RESTful api一起工作的会话id
WebSocket——提供在接收WebSocket消息时保持HttpSession存活的能力

spring session主要得实现方式有:
  • Redis实现(逻辑同4.1)
  • JDBC实现
  • Mongo实现
  • Hazelcast实现
  • Pivotal GemFire实现