Servlet Session(HttpSession)对象详解

Session用于保存服务端与客户端“会话”的信息,它保存在服务端。每个客户端会有一个与之关联的Session,服务器会将Session的ID写到客户端的Cookies或者URL。如果客户端禁止Cookies了,服务器会将ID写到URL中。

机制

session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

1. 当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为 session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个 session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 session id将被在本次响应中返回给客户端保存。

2. 保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID,而。比如weblogic对于web应用程序生成的cookie,JSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是 JSESSIONID。

3. 由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面,附加方式也有两种,一种是作为URL路径的附加信息,表现形式为http://...../xxx;jsessionid= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,另一种是作为查询字符串附加在URL后面,表现形式为http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764, 这两种方式对于用户来说是没有区别的,只是服务器在解析的时候处理的方式不同,采用第一种方式也有利于把session id的信息和正常程序参数区分开来。为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。

方法

String getId()
返回一个包含分配给该 session 会话的唯一标识符的字符串。
Object getAttribute(String name)
返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null
Enumeration getAttributeNames()
返回 String 对象的Enumeration,String 对象包含所有绑定到该 session 会话的对象的名称。
void removeAttribute(String name)
从该 session 会话移除指定名称的对象。
void setAttribute(String name, Object value)
使用指定的名称绑定一个对象到该 session 会话
long getCreationTime()
返回该 session 会话被创建的时间,自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。
long getLastAccessedTime()
返回客户端最后一次发送与该 session 会话相关的请求的时间自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。
int getMaxInactiveInterval()
返回 Servlet 容器在客户端访问时保持 session 会话打开的最大时间间隔,以秒为单位
void setMaxInactiveInterval(int interval)
在 Servlet 容器指示该 session 会话无效之前,指定客户端请求之间的时间,以秒为单位。
void invalidate()
指示该 session 会话无效,并解除绑定到它上面的任何对象。
boolean isNew()
如果客户端还不知道该 session 会话,或者如果客户选择不参入该 session 会话,则该方法返回 true。

生命周期

1. 默认设置

<session-config>
        <session-timeout>10</session-timeout>
</session-config>

session中的属性的默认生命周期是30min,这个默认时间可以通过在Tomcat根目录\conf\web.xml文件中修改

2. 人工设置

session.setMaxInactiveInterval(60);

使用

1. 得到session

// 返回这个request绑定的session对象,如果没有,则创建一个
HttpSession session = request.getSession();
// 返回这个request绑定的session对象,如果没有,则根据create的值决定是否创建一个
HttpSession session = request.getSession(boolean create)

2. 向session中添加属性

session.setAttribute(String name,Object val);

3. session中得到某个属性

String value = session.getAttribute(String name);

4. session中删除某个属性

session.removeAttribute(String name);

例子

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException {
    // 如果不存在 session 会话,则创建一个 session 对象
    HttpSession session = request.getSession(true);
    // 获取 session 创建时间
    Date createTime = new Date(session.getCreationTime());
    // 获取该网页的最后一次访问时间
    Date lastAccessTime = new Date(session.getLastAccessedTime());

    //设置日期输出的格式  
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    String title = "Servlet Session 实例教程";
    Integer visitCount = new Integer(0);
    String visitCountKey = new String("visitCount");
    String userIDKey = new String("userID");
    String userID = new String("Runoob");

    // 检查网页上是否有新的访问者
    if (session.isNew()) {
        title = "Servlet Session 实例教程";
        session.setAttribute(userIDKey, userID);
    } else {
        visitCount = (Integer) session.getAttribute(visitCountKey);
        visitCount = visitCount + 1;
        userID = (String) session.getAttribute(userIDKey);
    }
    session.setAttribute(visitCountKey, visitCount);

    // 设置响应内容类型
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();

    String docType = "<!DOCTYPE html>\n";
    out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n" + "<h1 align=\"center\">" + title + "</h1>\n" + "<h2 align=\"center\">Session 信息</h2>\n" + "<table border=\"1\" align=\"center\">\n" + "<tr bgcolor=\"#949494\">\n" + "  <th>Session 信息</th><th>值</th></tr>\n" + "<tr>\n" + "  <td>id</td>\n" + "  <td>" + session.getId() + "</td></tr>\n" + "<tr>\n" + "  <td>创建时间</td>\n" + "  <td>" + df.format(createTime) + "  </td></tr>\n" + "<tr>\n" + "  <td>最后访问时间</td>\n" + "  <td>" + df.format(lastAccessTime) + "  </td></tr>\n" + "<tr>\n" + "  <td>用户 ID</td>\n" + "  <td>" + userID + "  </td></tr>\n" + "<tr>\n" + "  <td>访问统计:</td>\n" + "  <td>" + visitCount + "</td></tr>\n" + "</table>\n" + "</body></html>");
}

总结

1.session是存在服务器的内存中的,一个浏览器独享一个session域对象。 

2.session中可以存放多个属性,同时也可以存放对象 。

3.如果session设置的属性存在重名,则会替换为新的值。

4. 直接调用HttpSession的invalidate()方法可以使Session失效.

版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。