Session

Session

服务器端会话技术,在一次会话的多次请求中间共享数据,将数据保存在服务器端的对象中,HttpSession。(request.getSession()

注意:所谓的一次会话,通常指的是不同IP或者同一IP的不同客户端,比方说在同一台机器上使用360浏览器和谷歌浏览器访问百度,在百度的服务器终端会创建两个Session,甚至是同一台客户机,同一个浏览器,不同的标签页都可以算是一个新的会话。

共享数据

1
2
3
Object getAttribute(String name);
void setAttribute(String name, Object value);
void removeAttribute(String name);

Session原理

首先Session是依赖于Cookie的。

服务器是这样判断请求是属于哪个会话的!

image-20220108152046780

Session的一些细节

当客户端关闭后,服务器不关闭,两次获取Session是否为同一个?

默认情况下,不是的,原因也很简单,因为Cookie默认情况下当浏览器关闭之后会被清空,因此JSESSIONID的cookie也会被清空,重新打开浏览器发送同一请求的时,不会有JSESSIONID头,因此都武器将重新创建一个HttpSession

如果需要保证下次请求的session相同,则需要对JSESSIONID的cookie进行持久化。

1
2
3
4
HttpSession session = request.getSession();
Cookie c = new Cookie("JSESSIONID", session.getId());
c.setMaxAge(60*60*24);
response.addCookie(C);

当服务器重启后,客户端再次获取Session是否为同一个?

理论上不是,当服务器关闭的时候,内存中的所有Session都将会被销毁,因此不可能是同一个。

但是处于安全考虑,原生的Tomcat服务器在重启的时候会将Session对象序列化到根目录的Work文件夹中,当重启服务器完成之后,会反序列化Work文件夹中的Session对象,以此来实现重启服务器后也能够获得同一个Session对象。

Idea开发环境中,会对运行使用的Tomcat进行配置,再重启服务器的时候会先把Work文件夹删掉,然后再创建新的Work文件夹,因此无法实现和饥饿原生tomcat一样的安全功能。

Session什么时候会被销毁

  1. 服务器关闭的时候
  2. session对象调用invalidate()
  3. session默认失效时间为30分钟,也就是说浏览器在30分钟内无任何session操作,session将失效

Session特点

  1. 用于储存一次会话多次请求的数据,存在服务器中
  2. session可以存储任意类型,任意大小的数据