how2j.cn

步骤 1 : 健身房的储物柜   
步骤 2 : 什么是Session   
步骤 3 : setSession.jsp   
步骤 4 : getSession.jsp   
步骤 5 : Session和Cookie的关系   
步骤 6 : Session 原理示意图   
步骤 7 : 如果没有cookie,session如何工作   
步骤 8 : session的有效期   

步骤 1 :

健身房的储物柜

edit
考虑这个场景:
李佳汜到健身房去练胸肌,首先领了钥匙,然后进了更衣间,把衣服,裤子,手机,钱包都放在盒子里面。

毛竞也到健身房,去练翘臀首先领了钥匙,然后 进了更衣间,把衣服,裤子,手机,《Java 21天从入门到精通》也放在了一个盒子里,但是这个盒子是和李佳汜的是不同的。

健身房,就相当于服务器,盒子,就是会话Session。

切换到我们常见的购物网站的场景
李佳汜登陆天猫之后,在购物车里看到的物品是蜡烛和皮鞭
毛竞登陆天猫之后,在购物车里看到的物品是手铐和《Java 21天从入门到精通》
Session对应的中文翻译是会话。
会话指的是从用户打开浏览器访问一个网站开始,无论在这个网站中访问了多少页面,点击了多少链接,都属于同一个会话。 直到该用户关闭浏览器为止,都属于同一个会话。

session.setAttribute("name", "teemo");

session对象保存数据的方式,有点像Map的键值对(key-value)
"name"是键,"teemo" 是值
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%> <% session.setAttribute("name", "teemo"); %> <a href="getSession.jsp">跳转到获取session的页面</a>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>

<%
   session.setAttribute("name", "teemo");
%>

<a href="getSession.jsp">跳转到获取session的页面</a>
session.getAttribute("name");

通过session,根据"name" 取出对应的名称
getSession.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%> <% String name = (String)session.getAttribute("name"); %> session中的name: <%=name%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>

<%
	String name = (String)session.getAttribute("name");
%>

session中的name: <%=name%>
步骤 5 :

Session和Cookie的关系

edit
回到健身房的储物柜这一段:

李佳汜和毛竞都有自己的盒子,那么他们怎么知道哪个盒子是自己的呢?
通过钥匙就能找到自己的盒子了。

盒子对应服务器上的Session。
钥匙对应浏览器上的Cookie。
步骤 6 :

Session 原理示意图

edit
Session 原理示意图
步骤 7 :

如果没有cookie,session如何工作

edit
如果浏览器把cookie功能关闭,那么服务端就无法获取jsessionid,每一次访问,都会生成一个新的session对象。

为了解决这个问题,可以使用

response.encodeURL("getSession.jsp")

response.encodeURL方法会把getSession.jsp这个url转换为

getSession.jsp;jsessionid=22424AEA86ADBE89F335EEB649D997A8

通过这个方式,提交jsessionid到服务器。 服务器根据这个jsessionid匹配到对应的session. 与session相关的功能,就可以正常工作了。
如果没有cookie,session如何工作
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%> <% session.setAttribute("name", "teemo"); %> <a href="<%=response.encodeURL("getSession.jsp")%>">跳转到获取session的页面</a>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>

<%
   session.setAttribute("name", "teemo");
%>

<a href="<%=response.encodeURL("getSession.jsp")%>">跳转到获取session的页面</a>
步骤 8 :

session的有效期

edit
比如登录一个网站,登录后,在短时间内,依然可以继续访问而不用重新登录。

但是较长时间不登录,依然会要求重新登录,这是因为服务端的session在一段时间不使用后,就失效了。

这个时间,在Tomcat默认配置下,是30分钟。

可以通过 d:/tomcat/conf/web.xml 中的session-config 配置进行调整
session的有效期


HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2021-12-09 蜡烛皮鞭和手铐是啥意思?
大哈哥哥

关于 J2EE-JSP-session 的提问
蜡烛皮鞭和手铐是啥意思?




3 个答案

chen_jiayuan
答案时间:2024-03-01
你别说,你还真别说

四方1
答案时间:2023-07-28
如果你只关注到了这个,而没有关注到《Java 21天从入门到精通》,你就永远无法成为Java高手

G1g4lo
答案时间:2022-02-02
离谱???



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2021-04-06 那是不是如果知道了别人的jsessionid的话,会很危险
VOID1

关于 J2EE-JSP-session 的提问
在有效期内如果服务端是匹配id安排会话的话,是不是有安全的问题啊




1 个答案

四方1
答案时间:2023-07-28
所以很多网站都是浏览器关闭,id就过期



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2020-10-25 站长暗示学java的都是受,举报了(滑稽)
2020-10-18 session的为什么要有getattribute()?
2019-12-29 我想知道 站长还在吗 -。-


提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 20 条以前的提问,请 点击查看

提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 J2EE-JSP-session 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 578362961
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: https://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图