JSP_session会话跟踪
程序员文章站
2022-03-14 23:47:14
...
JSP_session会话跟踪
- HTTP是一种“无状态”协议,这意味着每次客户端检索一个Web页面时,客户机打开与Web服务器的单独连接,并且服务器自动不保留先前客户端请求的任何记录。
web客户端于服务器之间的会话
cookie
- 网络服务器可以将唯一的会话ID作为cookie分配给每个Web客户端,并为客户端提供后续请求,并使用接收到的cookie进行识别。
- 但是浏览器有时候并不支持
cookie
隐藏表单字段:
- web服务器可以发送隐藏的html表单域以及唯一的会话ID:
<input type = "hidden" name = "sessionid" value = "123456">
, - 当提交表单时,指定的名称和值将自动包含在
GET或POST
数据中。 每次Web浏览器发送请求时, -
session_id
值都可以用于跟踪不同的Web浏览器,但点击常规(<a href="...">)
超文本链接不会产生表单提交,因此隐藏表单字段也不能支持常规会话跟踪。
网址重写
- 在每个网址的末尾附加一些额外的数据。该数据标识会话; 服务器可以将该会话标识符与其关于该会话存储的数据相关联。
- 例如,使用URL:
http://www.baidu.com/file.html;sessionid=123456789
,会话标识符作为sessionid=123456789附加,可以在Web服务器*问以识别客户端。 - URL重写是一种更好的方法来维护会话,并且在浏览器不支持cookie时可以使用它们。 这里的缺点是,必须动态生成每个URL来分配会话ID,而页面是一个简单的静态HTML页面。
session对象
- JSP还使用了提供HttpSession接口的servlet。
- HttpSession接口的servlet接口提供了一种识别用户的方法:一个请求页或访问网站或存储有关用户的信息
- 默认情况下,JSP启用会话跟踪,并为每个新客户端自动实例化一个新的HttpSession对象。 禁用会话跟踪需要通过将页面指令会话属性设置为false来明确地将其关闭,如下所示:
<%@ page session = "false" %>
-
JSP
引擎通过隐式会话对象将HttpSession
对象公开给JSP程序员。由于会话对象已经提供给我们,我们可以立即开始从对象中存储和检索数据,而无需任何初始化或getSession()。
JSP_session会话跟踪实例
- 使用
HttpSession
对象来查找会话的创建时间和最后访问的时间。如果尚不存在,会将新建会话与请求相关联。
index.jsp内容如下
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*"%>
<%
Date createTime = new Date(session.getCreationTime());
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");
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>
删除会话数据
- 完成用户的会话数据后可以删除会话信息
- 删除一个指定的属性 - 可以调用public void removeAttribute(String name)方法来删除与特定键相关联的值。
- 删除整个会话信息 - 可以调用public void invalidate()方法来删除(丢弃)整个会话信息。
- 设置会话超时 - 可以调用public void setMaxInactiveInterval(int interval)方法来单独设置会话的超时。
- 注销登录用户 - 支持servlets 2.4的服务器,可以调用注销将客户端记录在Web服务器之外,并使属于用户的所有会话失效。
- web.xml配置 - 如果使用的是Tomcat,除了上述方法外,还可以在web.xml文件中配置会话超时,如下所示-
<session-timeout>
指定超时表示的时间单位为分钟
<session-config>
<session-timeout>15</session-timeout>
</session-config>
- servlet中的
getMaxInactiveInterval()
方法以秒为单位返回该会话的超时时间。 因此,如果会话在web.xml中配置了15分钟,那么getMaxInactiveInterval()
方法将返回900秒。