JSP的会话(Session)跟踪

以下内容引用自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

时间: 2024-10-21 23:03:21

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

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

jfc在jsp页面画图,不将图片存在服务器端,只存入会话session.其中主要用到jfc的一个servlet类. <%@ page contentType="text/html;charset=gb2312" errorPage="../common/error.jsp" %> <%@ page import="dqz.jsp.*" %> <%@ page import="java.sql.*"

【JSP/Servlet-HTTP会话解析】

个人学习整理,如有不足之处,请不吝指教.转载请注明:@CSU-Max Max之前的一篇关于Session 和 Cookie 的文章:cookie和session那些事 会话简介 web服务器跟踪客户状态的几种方式: 1.在html表单中加入隐藏字段,它包含用于跟踪用户状态的数据: 2.重写URL,及在URL中附带用户的状态信息: 3.使用cookie来传递用于跟踪客户状态的数据: 4.使用会话来跟踪用户状态的数据. 会话能够把用户与同一用户发出的不同请求之间关联起来.不同用户的会话应当是相互独立

Android -- 与WEB交互在同一个会话Session中通信

Session与Cookie Cookie和Session都为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决HTTP无状态的问题而所做的努力. Session可以用Cookie来实现,也可以用URL回写的机制来实现. Cookie和Session有以下明显的不同点: 1)Cookie将状态保存在客户端,Session将状态保存在服务器端: 2)Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器.网络服务器用HTTP头向客户端发送cookies,在客户

http 会话(session)详解

会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制 一.查看session id 可利用相关工具,比如firebug,httpwatch等查看会话id 以下是访问某个网站页面(记为页面1)的http请求头信息 从上图可看到,访问页面1时的session id为 abcmiPGuZcZTqaNNnLUHu 以下是访问另一个网站的页面(记为页面2)的http请求头信息 从上图可看到,访问页面2时的session id为:b035123

servlet session跟踪实践

一.session简介 1.session概念 Session代表服务器与浏览器的一次会话过程.因为http是无状态的协议,所以,浏览器与服务器的会话过程是断断续续的.在servlet中,session指的是HttpSession对象. 浏览器第一次发出请求时,服务器创建session并生成一个sessionID.然后返回给浏览器.此时查看浏览器的cookie,会发现会有一个: Cookie:JSESSIONID=sessionID 浏览器再次发出请求时,会携带该cookie,服务器就可以根据s

JSP中,EL表达式向session中取出一个attribute和JSP脚本访问session取出一个attribute,写法有何不同?(转自百度知道)

EL表达式使用起来会更简洁,假如session中有一个属性A(attrA),那么EL和jsp脚本取值的方式如下: EL表达式:${ sessionScope.attrA } JSP脚本:<%=session.getAttribute("attrA")%>个人还是觉得EL表达式比较简便一些,毕竟当初apache设计EL表达式的初衷就是为了用EL表达式来减少JSP脚本的编写.

MyBatis之会话Session原理

MyBatis 之会话 Session 执行逻辑 1.SQL 会话工厂构建器类 SqlSessionFactoryBuilder 的 build 方法用于构建 SqlSessionFactory 类的实例: 2.SQL 会话工厂类的实例用于创建 Sql 会话 SqlSession 的实例: 3.SQL 会话 SqlSession 用于执行具体的 CURD 操作,其类似于 JDBC 中的连接类 Connection: 4.SQL 会话模板 SqlSessionTemplate 是 MyBatis

简单PHP会话(session)说明

现在程序员愈发的不容易了,想要精通,必然要寻本溯源,这其实与目前泛滥的愈发高级的语言以及众多的框架刚好相反,因为它们在尽可能的掩盖本源使其简单,个人称之为程序员学习悖论. 注:作者接触web开发和php两周左右,以下内容适合初学者. 1.导读 从文题目看,<简单PHP会话(Session)说明> 是已经圈定了本文的内容范围,试图阐明Session(文中对会话称为Session) 在PHP语言中是如何实现以及使用的,重点在于基本理解后的使用. 文章思路是首先搞清楚session是什么东西,Ses

jsp中的session

Jsp的session是使用bean的一个生存期限,一般为page,session意思是在这个用户没有离开网站之前一直有效,如果无法判断用户何时离开,一般依据系统设定,tomcat中设定为30分钟. 我们使用session功能,可以达到多个jsp程序从操作同一个java bean,那么这个java bean可以作为我们传统意义上的"全局变量池".(在java中我们可以使用static静态化一个变量和方法,使用singleton唯一化对象.) 在项目实践中,我们Jsp程序中很多参数需要从

Oracle数据库的连接模式connection Mode、连接connection与会话session

数据库的连接模式Connection Mode: Dedicated Server Mode(专有模式) 当用户发出请求时,如远程的client端通过监听器连接数据库上,ORACLE的服务器端会启用一个进程来响应,ORACLE端进程和Client端进程通信组成一个会话,ORACLE进程帮用户发出SQL语句,将结果返回给用户. 一对一,一个用户进程对应一个服务器进程,响应很快,但如果用户比较多,数据库压力比较大. Share Server Mode 共享服务模式,通过一个分发起,把用户的请求发给服