Spring Session(分布式Session共享)实现示例

目录
  • HttpSession的实现流程
  • Tomcat中的HttpSession实现
  • 使用
    • 导入依赖
    • 编辑配置文件
    • 编辑启动类
    • 编辑控制器
  • @EnableRedisHttpSession注解属性
    • redisNamespace
    • maxInactiveIntervalInSeconds
    • flushMode
    • saveMode
    • cleanupCron
  • Spring Session保存在Redis中的数据
    • spring:session:sessions:唯一值
    • spring:session:sessions:expires:唯一值
    • spring:session:erxpirations:时间戳
  • 基于Header的Spring Session或改变Cookie名称
    • 修改Cookie名称
    • 设置Header

HttpSession的实现流程

1.当用户访问服务器端时,服务器端会判断请求是否携带包含JSESSIONID的Cookie。

如果没有携带,服务器端会创建一个Cookie,key为JSESSIONID,value是长字符串(唯一字符串)。

同时会实例化一个Session对象。把Session对象放入到全局Map中,Map的key是Cookie的value,Map的value就是Session对象。

同时设置Session对象属性的值,记录creationTime创建实现、id是JSESSIONID对应值、lastAccessedTime最后一次访问时间、maxInactiveInterval 最大存活时间

2.服务器响应给客户端结果,响应对象中包含Cookie内容,Cookie就会存储在客户端。

3.客户端再次请求服务器端时会自动携带Cookie内容。

4.服务器端再次接收请求后发现请求中Cookie带有JSESSIONID,根据JSESSIONID的值进行从Map中取出Session对象,会判断lastAccessedTime和maxActiveInterval属性,判断Session是否失效,如果失效执行a)步骤重新创建Session对象。

如果没有失效修改lastAccessedTime为当前访问时间。

Tomcat中的HttpSession实现

当向Session作用域存储值时执行上面Session原理,把Session对象取出后,Session作用域的值就存储在全局Map属性(此Map属性是Session对象的全局属性) ​

既然HttpSession存储值时是一个全局Map,所以依然可以使用Redis这种键值对NoSQL数据库来替代这个Map,也就是存自定义实现时用Redis存储以前放在Session中值。

使用

导入依赖

<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
</dependency>

编辑配置文件

server:
  port: 8000
spring:
  redis:
    host: 192.168.8.128

编辑启动类

/**
 * EnableRedisHttpSession - 让Spring Session分布式会话共享技术生效。
 */
@SpringBootApplication
@EnableRedisHttpSession
public class Web1App{
	public static void main(String[] args){
		SpringApplication.run(Web1App.class, args);
	}
}

编辑控制器

@RestController
public class Web1Controller {
    @RequestMapping("/set")
    public String demo(HttpSession session, String attName, String attValue){
        session.setAttribute(attName, attValue);
        return "WEB1工程:已设置' " + attName + " = " + attValue + " '到会话变量作用域";
    }
    @RequestMapping("/get")
    public String demo(HttpSession session, String attName){
        Object attValue = session.getAttribute(attName);
        System.out.println("从会话中获取" + attName + "变量,值是:" + attValue);
        return "WEB1工程:从会话中获取" + attName + "变量,值是:" + attValue;
    }
}

@EnableRedisHttpSession注解属性

@SpringBootApplication
@EnableRedisHttpSession(redisNamespace = "bjsxt:session", maxInactiveIntervalInSeconds = 3600,
        flushMode = FlushMode.ON_SAVE, saveMode = SaveMode.ON_SET_ATTRIBUTE,
        cleanupCron = "0 * * * * *"
)
public class Web1App {
    public static void main(String[] args) {
        SpringApplication.run(Web1App.class, args);
    }
}

redisNamespace

保存在redis中的数据的key前缀。默认spring:session。

maxInactiveIntervalInSeconds

会话生命周期。默认1800秒。

flushMode

