以下内容引用自http://wiki.jikexueyuan.com/project/servlet/session-tracking.html

HTTP是一种“无状态”协议,这意味着每次客户端检索Web页面时,客户端打开一个单独的连接到Web服务器,服务器不会自动保存之前客户端请求的任何记录。

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

一、Cookies

一个Web服务器可以分配一个唯一的会话ID作为每个Web客户端的Cookie,并且对于来自客户端的后续请求,它们可以使用已接收的Cookie来识别。

这可能不是一个有效的方法,因为很多时候浏览器不支持Cookie,所以我不建议使用这种方式来维持会话(由于年代问题,现在的浏览器全部都支持Cookie)。

二、隐藏的表单字段

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

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

该条目意味着,当表单被提交时,指定的名称和值会被自动包含在GET或POST数据中。每次当Web浏览器发送回请求时,session_id的值可以用于跟踪不同的Web浏览器。

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

三、URL重写

可以在每个标识会话的URL末尾追加一些额外的数据,且服务器会把该会话标识符与它已存储的有关会话的数据关联起来。

例如,http://jsoft.com/file.htm;sessionid=12345,会话标识符被附加为sessionid=12345,可能会在Web服务器端被访问来识别客户端。

URL重写是维持会话的一种更好的方式,当浏览器不支持Cookie时为浏览器工作,但是它的缺点是会动态的生成每个URL来分配会话ID,即使页面是简单的静态的HTML页面。

四、HttpSession对象

除了上述提到的三种方式,Servlet还提供了HttpSession接口,该接口提供了一种对网站的跨多个页面请求或访问的方法来识别用户并存储有关用户的信息。

Servlet容器使用这个接口来创建在HTTP客户端和HTTP服务器之间的会话。会话在一个指定的时间段内持续,跨多个连接或来自用户的请求。

可以通过调用HttpServletRequest的公共方法getSession()来获取HttpSession对象,如下所示:

HttpSession session = request.getSession();

在向客户端发送任何文档内容之前,需要调用request.getSession()。这里是一些重要方法的总结,这些方法通过HttpSession对象是可用的:

方法 描述

public Object getAttribute(String name)

该方法返回在该Session会话中具有指定名称的对象,如果没有指定名称的对象,则返回null。

public Enumeration getAttributeNames()

该方法返回String对象的枚举,String对象包含所有绑定到该Session会话的对象的名称。

public long getCreationTime()

该方法返回该Session 会话被创建的时间,自格林尼治标准时间1970年1月1日凌晨零点算起,以毫秒为单位。

public String getId()

该方法返回一个包含分配给该Session会话的唯一标识符的字符串。

public long getLastAccessedTime()

该方法返回客户端最后一次发送与该Session会话相关的请求的时间自格林尼治标准时间1970年1月1日凌晨零点算起,以毫秒为单位。

public int getMaxInactiveInterval()

该方法返回Servlet容器在客户端访问时保持Session会话打开的最大时间间隔,以秒为单位。

public void invalidate()

该方法指示该Session会话无效,并解除绑定到它上面的任何对象。

public boolean isNew()

如果客户端还不知道该Session会话,或者如果客户选择不参入该Session会话,则该方法返回true。

public void removeAttribute(String name)

该方法将从该Session会话移除指定名称的对象。

public void setAttribute(String name, Object value)

该方法使用指定的名称绑定一个对象到该Session会话。

public void setMaxInactiveInterval(int interval)

该方法在Servlet容器指示该Session会话无效之前,指定客户端请求之间的时间,以秒为单位。

五、会话跟踪实例

