以下内容引用自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. 手机端左右滑动,不用写js(只有页面切换到移动端可以看)

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  2. Farseer.net轻量级ORM开源框架 V1.x 入门篇:新版本说明

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:没有了 下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置 前言 V1.x版本终于到来了.本次 ...

  3. spring 获取ApplicationContext

    第一种:获取根目录下的文件名 ApplicationContext ac = new ClassPathXmlApplicationContext("../mvc-dispatcher-se ...

  4. AttributeError: 'list' object has no attribute 'extends' && list详解

    拼写错误 是extend  而不是extends 出错demo: In [27]: c = [2,3] In [28]: c.extends([5]) ------------------------ ...

  5. JavaSE-12 面向对象程序设计的几条基础原则

    摘取代码中变化的行为,形成接口 在设计基类的时候,如果该类某个成员方法在子类中的实现变化差别比较大(一部分子类实现该方法是相同的),作为基类有两个问题:一是该方法不再通用:二是子类如果重写该方法,存在 ...

  6. Delphi新注释

    标准请看帮助文件里的:XML Documentation Comments 个人常用 <summary></summary>:摘要 /// <summary> // ...

  7. 怎样从SpringMVC返回json数据

    Srping3中配置 maven依赖pom.xml 需要jackson库的依赖 <dependency> <groupId>org.codehaus.jackson</g ...

  8. HDU - 2058 The sum problem(思路题)

    题目: Given a sequence 1,2,3,......N, your job is to calculate all the possible sub-sequences that the ...

  9. Visual Studio 2013/2015/2017快捷键(转载)

    本文为转载文章,原文:[心存善念]  [Fonour] 项目相关的快捷键 Ctrl + Shift + B = 生成项目 Ctrl + Alt + L = 显示 Solution Explorer(解 ...

  10. Spring接收web请求参数的几种方式

    1 查询参数 请求格式:url?参数1=值1&参数2=值2...同时适用于GET和POST方式spring处理查询参数的方法又有几种写法: 方法一:方法参数名即为请求参数名 // 查询参数1 ...