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

会话(Session)

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

Web客户端和Web服务器之间的会话有以下几种方式:

一、Cookies

网络服务器可以为每个Web客户端和使用已接收的Cookie可识别的来自客户端的后续请求分配一个唯一的会话ID作为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服务器访问来识别客户端。

当它们不支持Cookie时,URL重写是维持会话和适用于浏览器的一个更好的方法,但缺点是尽管页面是简单的静态HTML页面,但需要动态的生成每个URL来分配一个会话ID。

四、会话对象

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

默认情况下,JSP为每个新的客户端自动的启用会话跟踪和一个新的被实例化的HttpSession对象。禁用会话跟踪需要通过设置页面指令会话属性为false显式地关闭它,如下所示:

<%@ page session="false" %>

JSP引擎通过隐式的Session对象暴露了HttpSession对象给JSP开发人员。由于会话对象已经提供给JSP程序员,程序员可以立即从对象中开始存储和检索数据,不需要任何初始化或getSession()。

这是会话对象的可用的重要方法的一个总结:

方法  描述
public Object getAttribute(String name) 该方法返回会话中与指定的名称绑定的对象,如果没有绑定对象名称,返回null。
public Enumeration getAttributeNames() 该方法返回一个字符串对象的枚举,其中包含绑定到这个会话的所有对象的名字。
public long getCreationTime() 该方法返回创建会话的时间,自GMT时间1970年1月1日凌晨以来,以毫秒为单位。
public String getId() 该方法返回一个字符串,其中包含分配给这个会话的唯一标识符。
public long getLastAccessedTime() 该方法返回上次客户端发送与这个会话相关的请求的时间,自GMT时间1970年1月1日凌晨以来,毫秒的数量。
public int getMaxInactiveInterval() 该方法返回最大时间间隔,以秒为单位,Servlet容器在客户端访问中将打开这个会话。
public void invalidate() 这个方法使会话无效并解除全部绑定到该会话的对象。
public boolean isNew() 如果客户端还不知道会话或如果客户选择不加入会话,这个方法返回true。
public void removeAttribute(String name) 该方法从会话中删除制定名称的绑定对象。
public void setAttribute(String name, Object value)  该方法使用指定的名称解除会话的一个对象。
public void setMaxInactiveInterval(int interval) 在Servlet容器使这个会话无效之前,这种方法在客户端请求之间指定了时间,以秒为单位。

五、会话跟踪示例

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

<%@ page import="java.io.*,java.util.*" %>
<%
// 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);
session.setAttribute(visitCountKey, visitCount);
}
visitCount = (Integer)session.getAttribute(visitCountKey);
visitCount = visitCount + 1;
userID = (String)session.getAttribute(userIDKey);
session.setAttribute(visitCountKey, visitCount);
%>
<html>
<head>
<title>Session Tracking</title>
</head>
<body>
<center>
<h1><%= title %></h1>
</center>
<table border="1" align="center">
<tr bgcolor="#949494">
<th>Session info</th>
<th>Value</th>
</tr>
<tr>
<td>id</td>
<td><% out.print( session.getId()); %></td>
</tr>
<tr>
<td>Creation Time</td>
<td><% out.print(createTime); %></td>
</tr>
<tr>
<td>Time of Last Access</td>
<td><% out.print(lastAccessTime); %></td>
</tr>
<tr>
<td>User ID</td>
<td><% out.print(userID); %></td>
</tr>
<tr>
<td>Number of visits</td>
<td><% out.print(visitCount); %></td>
</tr>
</table>
</body>
</html>

现在将上述代码添加到main.jsp中并尝试访问 http://localhost:8080/main.jsp。当第一次运行时将会出现如下所示的结果:

现在尝试第二次运行相同的JSP,将会出现如下所示的结果。