刷新redis数据的模式。默认ON_SAvE。在保存时才刷新。另一个取值FlushMode.IMMEDIATE,不刷新。

saveMode

保存模式。默认值SaveMode.ON_SET_ATTRIBUTE:在设置session属性时保存。可选值如下:

  1. SaveMode.ALWAYS:实时保存。
  2. SaveMode.ON_GET_ATTRIBUTE:获取值时才进行保存到Redis。

cleanupCron

清除Redis中数据的表达式。默认”0 * * * * *”

Spring Session保存在Redis中的数据

spring:session:sessions:唯一值

value的类型是Hash类型。表示整个Session对象。包括:

  1. creationTime :创建会话的时间
  2. lastAccessedTime :最后一次访问时间
  3. maxInactiveInterval :有效生命周期,默认30分钟
  4. sessionAttr:xxx :会话中的attribute值。field中的xxx代表会话中attribute的名字,会话中每个attribute,对应一个field-value对。

spring:session:sessions:expires:唯一值

value的类型是String类型。没有什么特殊内容。表示当前session过期状态。如果没有该属性说明,当前Session已过期。

spring:session:erxpirations:时间戳

value的类型是Set类型。里面存储了这个时间戳是哪个session的。如果过期了,该键值对也会被删除掉。

基于Header的Spring Session或改变Cookie名称

修改Cookie名称

添加配置类修改Spring Session 中的Cookie名称。

@Configuration
public class MyConfiguration {
    @Bean
    public HttpSessionIdResolver httpSessionIdResolver(){
        // 创建cookie转换器
        CookieHttpSessionIdResolver httpSessionIdResolver = new CookieHttpSessionIdResolver();

        // 设置Cookie序列化方案
        DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
        // 设置Cookie的名字
        cookieSerializer.setCookieName("BJSXT");

        httpSessionIdResolver.setCookieSerializer(cookieSerializer);

        return httpSessionIdResolver;
    }
}

设置Header

添加配置类修改Spring Session 是基于Header指定名称请求头,代替Cookie。

@Configuration
public class MyConfiguration {
    @Bean
    public HttpSessionIdResolver httpSessionIdResolver(){
        HttpSessionIdResolver httpSessionIdResolver = new HeaderHttpSessionIdResolver("MY-SESSION");
        return httpSessionIdResolver;
    }
}

