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

 更新时间:2023年01月17日 14:42:16   作者:幽默涵养miss u  
这篇文章主要介绍了Spring Session(分布式Session共享)实现示例,文章内容详细,需要的朋友可以参考下

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共享)内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JAVA代码设置selector不同状态下的背景颜色

    JAVA代码设置selector不同状态下的背景颜色

    这篇文章主要介绍了JAVA代码设置selector不同状态下的背景颜色,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-05-05
  • 浅谈Java编程中的synthetic关键字

    浅谈Java编程中的synthetic关键字

    这篇文章主要介绍了浅谈Java编程中的synthetic关键字的相关内容,包括其简单的介绍和实例,需要的朋友可以了解下。
    2017-09-09
  • 深度deepin安装以及jdk、tomcat、Nginx安装教程

    深度deepin安装以及jdk、tomcat、Nginx安装教程

    这篇文章主要给大家介绍了关于深度deepin安装以及jdk、tomcat、Nginx安装的相关资料,按照文中介绍的方法可以轻松的实现安装,对大家的工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-01-01
  • mybatis中${}和#{}取值的区别分析

    mybatis中${}和#{}取值的区别分析

    mybatis中使用sqlMap进行sql查询时,经常需要动态传递参数,在动态SQL解析阶段, #{ } 和 ${ } 会有不同的表现,这篇文章主要给大家介绍了关于mybatis中${}和#{}取值区别的相关资料,需要的朋友可以参考下
    2021-09-09
  • java获取json中的全部键值对实例

    java获取json中的全部键值对实例

    下面小编就为大家分享一篇java获取json中的全部键值对实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • Java基于Swing实现的打猎射击游戏代码

    Java基于Swing实现的打猎射击游戏代码

    这篇文章主要介绍了Java基于Swing实现的打猎射击游戏代码,包含完整的游戏事件处理与逻辑流程控制,具有不错的参考借鉴价值,需要的朋友可以参考下
    2014-11-11
  • springboot 高版本后继续使用log4j的完美解决方法

    springboot 高版本后继续使用log4j的完美解决方法

    这篇文章主要介绍了 springboot 高版本后继续使用log4j的解决方法,需要的朋友可以参考下
    2017-12-12
  • Java编程代码性能优化

    Java编程代码性能优化

    本文介绍了 Java 代码优化的过程,总结了优化 Java 程序的一些最佳实践,分析了进行优化的方法,并解释了性能提升的原因,需要的朋友可以参考下
    2015-11-11
  • Maven发布项目 (jar包) 到Nexus私服中的操作

    Maven发布项目 (jar包) 到Nexus私服中的操作

    这篇文章主要介绍了Maven发布项目 (jar包) 到Nexus私服中的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • 学习Java之自定义异常与NullPointerException的处理

    学习Java之自定义异常与NullPointerException的处理

    有时候Java自身提供的异常类并不能很好地表达我们的需求,所以这时候我们就可以自定义异常,也就是说,我们可以制造出一个自己的异常类,这样就可以抛出或捕获自己的异常了,本文就给大家详细讲讲Java自定义异常与NullPointerException的处理
    2023-08-08

最新评论