Session
背景:为了存储HTTP通讯中客户端与服务器之间的会话状态
Cookie和Session都是为了解决HTTP协议的无状态问题,存储HTTP通讯中客户端与服务器之间的会话状态。
不同的是Cookie依赖HTTP请求头与响应头实现且存储在客户端,而Session存储在服务器端,Session可以通过Cookie实现,也可以使用URL回写的方式实现。
如果如果浏览器不支持 Cookie,也可以使用以下办法,记录标识符:
- URL 重写: 作为路径参数包含到 url 中,如 /path;JSESSIONID=xxx
- URL 请求参数: 将会话唯一标识作为查询参数添加到页面所有链接中,如 /path?JSESSIONID=xxx
Cookie通过Cookie请求头和Set-Cookie响应头实现:
Set-Cookie - 服务器响应头,用于告诉客户端要设置Cookie
Cookie - 请求头,根据Set-Cookie设置并保存到客户端的Cookie值,会在再次发送HTTP请求时通过这个请求头一同发送到服务器
session
Cookie很好的解决了HTTP通讯中状态问题,但其本身也存在一些问题,如:
- 客户端存储,可能会被修改或删除
- 发送请求时,Cookie会被一起发送到服务器,当Cookie数据量较大时也会带来额外的请求数据量
- 客户端对Cookie数量及大小有一定的限制
- Session解决了Cookie的一些缺点。Session同样是为了记录用户状态,对于每个用户来说都会有相应的一个状态值保存在服务器中,而只在客户端记录一个sessionID用于区分是哪个用户的Session。
与Cookie相比Session有一定的优势:
- Session值存储在服务器,相对来说更安全
- 客户端发送给服务器的只有一sessionID,数据量更小
- Session同样需要在客户端存储一个sessionID。可以这个值存储在Cookie,每次发送请求时通过Cookie请求头将其发送到服务器;也可以不使用Cookie,而将sessionID做为一个额外的请求参数,通过URL或请求体发送到服务器。
servlet session
Java API Servlet中的会话由javax.servlet.http.HttpSession接口的实现表示。可通过HttpServletRequest方法getSession()或getSession(boolean create)进行访问。根据选择的方法,该方法的调用将导致以下情况之一:
- 检索与用户关联的当前会话(会话必须在调用之前存在)
- 创建新会话(如果该会话不存在并且我们使用getSession()方法)不带参数或带参数create等于true)
- 不执行任何操作(会话不存在,我们调用getSession(false)方法)
好的,我们已经知道一个会话与当前请求相关联,并且可以通过两种不同的方法进行检索。假设我们检索了所需的会话对象。现在我们可以将一些数据放入(方法putValue()或setAttribute()),从(getValue())获取一些数据或删除一些数据(removeValue()或removeAttribute())。请注意,在2.2版本的API Servlet中,value已由attribute代替。这就是为什么我们要使用两种方法来设置或删除会话信息的原因。
会话与请求相关联,由于会话ID,会话可以在多个请求中持续存在。但是,可以通过以下三种方式中断持久性:
-会话超时:当在一段时间内不使用会话时。
-服务器故障:当服务器关闭时,会话可能会丢失(要了解更多信息,请直接参阅会话恢复部分)。
-显式会话无效:通过调用HttpSession方法invalidate(),我们可以显式使整个会话无效。
tomcat的session存储(应用程序容器)
- org.apache.catalina.session.StandardManager: java堆中
- org.apache.catalina.session.FileStore: 文件
- org.apache.catalina.session.JDBCStore: jdbc
spring session(不依赖(应用程序容器))
Spring Session提供了一种API和实现,用于管理用户的会话信息,同时使其轻松地支持集群会话,而不必依赖于特定于应用程序容器的解决方案。它还提供与以下内容的透明集成:
- HttpSession:允许以与HttpSession应用程序容器无关的方式替换,并支持在标头中提供会话ID以与RESTful API一起使用。
- WebSocket:提供HttpSession接收WebSocket消息时保持活动的功能
- WebSession:允许以与WebSession应用程序容器无关的方式替换Spring WebFlux 。
后端存储支持的方案:
session串号
http://jm.taobao.org/2013/06/13/2769/
缓存服务器缓存了header
参考
https://docs.spring.io/spring-session/docs/current/reference/html5/#introduction