Web 应用状态管理


7/31/2015 JavaSE

Web服务器一旦发出响应,一个请求响应过程就结束了. 当再次发出请求时,Web服务器不记得曾就做过的请求,也不记得给用户发出过响应.,这就是http的无状态模式

当需要跨多个请求需要保留与客户端会话状态时,我们有4种解决方案

表单隐藏字段

<input type="hidden" name="userName" value="..."> 作用:

  1. 对用户在网上的访问进行会话跟踪
  2. 为服务器提供预定义的输入
  3. 存储动态产生的网页的上下文信息

缺点: 只有当每个网页是动态生成的才有效

将数据已键值对的形式通过响应保存在客户端 方法:

  1. Cookie(name,value)
  2. get/setComment(String comment):注释
  3. get/setDomain(String domainPattern):得到/设置应用Cookie的域
  4. setMaxAge(int lifetime) 设置过期时间,默认为负数,表示在关闭浏览器后过期
  5. getMaxAge()
  6. get/setName(String name)
  7. get/setValue(String value)

将Cookie发送到客户端的步骤

  1. 创建一个或多个Cookie
  2. 使用setXXX方法设置Cookie的可选属性
  3. 使用HttpServletResponse对象的addCookie()方法将Cookie插入到响应头中

读取客户端传递过来的Cookie的步骤

  1. 使用HttpServletRequset对象的getCookie方法返回一个Cookie对象数组
  2. Servlet遍历该数组(getName()),直到找到名称相匹配的Cookie值

Session

在服务器端为客户端创建一个唯一的Session对象,用于存放数据. 在创建Session对象的同时,服务器会为该对象创建一个唯一的SesionID,存储在客户端的Cookie当中

HttpSession接口中的方法

  1. get/setAttribute(String key,Object obj)
  2. removeAttribute(String key)
  3. getCreationTime() :返回第一次创建会话的时间
  4. getLastAccessedTime() :返回容器最后一次得到该会话ID的请求时间
  5. get/setMaxInactiveInterval(int time) :存活时间
  6. invalidate():结束会话
  7. getId()

会话超时管理

结束会话的3种情况

  1. 服务器重启或崩溃
  2. 调用invalidate()方法
  3. 会话超时

在web.xml中设置会话时间 单位是分钟

<session-config>	
	<session-timeout>15</session-timeout>
</session-config>
1
2
3

在程序中设置超时时间的单位是秒

Application和Session域范围的属性

Application

ServletContext sc = this.getServletConfig().getServletContext();
1

Session持久化

Tomcat提供的2个类来管理Session对象

  1. StandardManager(默认)
    • 当服务器关闭或应用重新加载的时候在work/Catalina/localhost/web/应用名 下创建名为session.ser的文件,将session信息写入,当宠幸加载或重启时读取这个文件,然后删除
  2. 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

encodeURL()是本应用级别的, encodeRedirectURL()是跨应用的.

  1. response.encodeRedirectURL(url)是一个进行URL重写的方法, 使用这个方法的作用是为了在原来的url后面追加上Jsessionid . 目的是保证即使在客户端浏览器禁止了cookie的情况下, 服务器端仍然能够对其进行事务跟踪.
  2. response.sendRedirect(url) 是一个url重定向的方法, 服务器端的通过该方法, “告诉”客户端的浏览器去访问url所指向的资源
Last Updated: 7/3/2019, 6:17:56 PM