【Servlet】04-使用Session
2017-02-20 16:53
295 查看
如果,我们需要保留用户的状态信息,则可以尝试使用Session(HTTP是无状态的嘛!)
假设我们有如下场景:
-Hey,Siri!
-我有什么可以帮你的?
-给我讲一个冷笑话。
-好的,blahblah。
-再来一个。
-对不起,我没听懂你在说什么。
如何让Siri能够上下文联想呢?Session机制这时候就很有用,Session机制提供的是:
同一用户
同一Session
不同请求
不同线程
Session是这样开始工作的:
Created with Raphaël 2.1.0客户端客户端服务器服务器发送一个请求设置Cookie/唯一的SessionID再次请求+上次的Cookie
容器为我们做了绝大多部分工作:
创建会话
生成SessionID(向客户端设置set-cookie首部)
ID与会话匹配
我们唯一需要做的事就是:
如果我们恰巧禁用了Cookie,我们需要使用URL重写技术
会话的技术问题解决了,但是为了服务器的负担问题,我们不可能一直在服务器端保留用户的会话信息,会话存活问题也就需要解决。
我们查看HttpSession的API之后,有如下列表:
P.S. 我们可以在DD中设置Session的存活时间:
作为客户端验证的工具Cookie,我们有如下方法:
下面,我们来探讨一下分布式应用中的Session问题。
我们知道的是,对于一个分布式应用,每个VM的Servlet有一个ServletContext,有一个ServletConfig。对于一次会话,只有一个HttpSession对象。然后,我们就有了会话迁移技术:
Web容器为了负载均衡,将HttpSession迁移到其它VM的技术。
和会话有关的接口如下所示:
HttpSessionListener –> SessionListener
P.S. 和Session有关的事件监听器只有 HttpSessionAttributeEvent和HttpSessionBindingEvent
假设我们有如下场景:
-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 (sessio 4000 n == null) { session = request.getSession(); }
如果我们恰巧禁用了Cookie,我们需要使用URL重写技术
// 向someurl增加额外的会话ID response.encodeURL(someurl);
会话的技术问题解决了,但是为了服务器的负担问题,我们不可能一直在服务器端保留用户的会话信息,会话存活问题也就需要解决。
我们查看HttpSession的API之后,有如下列表:
方法名 | 返回结果 | 作用 |
---|---|---|
getCreateTime() | 创建时间的毫秒 | 获取Session的创建时间 |
getLastAccessedTime() | 上次访问时间的毫秒 | 同左 |
setMaxInactiveInterval() | X | 设置session存活时间,单位为秒 |
invalidate() | X | session失效 |
<session-config> <!--单位为分钟--> <session-timeout></session-timeout> </session-config>
作为客户端验证的工具Cookie,我们有如下方法:
方法名 | 返回结果 | 作用 |
---|---|---|
getCookies() | 获取所有的Cookie | 同左 |
setMaxAge() | 设置Cookie的优秀时间,单位为秒数 | X |
addCookie() | 设置一个Cookie | 同左 |
我们知道的是,对于一个分布式应用,每个VM的Servlet有一个ServletContext,有一个ServletConfig。对于一次会话,只有一个HttpSession对象。然后,我们就有了会话迁移技术:
Web容器为了负载均衡,将HttpSession迁移到其它VM的技术。
和会话有关的接口如下所示:
HttpSessionListener –> SessionListener
类名 | 作用 | 实现类 |
---|---|---|
HttpSessionListener | 查看并发用户 | 其它类 |
HttpSessionBindingListener | 查看实现该接口的类被绑定到会话的情况 | 属性类 |
HttpSessionAttributeListener | 查看会话中属性的增删改情况 | 其它类 |
HttpSessionActivationListener | 会话迁移到其它VM的情况 | X |
相关文章推荐
- servlet下怎样使用session
- Tomcat7.0 使用以前的jre的时候报错:javax.servlet.ServletContext.getSessionCookieConfig
- 玩转web之servlet(六)---session介绍及简单使用(登录验证中保存信息)
- servlet中session的使用
- Servlet(session的使用)
- Servlet中对象session的使用
- SpringMVC-04 使用Servlet原生的API作为参数
- 玩转web之servlet(六)---session介绍及简单使用(登录验证中保存信息)
- servlet中session简介和使用例子
- 使用Servlet技术~购物车-04
- servlet中使用session
- servlet中使用session
- servlet下怎样使用session,重点是向session传值!
- 玩转web之servlet(六)---session介绍及简单使用(登录验证中保存信息)
- 【Servlet】在servlet中使用session
- 在Struts2中使用类似传统的servlet、session、application作用域对象
- 关于使用LoadRunner测试时使用Servlet返回的Sessionid的问题
- servlet中session的使用
- Servlet 第六课: Session的使用
- request session servletcontext三个域的使用时机 和 MD5的作用