【Servlet】04-使用Session

如果,我们需要保留用户的状态信息,则可以尝试使用Session(HTTP是无状态的嘛!)

假设我们有如下场景:

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

如何让Siri能够上下文联想呢?Session机制这时候就很有用,Session机制提供的是:

  • 同一用户
  • 同一Session
  • 不同请求
  • 不同线程

Session是这样开始工作的:

Created with Raphaël 2.1.0 客户端 客户端 服务器 服务器 发送一个请求 设置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()Xsession失效

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值