六、删除会话数据

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

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

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

  • 设置会话超时:可以调用public void setMaxInactiveInterval(int interval)方法分别为每个会话设置超时。

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

  • 重启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/jspbasics/test10

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

  1. JSP基础--会话跟踪技术、cookie、session

    会话跟踪技术 1 什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而10 ...

  2. Javaweb学习笔记——(十一)——————JSP、会话跟踪、Cookie、HttpSession

    JSP1.什么是JSP jsp即java server pages,它是Javaweb的动态资源. jsp = html + java脚本 + jsp动态标签(包含EL表达式)2.JSP中java脚本 ...

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

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

  4. JSP页面退出时清除会话Session

    我们用一个quit.jsp来处理用户退出系统的操作,quit.jsp负责注销session,及时释放资源. 注销session. 关闭浏览器窗口. 其代码如下所示: <%@ page conte ...

  5. http 会话(session)详解

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

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

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

  7. 前端学PHP之会话Session

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

  8. JavaWeb:Cookie处理和Session跟踪

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

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

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

  10. Tensorflow会话Session

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

随机推荐

  1. vue项目开发前的es6的知识储备

    let命令 学习笔记 1.let所声明的变量,只在let命令所在的代码块内有效. 2.不存在变量提升:所声明的变量一定要在声明后使用,否则报错. 一定要先声明,再去使用.let x=x;这样就是错误的 ...

  2. js阻塞ui进程涉及的知识点整理

    项目进行中遇到了同步ajax阻塞ui线程阻塞的问题,原因是执行两个同步ajax请求为一次完整的方法,因业务需求需要循环执行这个方法,检查后台返回的数据正确,但是由于ajax请求时间过长,考虑增加遮罩层 ...

  3. Android(java)学习笔记195:ContentProvider使用之添加数据到联系人(掌握)

    1.添加联系人逻辑思路 (1)首先在raw_contacts创建一个新的id (2)在data表里面添加这个id对应的数据 2.下面通过一个案例,说明一下如何添加一条数据到联系人: (1)首先我们关注 ...

  4. BZOJ1079: [SCOI2008]着色方案 (记忆化搜索)

    题意:有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块. 所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个木块涂相同色显得很 ...

  5. java混淆工具Jocky和Proguard

    java混淆工具有很多种,这里介绍Jocky和Proguard 一:Jocky是金蝶中间件技术领袖袁红岗先生的个人作品(旧有名称JOC).原本是方便Apusic 应用服务器的开发,现在开放出来,供大家 ...

  6. BZOJ 2039 人员雇佣 二元关系 最小割

    题面太长了,请各位自行品尝—>人员雇佣 分析: 借用题解的描述: a.选择每个人有一个代价Ai b.如果有两个人同时选择就可以获得收益Ei,j c.如果一个人选择另一个不选会产生代价Ei,j 这 ...

  7. BZOJ 4695 最假女选手 线段树

    题意: 给定一个长度为 N序列,编号从1 到 N.要求支持下面几种操作: 1.给一个区间[L,R] 加上一个数x  2.把一个区间[L,R] 里小于x 的数变成x  3.把一个区间[L,R] 里大于x ...

  8. 笔试算法题(42):线段树(区间树,Interval Tree)

    议题:线段树(Interval Tree) 分析: 线段树是一种二叉搜索树,将一个大区间划分成单元区间,每个单元区间对应一个叶子节点:内部节点对应部分区间,如对于一个内部节点[a, b]而言,其左子节 ...

  9. 如何在 CentOS 7 上生成 SSL 证书为 Nginx 加密

    本文首发:开发指南:如何在 CentOS 7 上安装 Nginx Let’s Encrypt 是由 Internet Security Research Group (ISRG) 开发的一个自由.自动 ...

  10. Python之Pycharm安装及介绍

    在学习Python之前,先安装好编程所需的编译环境也就是IDE,在安装PycharPm之前先安装最新版本的anaconda根据不同的系统选择不同的版本,安装好anaconda以后再安装Pycharm, ...