到此这篇关于Spring Session(分布式Session共享)实现示例的文章就介绍到这了,更多相关Spring Session(分布式Session共享)内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot3整合MyBatis出现异常:Property 'sqlSessionFactory'or 'sqlSessionTemplate' are required

    目录 交代一下背景 问题出现 问题排查 解决问题:需要升级版本 总结 SpringBoot3整合MyBatis报错:Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required 遇到了一个 Spring Boot 3 整合 MyBatis 的问题,然后解决了.当然,这其实不是个大问题,只是自己编码时遇到了,然后总结总结分享一下.如果有遇到类似问题的,可以参考一下. 交代一下背景 最近在熟悉 Spring Boot 3 版本的代

  • SpringBoot整合SpringSession实现分布式登录详情

    目录 Session 共享 为什么服务器 A 登录后,请求发到服务器 B,不认识该用户? 解决方案 SpringBoot整合SpringSession实现分布式登录 Session 共享 比如两个域名: aaa.yupi.com bbb.yupi.com 如果要共享 cookie,可以种一个更高层的公共域名,比如 yupi.com 为什么服务器 A 登录后,请求发到服务器 B,不认识该用户? 用户在 A 登录,所以 session(用户登录信息)存在了 A 上 结果请求 B 时,B 没有用户信息

  • SpringBoot中HttpSessionListener的简单使用方式

    目录 HttpSessionListener的使用方式 session监听实现类 controller调用 注册HttpSessionListener失效原因 问题描述 原因 HttpSessionListener的使用方式 session监听实现类 import org.springframework.stereotype.Component; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpS

  • 详解SpringBoot中@SessionAttributes的使用

    目录 简介 概述 代码 后端代码 前端代码 测试 简介 说明 本文介绍SpringBoot中@SessionAttributes的用法. 概述 在默认情况下,ModelMap中的属性作用域是request级别,也就是说,当本次请求结束后,ModelMap 中的属性将销毁.如果希望在多个请求中共享ModelMap中的属性,必须将其属性转存到session 中,这样 ModelMap 的属性才可以被跨请求访问. Spring 允许我们有选择地指定 ModelMap 中的哪些属性需要转存到 sessi

  • SpringBoot 整合 Spring-Session 实现分布式会话项目实战

    目录 一.配置及开发 二.测试 三.Spring-Session 的缺点 文章参考: Spring 提供了处理分布式会话的解决方案:Spring-Session.Spring-Session 提供了对Redis.MongoDB.MySQL 等常用存储的支持,Spring-Session 提供与 HttpSession 的透明整合,这意味着开发人员可以使用 Spring-Session 支持的实现方式,切换 HttpSession 至 Spring-Session.本文采用 Redis 作为第三方

  • SpringBoot集成redis与session实现分布式单点登录

    目录 单点登录 SSO(Single Sign On) 什么是单点登录? 实现方式 开发技术 单点登录实现流程 实现案例 看效果 前言: 由于考虑到cookie的安全性问题,就有了下面这个版本的sso 单点登录 SSO(Single Sign On) 什么是单点登录? 单点登录的英文名叫做:Single Sign On(简称SSO),指在同一帐号平台下的多个应用系统中,用户只需登录一次,即可访问所有相互信任的系统.简而言之,多个系统,统一登陆. 我们可以这样理解,在一个服务模块登录后,其他模块无

  • springboot普通类中如何获取session问题

    目录 Spring中普通类获取session 项目中日志功能 解决方案 SpringBoot中使用session 基础知识 在 Spring Boot中使用 总结 Spring中普通类获取session 项目中日志功能 记录所有通过后台操作的记录,记录项有 时间.操作员.功能模块.操作内容 写了一个基于注解方式的aop,实现日志功能 使用shiro的话可以直接获取到用户的token,然后获取到用户登录信息 可是项目中没有使用token,使用的是session绑定登录信息,需要在@Aspect中获

  • SpringBoot Session接口验证实现流程详解

    目录 添加pom.xml 创建简单的测试接口 使用过滤器实现 使用拦截器实现 需求:只有用户登录成功后,才能访问其它接口,否则提示需要进行登录 项目仓库地址:https://gitee.com/aiw-nine/springboot_session_verify 添加pom.xml 新建Spring Boot(2.7.2)项目,添加如下依赖: <?xml version="1.0" encoding="UTF-8"?> <project xmlns

  • SpringBoot2.x设置Session失效时间及失效跳转方式

    目录 设置Session失效时间及失效跳转 Session失效后如何跳转到Session失效地址 设置Session失效的几种方式 如果是1.5.6版本 还可以设置 设置Session失效时间及失效跳转 #Session超时时间设置,单位是秒,默认是30分钟  server.servlet.session.timeout=10 然而并没有什么用,因为SpringBoot在TomcatServletWebServerFactory代码中写了这个     private long getSessio

  • SpringBoot下实现session保持方式

    目录 相关概念 1.HTTP是无状态协议 2.哪些方法可以实现有状态连接 3.Session是由Web服务器端(Tomcat)维护的 实现方法 实现方法 实现原理 实现代码 如何插入一段漂亮的代码片 总结 相关概念 1.HTTP是无状态协议 无状态是指协议对于事务处理没有记忆功能.缺少状态意味着,假如后面的处理需要前面的信息,则前面的信息必须重传,这样可能导致每次连接传送的数据量增大.另一方面,在服务器不需要前面信息时,应答就较快.直观地说,就是每个请求都是独立的,与前面的请求和后面的请求都是没

随机推荐