在本章中,我们将讨论jsp中的会话跟踪。 http是一种“无状态”协议,这意味着每次客户端检索一个web页面时,客户机打开与web服务器的单独连接,并且服务器自动不保留先前客户端请求的任何记录。
维护web客户端与服务器之间的会话
现在来讨论几个用来维护web客户机和web服务器之间会话的方式 -
1.cookies
网络服务器可以将唯一的会话id作为cookie分配给每个web客户端,并为客户端提供后续请求,并使用接收到的cookie进行识别。
这可能不是有效的方式,因为浏览器有时不支持cookie。不建议使用此过程来维护会话。
2.隐藏表单字段
web服务器可以发送隐藏的html表单域以及唯一的会话id,如下所示:
<input type = "hidden" name = "sessionid" value = "123456">
当提交表单时,指定的名称和值将自动包含在get或post数据中。 每次web浏览器发送请求时,session_id值都可以用于跟踪不同的web浏览器。
这可以是跟踪会话的有效方法,但点击常规(<a href="...">)超文本链接不会产生表单提交,因此隐藏表单字段也不能支持常规会话跟踪。
3.网址重写
可以在每个网址的末尾附加一些额外的数据。该数据标识会话; 服务器可以将该会话标识符与其关于该会话存储的数据相关联。
例如,使用url:http://www.51frw.cn/file.html;sessionid=123456789,会话标识符作为sessionid=123456789附加,可以在web服务器上访问以识别客户端。
url重写是一种更好的方法来维护会话,并且在浏览器不支持cookie时可以使用它们。 这里的缺点是,必须动态生成每个url来分配会话id,而页面是一个简单的静态html页面。
4.session对象
除了上述选项之外,jsp还使用了提供httpsession接口的servlet。该接口提供了一种识别用户的方法。
- 一个页请求或
- 访问网站或
- 存储有关该用户的信息
默认情况下,jsp启用会话跟踪,并为每个新客户端自动实例化一个新的httpsession对象。 禁用会话跟踪需要通过将页面指令会话属性设置为false来明确地将其关闭,如下所示:
<%@ page session = "false" %>
jsp引擎通过隐式会话对象将httpsession对象公开给jsp程序员。由于会话对象已经提供给jsp程序员,程序员可以立即开始从对象中存储和检索数据,而无需任何初始化或getsession()。
以下是session对象提供的重要方法列表 -
编号 语法 描述| 1 | public object getattribute(string name) | 此方法返回在此会话中用指定名称绑定的对象,如果在名称下没有绑定对象,则返回null。 |
| 2 | public enumeration getattributenames() | 此方法返回一个包含绑定到此会话的所有对象的名称的string对象枚举。 |
| 3 | public long getcreationtime() | 此方法返回创建此会话的时间,以1970年1月1日gmt格林尼治时间以来的毫秒为单位。 |
| 4 | public string getid() | 此方法返回一个包含分配给此会话的唯一标识符的字符串。 |
| 5 | public long getlastaccessedtime() | 此方法返回客户端上次发送与此会话相关联的请求的时间,为1970年1月1日gmt以来的毫秒数。 |
| 6 | public int getmaxinactiveinterval() | 此方法返回servlet容器在客户端访问之间保持此会话的最长时间间隔(以秒为单位)。 |
| 7 | public void invalidate() | 此方法使该会话无效,并取消绑定绑定到该对象的任何对象。 |
| 8 | public boolean isnew() | 如果客户端还不知道会话或者客户端选择不加入会话,则此方法返回true。 |
| 9 | public void removeattribute(string name) | 此方法从此会话中删除与指定名称绑定的对象。 |
| 10 | public void setattribute(string name, object value) | 此方法使用指定的名称将对象绑定到此会话。 |
| 11 | public void setmaxinactiveinterval(int interval) | 此方法指定在servlet容器将使此会话无效之前,客户端请求之间的时间(以秒为单位)。 |
会话跟踪示例
此示例介绍如何使用httpsession对象来查找会话的创建时间和最后访问的时间。如果尚不存在,会将新建会话与请求相关联。
打开eclipse,创建一个动态web项目:sessiontracking, 其目录结构如下所示 -
创建一个jsp文件:index.jsp,如下代码 -
<%@ page language="java" contenttype="text/html; charset=utf-8"
pageencoding="utf-8"%>
<%@ page import="java.io.*,java.util.*"%>
<%
// get session creation time.
date createtime = new date(session.getcreationtime());
// get last access time of this webpage.
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 webpage.
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);
%>
<!doctype html public "-//w3c//dtd html 4.01 transitional//en" "http://www.w3.org/tr/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>session会话跟踪示例</title>
</head>
<body>
<div style="margin: auto; width: 80%;">
<center>
<h2>
session会话跟踪示例
</h1>
</center>
<table border="1" align="center">
<tr bgcolor="#949494">
<th>会话信息</th>
<th>值</th>
</tr>
<tr>
<td>id</td>
<td>
<%
out.print(session.getid());
%>
</td>
</tr>
<tr>
<td>创建时间</td>
<td>
<%
out.print(createtime);
%>
</td>
</tr>
<tr>
<td>最近一次访问时间</td>
<td>
<%
out.print(lastaccesstime);
%>
</td>
</tr>
<tr>
<td>用户id</td>
<td>
<%
out.print(userid);
%>
</td>
</tr>
<tr>
<td>访问次数</td>
<td>
<%
out.print(visitcount);
%>
</td>
</tr>
</table>
</div>
</body>
</html> 编写完成上面代码后,部署项目然后运行,打开浏览器尝试访问:http://localhost:8080/sessiontracking/ 。将看到以下结果 -
现在尝试再次运行(刷新)相同的jsp页面,可以看到访问次数更新为2,如下图所示 -
删除会话数据
完成用户的会话数据后,有几个方式用来删除会话信息 -
- 删除一个指定的属性 - 可以调用public void removeattribute(string name)方法来删除与特定键相关联的值。
- 删除整个会话信息 - 可以调用public void invalidate()方法来删除(丢弃)整个会话信息。
- 设置会话超时 - 可以调用public void setmaxinactiveinterval(int interval)方法来单独设置会话的超时。
- 注销登录用户 - 支持servlets 2.4的服务器,可以调用注销将客户端记录在web服务器之外,并使属于用户的所有会话失效。
- web.xml配置 - 如果使用的是tomcat,除了上述方法外,还可以在web.xml文件中配置会话超时,如下所示-
<session-config> <session-timeout>15</session-timeout> </session-config>
<session-timeout>指定超时表示的时间单位为分钟,上面配置示例将覆盖tomcat中30分钟的默认超时。
servlet中的getmaxinactiveinterval()方法以秒为单位返回该会话的超时时间。 因此,如果会话在web.xml中配置了15分钟,那么getmaxinactiveinterval()方法将返回900秒。
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!