Servlet的会话(Session)跟踪
以下内容引用自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)跟踪的更多相关文章
- Servlet——理解会话Session
1.什么是会话(Session) 超文本传输协议(HTTP)被设计成一种无状态的协议. 所谓无状态协议就是指在服务器端的请求彼此相互之间是不认识彼此的,哪怕是来自同一个客户端的请求,相互之间也是不认识 ...
- JavaWeb:Cookie处理和Session跟踪
JavaWeb:Cookie处理和Session跟踪 Cookie处理 什么是Cookie Cookie 是存储在客户端计算机上的文本文件,保留了各种跟踪信息.因为HTTP协议是无状态的,即服务器不知 ...
- 前端学PHP之会话Session
前面的话 Session技术和Cookie相似,都是用来储存使用者的相关资料.但最大的不同之处在于Cookie是将数据存放在客户端的计算机之中,而Session则是将数据存放于服务器系统之下.Sess ...
- jfc在jsp页面画图,不将图片存在服务器端,只存入会话session(可用)
jfc在jsp页面画图,不将图片存在服务器端,只存入会话session.其中主要用到jfc的一个servlet类. <%@ page contentType="text/html;ch ...
- 使用SpringSession管理分布式系统的会话Session
在我方供应链项目分布式部署的环境下,需要在统一网关服务中管理访问的Session,即无论访问请求路由到哪一个网关服务环境,使用的都是相同的HttpSession,这样就保证了在用户登录之后,能够使用统 ...
- 简单PHP会话(session)说明
现在程序员愈发的不容易了,想要精通,必然要寻本溯源,这其实与目前泛滥的愈发高级的语言以及众多的框架刚好相反,因为它们在尽可能的掩盖本源使其简单,个人称之为程序员学习悖论. 注:作者接触web开发和ph ...
- http 会话(session)详解
会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制 一.查看session id 可利用相关工具,比如firebug,httpwatc ...
- Tensorflow会话Session
转载自: http://blog.csdn.net/Hanging_Gardens/article/details/72784392 https://www.cnblogs.com/hypnus-ly ...
- 网络基础 http 会话(session)详解
http 会话(session)详解 by:授客 QQ:1033553122 会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制 一. ...
- Java通过遍历sessionId获取服务器所有会话session
Servlet2.1之后不支持SessionContext里面getSession(String id)方法,也不存在遍历所有会话Session的方法.但是,我们可以通过HttpSessionList ...
随机推荐
- Unity笔记(4)自学第六天
今天主要是写了demo的策划案 [关卡设计部分]: [关卡数值设计]:
- 番茄花园Ghost Win10系统X64位10041装机版2015年4月
转载:系统妈,系统下载地址:http://www.xitongma.com/windows10/2015-04-01/6639.html 番茄花园Ghost Win10系统X64位10041装机版20 ...
- 浅谈2015新版 U-Boot
过了挺长一断时间没有看U-BOOT了,这两天下载了新版的UBOOT源码(之前看的一些书都是基于早好多年的源码来讲述,总感觉心里有点不对劲,也许是我比较喜新的原因吧,不过小弟我并没有厌旧哈),好了不多扯 ...
- Jmeter中之各种乱码问题解决方案
一.Jmeter中之请求乱码问题 如果你参数化的数据是中文,那么应该怎么解决这个问题呢? 1.在脚本的参数接设置数据的接收编码为UTF-8,如下图,这里只保证请求参数的不乱码. 2.从本地txt文件中 ...
- eureka 注册中心
1.eureka版本更新后,pom依赖名称变化 v1.2.7spring-cloud-starter-eureka-server v2.0.0spring-cloud-starter-netflix- ...
- sql中递归查询
with AA as ( select * from tb_ClientBranch_Category where BRANCH_MOM_NAME='北京易华录信息技术股份有限公司' union al ...
- 获取select标签选中的值的三种方式
var obj = document.getElementByIdx_x(”testSelect”); //定位id var index = obj.selectedIndex; // 选中索引 va ...
- ansible相关说明
2.ansible相关说明 2.1.ansible相关命令 ansible:定义并运行简单任务,主要执行ad-hoc命令 ansible-config:查看.编辑.管理ansible配置 ansibl ...
- 面向UI编程思想
UI编程思想: 模块化+组合 模块化是分解: 组合是合成: https://www.cnblogs.com/feng9exe/p/11044134.html
- 【C语言】控制台窗口图形界面编程(六):光标设置
目录 00. 目录 01. CONSOLE_CURSOR_INFO结构 02. GetConsoleCursorInfo函数 03. SetConsoleCursorInfo函数 04. SetCon ...