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公众号,关注后实时获知布最新的教程和优惠活动,谢谢。


问答区域    
2018-09-11 我把session时间改成2 但是过了三分钟我刷新他还是没让我登录
提莫队长前来报道
关于 J2EE-JSP-session 的提问



不是很懂 哎
<session-config>
        <session-timeout>2</session-timeout>
    </session-config>

							


1 个答案

提莫队长前来报道 答案时间:2018-09-11
我又等了一个小时。。。还是没有让我重新登陆




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





2018-08-26 这篇教程没有把jsessionid存在cookie里面吧?最后的步骤只是用URL识别,这样每个用户都要分配一个唯一的URL吗?
pakchoiko
关于 J2EE-JSP-session 的提问
这篇教程没有把jsessionid存在cookie里面吧?最后的步骤只是用URL识别,这样每个用户都要分配一个唯一的URL吗?




1 个答案

pakchoiko 答案时间:2018-08-26
这个唯一的URL保存在哪呢?




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




2018-06-24 有问题
2018-05-17 jsessionid
2017-10-30 session的原理图,和cookie的原理图
2017-10-30 可怕,真可怕
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群交流: 620943819
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: http://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图