javaWEB总结(20):Session概述

本文深入探讨了Web开发中Session机制的工作原理及其实现过程。通过具体的示例介绍了如何在服务器端保存用户的状态信息,并通过客户端的Cookie携带SessionID进行状态跟踪。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值