会话
什么是会话?
从第一次请求开始,到客户端或者服务器端其中一端断开为止,称为会话。所以,一次会话可能包含很多个请求和响应。- 会话的功能:在多次独立的请求响应之间,共享数据。
为什么要有会话?
因为HTTP每次请求都是独立的,无法知晓各自间的数据这个问题。java中如何实现会话?
- 客户端:cookie
- 请求头:会有一个cookie
- 响应头:会有一个set-cookie
- 细节:
- 多久:setMaxAge(int seconds)
- 默认:负数,即关闭浏览器,会话销毁
- 正数:持久化到客户端硬盘,值代表多少秒
- 0:删除客户端存储的对应会话
- 多大:一个cookie最大4kb
- 数量:一个域名一般最多20个cookie
- 类型:字符串
- 作用范围:
- 默认:当前项目内共享
- setPath(String path):同一个服务器下的不同项目共享,值为服务器路径,比如:setPath("/")
- setDomain(String path):同一个域名下,不同服务器/项目共享,比如:setDomain(".baidu.com")
- 多久:setMaxAge(int seconds)
- cookie通常用在未登录情况下作身份认证
- 特殊字符存储:URL编码解码,URLEncoder.encode()、URLEncoder.decode();
- 服务器端:session
-
概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession
-
原理:基于cookie实现,多次请求间,前端通过cookie保存jsessionId,把id传给后端,后端通过jsessionId保证每次取的session对象是同一个,以此保证数据共享正确。
-
多久:默认30分钟,可在服务器配置文件中修改,比如tomcat的web.xml可以修改
<session-config> <session-timeout>30</session-timeout> </session-config>
-
多大:没有明确限制
-
数量:没有明确限制
-
类型:任意类型
-
HttpSession可在HttpServletRequest中获取,在Spring中是内置对象,
- void setAttribute(String name,Object value) 设值
- Object getAttribute(String name) 取值
- void removeAttribute(String name)删除值
-
细节
- 客户端重启,服务器保持,由于默认cookie销毁,会导致session获取不是同一个。
- 解决方案:服务器端返回请求时,setMaxAge(int seconds);将cookie持久化到客户端硬盘。
- 客户端保持,服务端重启,由于session销毁,会导致通过JSESSIONID获取不到同样的session。
- 解决方案:服务器重启前,将session对象内的数据序列化到硬盘,服务器重庆后,将文件中的数据返序列化到内存中。以保证虽然通过JSESSIONID获取到的session对象不同了,但数据还是原来的数据。ps.tomcat已帮我们实现了。
- 客户端重启,服务器保持,由于默认cookie销毁,会导致session获取不是同一个。
-
- 客户端:cookie