Web 应用状态管理
dong4j 7/31/2015
JavaSE
Web服务器一旦发出响应,一个请求响应过程就结束了. 当再次发出请求时,Web服务器不记得曾就做过的请求,也不记得给用户发出过响应.,这就是http的无状态模式
当需要跨多个请求需要保留与客户端会话状态时,我们有4种解决方案
表单隐藏字段
<input type="hidden" name="userName" value="...">
作用:
- 对用户在网上的访问进行会话跟踪
- 为服务器提供预定义的输入
- 存储动态产生的网页的上下文信息
缺点: 只有当每个网页是动态生成的才有效
Cookie
将数据已键值对的形式通过响应保存在客户端 方法:
- Cookie(name,value)
- get/setComment(String comment):注释
- get/setDomain(String domainPattern):得到/设置应用Cookie的域
- setMaxAge(int lifetime) 设置过期时间,默认为负数,表示在关闭浏览器后过期
- getMaxAge()
- get/setName(String name)
- get/setValue(String value)
将Cookie发送到客户端的步骤
- 创建一个或多个Cookie
- 使用setXXX方法设置Cookie的可选属性
- 使用HttpServletResponse对象的addCookie()方法将Cookie插入到响应头中
读取客户端传递过来的Cookie的步骤
- 使用HttpServletRequset对象的getCookie方法返回一个Cookie对象数组
- Servlet遍历该数组(getName()),直到找到名称相匹配的Cookie值
Session
在服务器端为客户端创建一个唯一的Session对象,用于存放数据. 在创建Session对象的同时,服务器会为该对象创建一个唯一的SesionID,存储在客户端的Cookie当中
HttpSession接口中的方法
- get/setAttribute(String key,Object obj)
- removeAttribute(String key)
- getCreationTime() :返回第一次创建会话的时间
- getLastAccessedTime() :返回容器最后一次得到该会话ID的请求时间
- get/setMaxInactiveInterval(int time) :存活时间
- invalidate():结束会话
- getId()
会话超时管理
结束会话的3种情况
- 服务器重启或崩溃
- 调用invalidate()方法
- 会话超时
在web.xml中设置会话时间 单位是分钟
<session-config>
<session-timeout>15</session-timeout>
</session-config>
1
2
3
2
3
在程序中设置超时时间的单位是秒
Application和Session域范围的属性
Application
ServletContext sc = this.getServletConfig().getServletContext();
1
Session持久化
Tomcat提供的2个类来管理Session对象
- StandardManager(默认)
- 当服务器关闭或应用重新加载的时候在work/Catalina/localhost/web/应用名 下创建名为session.ser的文件,将session信息写入,当宠幸加载或重启时读取这个文件,然后删除
- PersistentManager
URL重写
由于Session依赖于Cookie,当浏览器关闭Cookie时将不能使用Cookie和Session,当这种情况发生时,URL重写就派上用场了. URL重写是将SessionID写入到URL当中,就不需要Cookie保存SessionID
URL;jsessionid=id;
重定向中使用URL重写
HttpSession session = requset.getSession();
String url = resquest.encodeRedirectURL("/aa/bb.html");
request.sendRedirect(url);
1
2
3
2
3
encodeURL()是本应用级别的, encodeRedirectURL()是跨应用的.
- response.encodeRedirectURL(url)是一个进行URL重写的方法, 使用这个方法的作用是为了在原来的url后面追加上Jsessionid . 目的是保证即使在客户端浏览器禁止了cookie的情况下, 服务器端仍然能够对其进行事务跟踪.
- response.sendRedirect(url) 是一个url重定向的方法, 服务器端的通过该方法, “告诉”客户端的浏览器去访问url所指向的资源