Spring Boot与Spring Session集成
1. 参考资料
- https://docs.spring.io/spring-session/docs/current/reference/html5/guides/boot-redis.html
- https://docs.spring.io/spring-boot/docs/2.0.2.RELEASE/reference/htmlsingle/#boot-features-session
2. 环境
Java: jdk1.8.0_144
Spring Boot: 2.0.1.RELEASE
3. 配置
本文前提是已使用Spring Boot搭建了一个Web应用,在此基础上集成Spring Session以使用Redis管理该应用的session
- 引入依赖包
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
- Spring Session配置
spring.session.store-type=redis
配置该属性后,应用启动时将创建名为springSessionRepositoryFilter
的过滤器,它负责在后台把javax.servlet.http.HttpSession
的实现替换为Spring Session,更多的配置示例
spring.session.redis.flush-mode=on-save
spring.session.redis.namespace=spring:session
server.servlet.session.timeout=1800
- Redis连接配置
spring.redis.host=127.0.0.1
spring.redis.password=123456
spring.redis.port=6379
应用将自动创建RedisConnectionFactory
并连接目标Redis Server
4. Redis存储结构
对象结构存入javax.servlet.http.HttpSession
,最终需要以字节或者字符的形式存入Redis,故可以指定序列化与反序列方法(例如org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer
),若未指定则使用JDK自带的java.io.Serializable
,以下面的类为例说明执行httpSession.setAttribute("verify", verify)
在使用不同序列化方法时的表现
public class Verify {
private String code;// 如 1 + 2
private Integer value;// 如 3
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public Integer getValue() {
return value;
}
public void setValue(Integer value) {
this.value = value;
}
}
java.io.Serializable
此时Verify类必须实现java.io.Serializable
接口,否则抛出异常
Caused by: java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [org.*.Verify]
at org.springframework.core.serializer.DefaultSerializer.serialize(DefaultSerializer.java:43)
at org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:63)
... 37 common frames omitted
Redis中的结构示例:
127.0.0.1:6379> keys *
1) "spring:session:sessions:d850410a-557d-4b01-b194-9af0c3336517"
2) "spring:session:expirations:1529485860000"
3) "spring:session:sessions:expires:d850410a-557d-4b01-b194-9af0c3336517"
127.0.0.1:6379> HGETALL spring:session:sessions:d850410a-557d-4b01-b194-9af0c3336517
1) "maxInactiveInterval"
2) "\xac\xed\x00\x05sr\x00\x11java.lang.Integer\x12\xe2\xa0\xa4\xf7\x81\x878\x02\x00\x01I\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\a\b"
3) "sessionAttr:verify"
4) "\xac\xed\x00\x05sr\x00 org.lxp.dailylog.web.util.Verify\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x02L\x00\x04codet\x00\x12Ljava/lang/String;L\x00\x05valuet\x00\x13Ljava/lang/Integer;xpt\x00\a1 + 5=?sr\x00\x11java.lang.Integer\x12\xe2\xa0\xa4\xf7\x81\x878\x02\x00\x01I\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x00\x06"
5) "creationTime"
6) "\xac\xed\x00\x05sr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x01d\x1cZSC"
7) "lastAccessedTime"
8) "\xac\xed\x00\x05sr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x01d\x1cZSC"
127.0.0.1:6379>
org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
@Configuration
public class JedisConfig {
@Bean
public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
return new Jackson2JsonRedisSerializer<>(Object.class);
}
}
Redis中的结构示例:
127.0.0.1:6379> keys *
1) "spring:session:expirations:1529486220000"
2) "spring:session:sessions:expires:8a804a79-862e-4e05-9fc0-e8db7cbf33f9"
3) "spring:session:sessions:8a804a79-862e-4e05-9fc0-e8db7cbf33f9"
127.0.0.1:6379> HGETALL spring:session:sessions:8a804a79-862e-4e05-9fc0-e8db7cbf33f9
1) "lastAccessedTime"
2) "1529484404321"
3) "sessionAttr:verify"
4) "{\"code\":\"8 + 10=?\",\"value\":18}"
5) "maxInactiveInterval"
6) "1800"
7) "creationTime"
8) "1529484404321"
Spring Boot与Spring Session集成的更多相关文章
- Spring Boot微服务如何集成fescar解决分布式事务问题?
什么是fescar? 关于fescar的详细介绍,请参阅fescar wiki. 传统的2PC提交协议,会持有一个全局性的锁,所有局部事务预提交成功后一起提交,或有一个局部事务预提交失败后一起回滚,最 ...
- spring boot + redis 实现session共享
这次带来的是spring boot + redis 实现session共享的教程. 在spring boot的文档中,告诉我们添加@EnableRedisHttpSession来开启spring se ...
- Spring Boot与Spring MVC集成启动过程源码分析
开源项目推荐 Pepper Metrics是我与同事开发的一个开源工具(https://github.com/zrbcool/pepper-metrics),其通过收集jedis/mybatis/ht ...
- spring boot通过Spring Data Redis集成redis
在spring boot中,默认集成的redis是Spring Data Redis,Spring Data Redis针对redis提供了非常方便的操作模版RedisTemplate idea中新建 ...
- Spring Boot 2.0 快速集成整合消息中间件 Kafka
欢迎关注个人微信公众号: 小哈学Java, 每日推送 Java 领域干货文章,关注即免费无套路附送 100G 海量学习.面试资源哟!! 个人网站: https://www.exception.site ...
- Spring Boot与ActiveMQ的集成
Spring Boot对JMS(Java Message Service,Java消息服务)也提供了自动配置的支持,其主要支持的JMS实现有ActiveMQ.Artemis等.本节中,将以Active ...
- spring boot与ElasticSearch的集成
本文主要介绍Spring boot与ElasticSearch的集成,因为Spring boot的教程以及ElasticSearch的学习其他博客可能更优秀,所以建议再看这篇文章前先学习学习一下Spr ...
- Nacos Config客户端与Spring Boot、Spring Cloud深度集成
目录 Nacos与Spring Boot集成 @NacosPropertySource和@NacosValue com.alibaba.nacos.spring.core.env.NacosPrope ...
- Spring Boot 微服务应用集成Prometheus + Grafana 实现监控告警
Spring Boot 微服务应用集成Prometheus + Grafana 实现监控告警 一.添加依赖 1.1 Actuator 的 /prometheus端点 二.Prometheus 配置 部 ...
- Spring Boot 2.x 快速集成Kafka
1 Kafka Kafka是一个开源分布式的流处理平台,一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据.Kafka由Scala和Java编写,2012年成为Apache ...
随机推荐
- 深入理解iPhone数据持久化(手把手教你iphone开发 – 基础篇)
在所有的移动开发平台数据持久化都是很重要的部分:在j2me中是rms或保存在应用程序的目录中,在symbian中可以保存在相应的磁盘目录中和数据库中.symbian中因为权限认证的原因,在3rd上大多 ...
- Django-权限信息初始化
数据库 from django.db import models class Menu(models.Model): """ 菜单组: """ ...
- appium server参数
转自: http://m.blog.csdn.net/blog/kittyboy0001/40893979 appium Appium是一个开源的,适用于原生或混合移动应用应用( hybrid mob ...
- [Android]Android5.0实现静默接听电话功能
原因: android曾经能够通过AIDL进行静默接听.可是5.0以后就被谷歌给屏蔽了.这时候我们仅仅能通过其它方式实现了. 解决方式: try { Runtime.getRuntime().exec ...
- T-SQL查询进阶--变量
概述 变量对于一种语言是必不可少的一部分,当然,对于T-SQL来讲也是一样.在简单查询中,往往很少用到变量,但无论对于复杂的查询或存储过程中,变量都是必不可少的一部分. 变量的种类 在T-SQL中,变 ...
- Struts2的配置文件——web.xml
任何MVC框架都需要与Web应用整合,这就不得不借助于web.xml文件,只有配置在web.xml文件中Servlet才会被应用加载. 通常,所有的MVC框架都需要Web应用加载一个核心控制器,对于S ...
- react项目中的注意点
一.ES6 的编译方法 目前主流的浏览器还不支持ES6. 现在一般采用webpack 和 <script type="text/babel">对jsx 语法进行编译, ...
- SDUT OJ 1221 亲和数 (找出某个数n所有的因子数,只需要暴力:2->sqrt(n) 即可 )
亲和数 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 如果a的因子和等于b,b的因子和等于a,且a≠b,则称a,b为亲和数对. ...
- POJ2752 Seek the Name, Seek the Fame —— KMP next数组
题目链接:https://vjudge.net/problem/POJ-2752 Seek the Name, Seek the Fame Time Limit: 2000MS Memory Li ...
- stl里面的空间适配器
一般而言,如果频繁地向system heap申请和释放空间很小的内存空间块(小于128B的),就会对系统内存资源产生很多内存碎片(fragment)的问题,而C++的::operator new() ...