JSP Session

HTTP 是一种 "无状态" 协议,每次客户端请求和服务器响应都是独立的,彼此间缺少上下文联系

但我们仍然可以有以下三种方式来维持 Web 客户端和 Web 服务器之间的 session 会话:

Cookies

Web 服务器可以分配一个唯一的 session 会话 ID 作为每个 Web 客户端的 cookie,对于客户端的后续请求可以使用接收到的 cookie 来识别

这应该是一个有效的方法,因为现代浏览器都 cookie,所以我们建议优先使用这种方式来维持 session 会话

下面会提到的 HttpSession 对象,其实也是基于 Cookie 的会话机制

隐藏的表单字段

Web 服务器可以发送一个隐藏的 HTML 表单字段,以及一个唯一的 session 会话 ID

<input type="hidden" name="sessionid" value="12345">

这意味着当表单被提交时,指定的名称和值会被自动包含在 GET 或 POST 数据中

每次当 Web 浏览器发送回请求时,session_id 值可以用于保持不同的 Web 浏览器的跟踪

这可能是一种保持 session 会话跟踪的有效方式,但是点击常规的超文本链接(<a href...>)不会导致表单提交,因此隐藏的表单字段也不支持常规的 session 会话跟踪

URL 重写

我们可以在每个 URL 末尾追加一些额外的数据来标识 session 会话

服务器会把该 session 会话标识符与已存储的有关 session 会话的数据相关联

例如 http://www.twle.cn/index.html;sessionid=12345,session 会话标识符被附加为 sessionid=12345,标识符可被 Web 服务器访问以识别客户端

URL 重写是一种更好的维持 session 会话的方式,它在浏览器不支持 cookie 时能够很好地工作

URL 重写的缺点是会动态生成每个 URL 来为页面分配一个 session 会话 ID,即使是在很简单的静态 HTML 页面中也会如此

session 对象

除了以上几种方法外,JSP 可以利用 Servlet 提供的 HttpSession 接口来识别一个用户,存储这个用户的所有访问信息

默认情况下,JSP 允许会话跟踪,一个新的 HttpSession 对象将会自动地为新的客户端实例化

禁止会话跟踪需要显式地关掉它,通过将 page 指令中 session 属性值设为 false 来实现

<%@ page session="false" %>

JSP 引擎会将隐含的 session 对象暴露给开发者,这样我们可以方便地存储或检索数据

session 对象的方法

方法 & 描述
public Object getAttribute(String name)
返回 session 对象中与指定名称绑定的对象,如果不存在则返回null
public Enumeration getAttributeNames()
返回 session 对象中所有的对象名称
public long getCreationTime()
返回 session 对象被创建的时间, 以毫秒为单位,从1970年1月1号凌晨开始算起
public String getId()
返回 session 对象的ID
public long getLastAccessedTime()
返回客户端最后访问的时间,以毫秒为单位,从1970年1月1号凌晨开始算起
public int getMaxInactiveInterval()
返回最大时间间隔,以秒为单位,servlet 容器将会在这段时间内保持会话打开
public void invalidate()
将session无效化,解绑任何与该session绑定的对象
public boolean isNew()
返回是否为一个新的客户端,或者客户端是否拒绝加入session
public void removeAttribute(String name)
移除session中指定名称的对象
public void setAttribute(String name, Object value)
使用指定的名称和值来产生一个对象并绑定到session中
public void setMaxInactiveInterval(int interval)
用来指定时间,以秒为单位,servlet容器将会在这段时间内保持会话有效

范例

下面的范例描述了如何使用 HttpSession 对象来获取创建时间和最后一次访问时间

如果 session 对象不存在,JSP 会为 request 对象关联一个新的 session 对象

session.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<%
   // 获取session创建时间
   Date createTime = new Date(session.getCreationTime());
   // 获取最后访问页面的时间
   Date lastAccessTime = new Date(session.getLastAccessedTime());

   String title = "再次访问简单教程";
   Integer visitCount = new Integer(0);
   String visitCountKey = new String("visitCount");
   String userIDKey = new String("userID");
   String userID = new String("ABCD");

   // 检测网页是否由新的访问用户
   if (session.isNew()){
      title = "访问简单教程";
      session.setAttribute(userIDKey, userID);
      session.setAttribute(visitCountKey,  visitCount);
   } else {
       visitCount = (Integer)session.getAttribute(visitCountKey);
       visitCount += 1;
       userID = (String)session.getAttribute(userIDKey);
       session.setAttribute(visitCountKey,  visitCount);
   }
%>
<!doctype html>
<meta charset="utf-8" />
<title>Session 跟踪 | JSP 基础教程 | 简单教程(www.twle.cn)</title>
<style>
table, th, td {
    border: 1px solid #ddd;
    border-spacing: 0;
    border-collapse: collapse;
    text-align: left;
}
th {height:32px;line-height: 32px}
th,td {padding:5px 10px;}
</style>
<p>Session 跟踪 | JSP 基础教程 | 简单教程(www.twle.cn)</p>
<table> 
<tr>
   <th>Session 信息</th>
   <th></th>
</tr> 
<tr>
   <td>id</td>
   <td><% out.print( session.getId()); %></td>
</tr> 
<tr>
   <td>创建时间</td>
   <td><% out.print(createTime); %></td>
</tr> 
<tr>
   <td>最后访问时间</td>
   <td><% out.print(lastAccessTime); %></td>
</tr> 
<tr>
   <td>用户 ID</td>
   <td><% out.print(userID); %></td>
</tr> 
<tr>
   <td>访问次数</td>
   <td><% out.print(visitCount); %></td>
</tr> 
</table> 

在浏览器上输入 http://localhost:8080/jsp/session.jsp 显示结果如下

没刷新一次,访问次数就会增长 1

删除 Session 会话数据

当 Servlet 完成了一个用户的 session 会话数据,有以下几种选择

  • 移除一个特定的属性
    调用 public void removeAttribute(String name) 方法来删除与特定的键相关联的值
  • 删除整个 session 会话
    调用 public void invalidate() 方法来丢弃整个 session 会话
  • 设置 session 会话过期时间
    调用 public void setMaxInactiveInterval(int interval) 方法来单独设置 session 会话超时
  • 注销用户
    如果使用的是支持 servlet 2.4 的服务器,您可以调用 logout 来注销 Web 服务器的客户端,并把属于所有用户的所有 session 会话设置为无效
  • web.xml 配置
    如果使用的是 Tomcat,除了上述方法,还可以在 web.xml 文件中配置 session 会话超时
        <session-config>
          <session-timeout>15</session-timeout>
        </session-config>
    

    上面实例中的超时时间是以分钟为单位,将覆盖 Tomcat 中默认的 30 分钟超时时间

    在一个 Servlet 中的 getMaxInactiveInterval() 方法会返回 session 会话的超时时间,以秒为单位

    所以,如果在 web.xml 中配置 session 会话超时时间为 15 分钟,那么 getMaxInactiveInterval() 会返回 900

JSP 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.