这个例子描述了如何使用HttpSession对象获取会话创建时间和上次访问的时间。如果不存在会话,将一个新的会话与请求联系起来。

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
// Extend HttpServlet class
public class SessionTrack extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
// Create a session object if it is already not created.
HttpSession session = request.getSession(true);
// Get session creation time.
Date createTime = new Date(session.getCreationTime());
// Get last access time of this web page.
Date lastAccessTime = new Date(session.getLastAccessedTime());
String title = "Welcome Back to my website";
Integer visitCount = new Integer(0);
String visitCountKey = new String("visitCount");
String userIDKey = new String("userID");
String userID = new String("ABCD");
// Check if this is new comer on your web page.
if (session.isNew()){
title = "Welcome to my website";
session.setAttribute(userIDKey, userID);
} else {
visitCount = (Integer)session.getAttribute(visitCountKey);
visitCount = visitCount + 1;
userID = (String)session.getAttribute(userIDKey);
}
session.setAttribute(visitCountKey, visitCount);
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " +
"transitional//en\">\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 Infomation</h2>\n" +
"<table border=\"1\" align=\"center\">\n" +
"<tr bgcolor=\"#949494\">\n" +
" <th>Session info</th><th>value</th></tr>\n" +
"<tr>\n" +
" <td>id</td>\n" +
" <td>" + session.getId() + "</td></tr>\n" +
"<tr>\n" +
" <td>Creation Time</td>\n" +
" <td>" + createTime +
" </td></tr>\n" +
"<tr>\n" +
" <td>Time of Last Access</td>\n" +
" <td>" + lastAccessTime +
" </td></tr>\n" +
"<tr>\n" +
" <td>User ID</td>\n" +
" <td>" + userID +
" </td></tr>\n" +
"<tr>\n" +
" <td>Number of visits</td>\n" +
" <td>" + visitCount + "</td></tr>\n" +
"</table>\n" +
"</body></html>");
}
}

配置web.xml:

    <servlet>
<servlet-name>SessionTrack</servlet-name>
<servlet-class>com.jsoft.testservletbasics.SessionTrack</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SessionTrack</servlet-name>
<url-pattern>/SessionTrack</url-pattern>
</servlet-mapping>

编译上述Servlet SessionTrack并在web.xml文件中创建适当的条目。在浏览器地址栏输入http://localhost:8080/SessionTrack,当第一次运行时将显示如下所示的结果:

现在尝试再次运行相同的Servlet,它将显示如下所示的结果:

六、删除会话数据

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

  • 移除一个特定的属性:可以调用public void removeAttribute(String name)方法来删除与特定的键相关联的值。

  • 删除整个会话:可以调用public void invalidate()方法来删除整个会话。

  • 设置会话超时:可以调用public void setMaxInactiveInterval(int interval)方法来单独设置会话超时。

  • 注销用户:支持Servlet 2.4的服务器,可以调用logout来注销Web服务器的客户端,并把属于所有用户的所有会话设置为无效。

  • web.xml配置:如果使用的是Tomcat,除了上述方法,还可以在web.xml文件中配置会话超时,如下所示:
<session-config>
<session-timeout>15</session-timeout>
</session-config>

超时时间是以分钟为单位的,并覆盖了Tomcat中默认的30分钟的超时时间。

Servlet中的getMaxInactiveInterval()方法为会话返回的超时时间是以秒为单位的。所以如果在web.xml中配置会话超时时间为15分钟,那么getMaxInactiveInterval()会返回900。

测试工程:https://github.com/easonjim/5_java_example/tree/master/servletbasics/test9

