Session

Posted victor2302

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于Session的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat8下建立WebSocket始终连不上

jsp可以保存两个session吗?

tensorflow源码解析之common_runtime-session

JAVA遇见HTML——JSP篇:JSP内置对象(下)

Hibernate查询语言(HQL)

Hibernate 获取Session