• 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

  • 相关阅读:
    操作系统概述
    18 文本处理
    17 正则表达式(重点)
    16 归档和备份
    15 查找文件
    博客园图片折叠
    EF6学习笔记十五:调试EF框架源码
    EF6学习笔记十四:上下文管理
    Sqlserver和LocalDB创建数据库时默认字符集不一样
    EF6学习笔记十三:基础知识完结,零碎问题补缺
  • 原文地址:https://www.cnblogs.com/victor2302/p/11817981.html
Copyright © 2020-2023  润新知