session机制
session机制采用的是在服务器端保持HTTP状态信息的方案。
session原理
概括
服务端保存session的内容,客户端浏览器cookie保存sessionid,服务端通过客户端每次http请求带上的cookie中的sessionid去找到对应此用户的session内容。
具体
服务器使用一种类似于散列表的结构来保存信息。当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否包含了一个session标识。(即sessionId),如果已经包含一个sessionId则说明以前已经为此用户创建过session,服务器就按照sessionId把这个session检索出来使用(如果检索不到,可能会新建一个,这种情况可能出现在服务器已经删除了该用户的session对象,但用户人为地在请求的URL后面附加上一个JSESSIONID的参数)。如果客户请求不包含sessionId,则为此客户创建一个session并且生成一个与此session相关的sessionId,这个sessionId将在本次相应中返回给客户端保存。
实现过程
目录结构
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>javaWeb_20</display-name>
<welcome-file-list>
<welcome-file>session.jsp</welcome-file>
</welcome-file-list>
</web-app>
session.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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.jsp</title>
</head>
<body>
<%=session.getId() %>
</body>
</html>
第一次访问session.jsp
请求中无sessionId,服务器创建了一个HttpSession对象
刷新页面,第二次访问session.jsp
请求中带有sessionId,利用此sessionId从服务端检索到此HttpSession
持久化session
其他文本不变,改变session.jsp如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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.jsp</title>
</head>
<body>
<%=session.getId() %>
<%
Cookie cookie = new Cookie("JSESSIONID",session.getId());
cookie.setMaxAge(30);
response.addCookie(cookie);
%>
</body>
</html>
将刚才的游览器关闭之后,再打开
原本应该是关闭游览器之后sessionId就消失的,但是我们人为的将此sessionId设置生存周期为30s。所以没有超过30秒,重新打开游览器依旧是原来的sessionId。
过了30s后,再次访问
超过设置的生存周期后,请求中不再带有sessionId,因此又新创建了一个HttpSession