Session

背景:为了存储HTTP通信中客户端与服务器之间的会话状态

Cookie和Session都是为了解决HTTP协议的无状态问题,存储HTTP通信中客户端与服务器之间的会话状态。html

不一样的是Cookie依赖HTTP请求头与响应头实现且存储在客户端,而Session存储在服务器端,Session能够经过Cookie实现,也可使用URL回写的方式实现。html5

若是若是浏览器不支持 Cookie,也可使用如下办法,记录标识符:java

  • URL 重写: 做为路径参数包含到 url 中,如 /path;JSESSIONID=xxx
  • URL 请求参数: 将会话惟一标识做为查询参数添加到页面全部连接中,如 /path?JSESSIONID=xxx

Cookie经过Cookie请求头和Set-Cookie响应头实现:

Set-Cookie - 服务器响应头,用于告诉客户端要设置Cookie
Cookie - 请求头,根据Set-Cookie设置并保存到客户端的Cookie值,会在再次发送HTTP请求时经过这个请求头一同发送到服务器spring

session

Cookie很好的解决了HTTP通信中状态问题,但其自己也存在一些问题,如:apache

  • 客户端存储,可能会被修改或删除
  • 发送请求时,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

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

相关文章
相关标签/搜索