how2j.cn


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

步骤 1 :

健身房的储物柜

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

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

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

切换到我们常见的购物网站的场景
李佳汜登陆天猫之后,在购物车里看到的物品是蜡烛和皮鞭
毛竞登陆天猫之后,在购物车里看到的物品是手铐和《Java 21天从入门到精通》
步骤 2 :

什么是Session

Session对应的中文翻译是会话。
会话指的是从用户打开浏览器访问一个网站开始,无论在这个网站中访问了多少页面,点击了多少链接,都属于同一个会话。 直到该用户关闭浏览器为止,都属于同一个会话。
步骤 3 :

setSession.jsp


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>
步骤 4 :

getSession.jsp

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的关系

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

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

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

Session 原理示意图

Session 原理示意图
步骤 7 :

如果没有cookie,session如何工作

如果浏览器把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的有效期

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

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

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

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


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


问答区域    
2017-10-30 session的原理图,和cookie的原理图
Bigone
站长,两者都是取出name。。。。有什么区别呀,感觉功能类似。。。。好像时两个独立的东西,没有联系呀,要说关系好像也有,session用到了jsessionid,它是cookie,可是为什么要setcookie.jsp里设置name而且setsession.jsp还要设置name,还是说教程里的name只是为了演示cookie怎么生效?实际应用中就是浏览session,然后session把name放到jsessionid里然后按照上个教程的cookie执行?




2 个答案

Bigone 答案时间:2017-11-10
盒子对应服务器上的Session。 钥匙对应浏览器上的Cookie。 真棒!!!讲的

Bigone 答案时间:2017-10-30
...用了浏览器F12调试。。理解了。。。是我说的那样。。。吧,教程只是先演示cookie的底层,然后说session。。。。




答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2017-10-30 可怕,真可怕
Bigone
吓人!!!!








答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2017-08-04 老师,请问怎么在服务器的操作上获取jsessionid呢?
2017-08-03 老师请问一下网站cookie和session的交流一定要用jsessionid吗?用自己定义的别的可以吗?主流网站都是怎么做的呢?
2017-05-23 能不能顺带讲一下跨站请求伪造呢?
2017-04-13 步骤7不太明白
2016-05-13 关于session




提问之前请登陆
关于 J2EE-JSP-session 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 389538688
站长会在每个工作日早上尽量回答提问(如果有漏掉没有回答的,请进群提醒一下)
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
站长是玻璃心,提问的时候请语气温柔些 kiss~
截止2017-5-19日累计提问 1638个,站长回答了 1546个
截止2017-8-15日累计提问 2788个,站长回答了 2544个

上传截图