HTTP 协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录;Session 和 Cookie 的主要目的就是为了弥补 HTTP 的无状态特性。
客户端请求服务端,服务端会为这次请求开辟一块内存空间,这个对象便是 Session 对象,存储结构为 ConcurrentHashMap。
Session会话
1、Session就是一个接口
2、Session就是会话。它是用来维护一个客户端和服务器之间关联的一种技术
3、每个客户端都有自己的一个Session会话。
4、Session会话中,我们经常用来保存用户登录后的信息。
每个客户端都有一个唯一的id,这个id是Session创建出来的。
Session作用域范围:浏览器开启与关闭
创建Session:resquest.getSession()第一次调用时创建Session会话。
isNew();判断是否是刚创建出来的,true 表示刚创建,false 表示获取之前创建
getId():得到session的id值
创建session对象时,浏览器就会以cookie的形式将它的id保存下来,存放在value部分,与之对应的cookie的key 一直是JSESSIONID。在一个浏览器中,不论session对象有多少个,id只有一个。
Session生命周期控制:
public void setMaxInactiveInterval(int var1)
设置Session的超时时间,超过指定的时长,Session就会被销毁。值为整数时,设置Session的超时时长,负数表示永不超时。
//获取session的超时时长
getMaxInactiveInterval()
invalidate():让当前的Session会话马上超时失效。
Session 默认的超时时间长为 30 分钟。
因为在Tomcat服务器的配置文件 web.xml 中默认有以下的配置,它就表示配置了当前 Tomcat 服务器下所有的 Session 超时配置默认时长为:30 分钟。
<session-config>
<session-timeout>30</session-timeout>
</session-config>
如果希望 web 工程默认的 Session 的超时时长为其他时长,可以在web.xml 配置文件中做以上相同的配置。就可以修改web 工程所有 Seession 的默认超时时长。
<!--表示当前 web 工程。创建出来的所有 Session 默认是 20分钟 超时时长-->
<session-config>
<session-timeout>20</session-timeout>
</session-config>
如果你想只修改个别 Session 的超时时长。就可以使用上面的 API:setMaxInactiveInterval(int interval) 来进行单独的设置。
session.setMaxInactiveInterval(int interval)单独设置超时时长。
/**
* Session3秒超时销毁
*/
protected void life3 (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 先获取 Session 对象
HttpSession session = req.getSession();
// 设置当前 Session 三秒后超时
session.setMaxInactiveInterval(3);
resp.getWriter().write("当前 Session 已经设置为三秒后超时");
}
在点击 Session 的创建和获取(id号、是否为新创建)之后,再点击 Session 3秒超时销毁,之后立即连续点击Session 的创建和获取(id号、是否为新创建),我们会发现,这个Session是否是新创建的显示一直为:false,但是如果停三秒钟之后再点击,就会发现变为了 true,并且这个Session的id也改变了。
这个要从超时的概念说起:
设置为3秒超时之后,Session 对象就会有一个 timeout 计时器(timeout = 3, 每隔一秒 -1), 等到timeout = 0的时候,Session就会因为超时被删除.
如果是连续重复发送创建请求,距离上次请求时间间隔时间很短(小于3秒),这时候 timeout 就会被重置为3,就不可能会超时。
Session 的超时指的是:客户端两次请求的最大间隔时长
浏览器和 Session 之间关联的技术内幕
Session 技术,底层其实是基于 Cookie 技术来实现的。同时也说明了,为什么 Session 明明没有超时,关闭浏览器之后就超时了(创建的 Cookie,它的存活时间为:Session ===> 浏览器一关 Cookie 就没有了 ===> 就来到了没有 Cookie 的情况,那么再发请求,就必然会再创建一个新的)
首先,在客户端是没有任何Cookie信息的,在没有Cookie的情况下,客户端(浏览器)向服务器(Tomcat)发送请求,服务器会调用 request.getSession() 这个API,创建会话对象,在服务器的内存中(Session1, Session2, Session3… )。
服务器每次创建 Session 会话的时候,都会创建一个 Cookie 对象。这个 Cookie 对象的 key 永远都是:JSESSIONID,值是新创建出来的 Session 的 id 值。
这时候,通过响应把新创建出来的 Session 的 id 值返回给客户端。
Set-Cookie:JSESSIONID=9055D85D3EB8F0922E3D5D56A8E776DE
服务器解析收到数据,就马上创建一个 Cookie 对象。有了 Cookie 之后,每次请求都会把 Session 的 id 以 Cookie 的形式发送给服务器。
调用 request.getSession() 这个API,通过 Cookie 中的 id 值找到创建好的 Session 对象(去内存中遍历),并返回。
注意:如果删除 Session 中的 Cookie,再重新发送一个请求到服务器,再创建一个新的 Session 会话对象。服务器每次创建 Session 会话对象的时候,都会创建一个 Cookie 对象。这个 Cookie 对象的 key 永远都是 JSESSIONID,值是新创建出来的 Session 的值。
[
](https://blog.csdn.net/weixin_45024585/article/details/112749147)