【Servlet】04-使用Session

若是,咱们须要保留用户的状态信息,则能够尝试使用Session(HTTP是无状态的嘛!)java

假设咱们有以下场景:服务器

-Hey,Siri!
-我有什么能够帮你的?
-给我讲一个冷笑话。
-好的,blahblah。
-再来一个。
-对不起,我没听懂你在说什么。cookie

如何让Siri可以上下文联想呢?Session机制这时候就颇有用,Session机制提供的是:session

  • 同一用户并发

  • 同一Session负载均衡

  • 不一样请求分布式

  • 不一样线程工具

Session是这样开始工做的:url

客户端->服务器:发送一个请求
服务器->客户端:设置Cookie/惟一的SessionID
客户端->服务器:再次请求+上次的Cookie

容器为咱们作了绝大多部分工做:线程

  • 建立会话

  • 生成SessionID(向客户端设置set-cookie首部)

  • ID与会话匹配

咱们惟一须要作的事就是:

// 这行代码不建立Session
HttpSession session = request.getSession(false);
if (session == null) {
    session = request.getSession();
}

若是咱们恰巧禁用了Cookie,咱们须要使用URL重写技术

// 向someurl增长额外的会话ID
response.encodeURL(someurl);

会话的技术问题解决了,可是为了服务器的负担问题,咱们不可能一直在服务器端保留用户的会话信息,会话存活问题也就须要解决。

咱们查看HttpSession的API以后,有以下列表:

方法名 返回结果 做用
getCreateTime() 建立时间的毫秒 获取Session的建立时间
getLastAccessedTime() 上次访问时间的毫秒 同左
setMaxInactiveInterval() X 设置session存活时间,单位为秒
invalidate() X session失效

P.S. 咱们能够在DD中设置Session的存活时间:

<session-config>
    <!--单位为分钟-->
    <session-timeout></session-timeout>
</session-config>

做为客户端验证的工具Cookie,咱们有以下方法:

方法名 返回结果 做用
getCookies() 获取全部的Cookie 同左
setMaxAge() 设置Cookie的优秀时间,单位为秒数 X
addCookie() 设置一个Cookie 同左

下面,咱们来探讨一下分布式应用中的Session问题。
咱们知道的是,对于一个分布式应用,每一个VM的Servlet有一个ServletContext,有一个ServletConfig。对于一次会话,只有一个HttpSession对象。而后,咱们就有了会话迁移技术:

Web容器为了负载均衡,将HttpSession迁移到其它VM的技术。

和会话有关的接口以下所示:

HttpSessionListener --> SessionListener

类名 做用 实现类
HttpSessionListener 查看并发用户 其它类
HttpSessionBindingListener 查看实现该接口的类被绑定到会话的状况 属性类
HttpSessionAttributeListener 查看会话中属性的增删改状况 其它类
HttpSessionActivationListener 会话迁移到其它VM的状况 X

P.S. 和Session有关的事件监听器只有 HttpSessionAttributeEvent和HttpSessionBindingEvent

相关文章
相关标签/搜索