Servlet的会话(Session)跟踪的更多相关文章

  1. Servlet——理解会话Session

    1.什么是会话(Session) 超文本传输协议(HTTP)被设计成一种无状态的协议. 所谓无状态协议就是指在服务器端的请求彼此相互之间是不认识彼此的,哪怕是来自同一个客户端的请求,相互之间也是不认识 ...

  2. JavaWeb:Cookie处理和Session跟踪

    JavaWeb:Cookie处理和Session跟踪 Cookie处理 什么是Cookie Cookie 是存储在客户端计算机上的文本文件,保留了各种跟踪信息.因为HTTP协议是无状态的,即服务器不知 ...

  3. 前端学PHP之会话Session

    前面的话 Session技术和Cookie相似,都是用来储存使用者的相关资料.但最大的不同之处在于Cookie是将数据存放在客户端的计算机之中,而Session则是将数据存放于服务器系统之下.Sess ...

  4. jfc在jsp页面画图,不将图片存在服务器端,只存入会话session(可用)

    jfc在jsp页面画图,不将图片存在服务器端,只存入会话session.其中主要用到jfc的一个servlet类. <%@ page contentType="text/html;ch ...

  5. 使用SpringSession管理分布式系统的会话Session

    在我方供应链项目分布式部署的环境下,需要在统一网关服务中管理访问的Session,即无论访问请求路由到哪一个网关服务环境,使用的都是相同的HttpSession,这样就保证了在用户登录之后,能够使用统 ...

  6. 简单PHP会话(session)说明

    现在程序员愈发的不容易了,想要精通,必然要寻本溯源,这其实与目前泛滥的愈发高级的语言以及众多的框架刚好相反,因为它们在尽可能的掩盖本源使其简单,个人称之为程序员学习悖论. 注:作者接触web开发和ph ...

  7. http 会话(session)详解

    会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制 一.查看session id 可利用相关工具,比如firebug,httpwatc ...

  8. Tensorflow会话Session

    转载自: http://blog.csdn.net/Hanging_Gardens/article/details/72784392 https://www.cnblogs.com/hypnus-ly ...

  9. 网络基础 http 会话(session)详解

    http 会话(session)详解 by:授客 QQ:1033553122 会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制 一. ...

  10. Java通过遍历sessionId获取服务器所有会话session

    Servlet2.1之后不支持SessionContext里面getSession(String id)方法,也不存在遍历所有会话Session的方法.但是,我们可以通过HttpSessionList ...

随机推荐

  1. 461在全志r16平台tinav3.0系统下使用地磁计QMC5883L

    461在全志r16平台tinav3.0系统下使用地磁计QMC5883L 2018/9/7 14:08 版本:V1.0 开发板:SC3817R SDK:tina v3.0 (基本确认全志tina v3. ...

  2. 图解 TCP/IP 第六章 TCP与UDP 笔记6.1 传输层的作用

     图解 TCP/IP  第六章 TCP与UDP   笔记6.1 传输层的作用   传输层必须指出这个具体的程序,为了实现这一功能,使用端口号这样一种识别码.根据端口号,就可以识别在传输层上一层的应用程 ...

  3. 源代码管理git的使用

    Git ----本地仓库---- 1.新建一个“本地仓库” git init 2.配置仓库 ①告诉git你是谁 git config user.name syl ②告诉git怎么联系你 git con ...

  4. 【PostgreSQL-9.6.3】进程及体系结构

    本文主要讲述了PG的几个主要进程,以及PG的核心架构.进程和体系结构详见下图: 从上面的体系结构图可以看出来,PG使用经典的C/S架构,进程架构.在服务器端有主进程.服务进程.子进程.共享内存以及文件 ...

  5. 迅为嵌入式开发板iTOP-6818开发板八核Cortex-A53架构,满足各种产品需求

    性价比更高 内存:1G(可选2G);存储:16G;4418:四核 Cortex-A9;6818:八核Cortex-A53. 功能更强 板载4G(全网通),GPS,WIFI,千兆以太网,重力加速度计等, ...

  6. windos快捷键

    F1帮助 F2改名 F3搜索 F4地址 F5刷新 F6切换 F10菜单 CTRL+A全选 CTRL+C复制 CTRL+X剪切 CTRL+V粘贴 CTRL+Z撤消 CTRL+O打开 SHIFT+DELE ...

  7. windows sdk 设置窗体透明

    #define WINVER 0x0501 #include <windows.h> /* Declare Windows procedure */ LRESULT CALLBACK Wi ...

  8. 认识单文件组件.vue 文件

    vuejs 自定义了一种.vue文件,可以把html, css, js 写到一个文件中,从而实现了对一个组件的封装, 一个.vue 文件就是一个单独的组件.由于.vue文件是自定义的,浏览器不认识,所 ...

  9. JavaSE-09 继承

    学习要点 继承的优点和实现 子类重写父类方法 继承下构造方法的执行过程 抽象类和抽象方法的使用 final修饰属性.方法和类 继承的优点和实现 宠物管理系统优化设计 宠物管理系统中的类有什么问题? 使 ...

  10. How To:利用frm和idb文件进行数据恢复.txt

    在另外一个机器上准备测试数据,并传输到dbadb05机器的/mysql/backup/reco/位置下.开始尝试恢复数据一.使用mysqlfrm获取表结构信息及DDL语句. [mysql@dbadb0 ...