JSP session对象详解

Session对象是用来分别保存每一个用户信息的对象,以便于跟踪用户的操作状态.它保存在服务端,Session的ID保存在客户机的Cookie中.

机制

session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为 session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个 session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 session id将被在本次响应中返回给客户端保存。

保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID,而。比如weblogic对于web应用程序生成的cookie,JSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是 JSESSIONID。

由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面,附加方式也有两种:

1. 作为URL路径的附加信息,表现形式为http://...../xxx;jsessionid= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764

2. 作为查询字符串附加在URL后面,表现形式为http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764

这两种方式对于用户来说是没有区别的,只是服务器在解析的时候处理的方式不同,采用第一种方式也有利于把session id的信息和正常程序参数区分开来。

作用域

session作用于HTTP会话开始到结束这段时间。

session的开始容易判断(浏览器发出第一个HTTP请求即可认为会话开始), 但结束就不好判断了(因为浏览器关闭时不会通知服务器“我关了,会话可以结束了”), 所以只能通过这种方法判断:如果一定的时间内客户端没有反应,则认为会话结束。 Tomcat的默认值为120分钟,但这个值也可以通过 HttpSession 的 setMaxInactiveInterval() 方法来设置。

方法

public boolean isNew()
返回是否为一个新的客户端,或者客户端是否拒绝加入session

public void invalidate()
将session无效化,解绑任何与该session绑定的对象

public Enumeration getAttributeNames()
返回Session对象中存储的每一个属性对象,其结果为一个类举的实例.

public long getCreationTime()
返回session对象被创建的时间, 以毫秒为单位,最小单位为千分之一秒,从1970年1月1号凌晨开始算起

public String getId()
此方法返回惟一的标识,这些标识为每个Session而产生.当只有一个单一的值与一个Session联合时,或当日志信息与先前的Session有关时,它被当做键名用.

public long getLastAccessedTime()
返回客户端最后访问的时间,以毫秒为单位,最小单位为千分之一秒,从1970年1月1号凌晨开始算起

public void setMaxInactiveInterval(int interval)
用来指定时间,以秒为单位,servlet容器将会在这段时间内保持会话有效

public int getMaxInactiveInterval()
返回最大时间间隔,以秒为单位,servlet 容器将会在这段时间内保持会话打开,负值表示Session永远不会超时

public void setAttribute(String name, Object value) 
使用指定的名称和值来产生一个对象并绑定到session中

public Object getAttribute(String name)
返回session对象中与指定名称绑定的对象,如果不存在则返回null

public void removeAttribute(String name)
移除session中指定名称的对象

删除Session数据

1. 移除一个特定session属性

调用public void removeAttribute(String name)  方法来移除指定的属性。

2. 删除整个会话

调用public void invalidate() 方法来使整个session无效。

3. 设置会话有效期

调用 public void setMaxInactiveInterval(int interval)  方法来设置session超时。

4. 退出登录

支持servlet2.4版本的服务器,可以调用 logout()方法来登出用户,并且使所有相关的session无效。

5. 设置服务器的超时时间,自动删除session

如果使用的是Tomcat,可以向下面这样配置web.xml文件:<session-config>    <session-timeout>15</session-timeout>  </session-config> 超时以分钟为单位,Tomcat中的默认的超时时间是30分钟。

例子

1. JSTL标签获取Session

session.setAttribute("age","123");  
${ sessionScope.age}  在页面上显示的就是123了  

sessionScope指的是session的范围,类似还有requestScope,pageScope,contextScope  
然后后面的age表示的是set属性时的key值  

2. Jsp中获取Session

session是jsp的内置对象,所以你可以直接写在jsp的  
<%  
session.setAttribute("a",  b);  //把b放到session里,命名为a,  
String M = session.getAttribute(“a”).toString(); //从session里把a拿出来,并赋值给M  
%>  

3. 使用HttpSession对象来获取创建时间和最后一次访问时间

<%@ page import="Java.io.*,java.util.*" %>
  <% 
  // 获取session创建时间 Date createTime=n ew Date(session.getCreationTime());
// 获取最后访问页面的时间 Date lastAccessTime=n ew Date(session.getLastAccessedTime());
String title = "Welcome Back to my website";
Integer visitCount = n ew Integer(0);
String visitCountKey = n ew String("visitCount");
String userIDKey = n ew String("userID");
String userID = n ew String("ABCD"); // 检测网页是否由新的访问用户
if (session.isNew()) {
    title = "Welcome to my website";
    session.setAttribute(userIDKey, userID);
    session.setAttribute(visitCountKey, visitCount);
}
visitCount = (Integer) session.getAttribute(visitCountKey);
visitCount = v isitCount + 1;
userID = (String) session.getAttribute(userIDKey);
session.setAttribute(visitCountKey, visitCount);
  %>
<html>
<body>
<h1>Session Tracking</h1>
<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> 

第一次运行时将会得到如下结果:

jsp session例子运行结果

再次访问,第二次运行时将会得到如下结果:

jsp session例子运行结果

总结

1. 由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。 

2. session机制本身并不复杂,然而其实现和配置上的灵活性却使得具体情况复杂多变。这也要求我们不能把仅仅某一次的经验或者某一个浏览器,服务器的经验当作普遍适用的经验,而是始终需要具体情况具体分析.

版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。