Session
1. 概念:
服务端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象(HTTPSession)中;
2. HTTPSession对象
- 获取Session对象:
- request.getSession()
- Session对象的方法:
- setAttribute(String name, Object value)
- Object getAttribute(String name)
- void removeAttribute(String name)
3. Session原理
在一次会话的范围内,不同的请求可能会都会创建session对象,而且在一次会话的session对象都是同一个。Session是依赖Cookie实现的,实现的过程如下:
- 当某次会话中首次创建Session对象时,会为该Session对象生成一个ID
- 在响应信息的信息头里带着一个SetCookie的头,值为
JSESSIONID=325803485DF8983D23D
- 浏览器收到响应信息,在浏览器创建一个 Cookie
- 浏览器下次请求,请求头会带着Cookie,值为
JSESSIONID=325803485DF8983D23D
- 当服务器试图创建Session对象时,首先判断内存中是否对应ID为
325803485DF8983D23D
的Session对象,如果有就使用该Session对象
4.Session的细节
-
当客户端关闭后,服务器不关闭,两次获取的Session是同一个吗?
-
默认情况下不是,因为没有JSESSIONID这个Cookie
-
但是客户实现获取到同一个,只要创建一个Cookie,键为
JSESSIONID
,值为随便写一个,并设置最大存活时间Cookie cookie = new Cookie("JSESSIONID","2340324802d78900f"); cookie.setMaxAge(60*60); response.addCookie(cookie);
-
-
当客户端不关闭,服务器关闭,两次获取的Session
- 服务器关闭就销毁了Session对象了,不是同一个了!但是要确保数据不丢失,就要在服务器关闭前将Session对象存储到硬盘:
- Session的钝化:服务器正常关闭前,将Session对象序列化到硬盘上(序列化)
- Session的活化:服务器启动后,将session文件转化为内存中的Session对象(反序列化)
- 服务器关闭就销毁了Session对象了,不是同一个了!但是要确保数据不丢失,就要在服务器关闭前将Session对象存储到硬盘:
-
Session的销毁时间:
-
服务器关闭
-
Session对象调用方法
invalidate()
-
Session对象的默认失效时间是 30分钟
-
在web.xml里可以修改该失效时间:
<!-- ==================== Default Session Configuration ================= --> <!-- You can set the default session timeout (in minutes) for all newly --> <!-- created sessions by modifying the value below. --> <session-config> <session-timeout>30</session-timeout> </session-config>
-
-
5. Session的特点:
-
Session是用于存储一次会话的多次请求数据,存储在服务器端
-
session可以存储任意类型的、任意大小的数据
-
与cookie的区别:
Cookie Session 数据存储在客户端 数据存储在服务器端 数据没有大小限制 数据有大小,数量限制 数据相对安全 数据相对不安全