1. 参考资料

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集成的更多相关文章

  1. Spring Boot微服务如何集成fescar解决分布式事务问题?

    什么是fescar? 关于fescar的详细介绍,请参阅fescar wiki. 传统的2PC提交协议,会持有一个全局性的锁,所有局部事务预提交成功后一起提交,或有一个局部事务预提交失败后一起回滚,最 ...

  2. spring boot + redis 实现session共享

    这次带来的是spring boot + redis 实现session共享的教程. 在spring boot的文档中,告诉我们添加@EnableRedisHttpSession来开启spring se ...

  3. Spring Boot与Spring MVC集成启动过程源码分析

    开源项目推荐 Pepper Metrics是我与同事开发的一个开源工具(https://github.com/zrbcool/pepper-metrics),其通过收集jedis/mybatis/ht ...

  4. spring boot通过Spring Data Redis集成redis

    在spring boot中,默认集成的redis是Spring Data Redis,Spring Data Redis针对redis提供了非常方便的操作模版RedisTemplate idea中新建 ...

  5. Spring Boot 2.0 快速集成整合消息中间件 Kafka

    欢迎关注个人微信公众号: 小哈学Java, 每日推送 Java 领域干货文章,关注即免费无套路附送 100G 海量学习.面试资源哟!! 个人网站: https://www.exception.site ...

  6. Spring Boot与ActiveMQ的集成

    Spring Boot对JMS(Java Message Service,Java消息服务)也提供了自动配置的支持,其主要支持的JMS实现有ActiveMQ.Artemis等.本节中,将以Active ...

  7. spring boot与ElasticSearch的集成

    本文主要介绍Spring boot与ElasticSearch的集成,因为Spring boot的教程以及ElasticSearch的学习其他博客可能更优秀,所以建议再看这篇文章前先学习学习一下Spr ...

  8. Nacos Config客户端与Spring Boot、Spring Cloud深度集成

    目录 Nacos与Spring Boot集成 @NacosPropertySource和@NacosValue com.alibaba.nacos.spring.core.env.NacosPrope ...

  9. Spring Boot 微服务应用集成Prometheus + Grafana 实现监控告警

    Spring Boot 微服务应用集成Prometheus + Grafana 实现监控告警 一.添加依赖 1.1 Actuator 的 /prometheus端点 二.Prometheus 配置 部 ...

  10. Spring Boot 2.x 快速集成Kafka

    1 Kafka Kafka是一个开源分布式的流处理平台,一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据.Kafka由Scala和Java编写,2012年成为Apache ...

随机推荐

  1. 使用SourceTree 来管理 Gitcafe 的Pages 发布Blog!

    有个好爹的 SourceTree 是来自 JIRA 的娘家 Bitbucket 的新东家 ATLASSIAN.com 一家成功的,对敏捷软件工程拥有全栈式支持的商业公司, 所推出的 MAC 专用, S ...

  2. 配置 yum 源相关

    1. 修改yum配置 http://www.cnblogs.com/shuaixf/archive/2011/11/30/2268496.html 2. centos安装 epel 源 https:/ ...

  3. 图片异步载入之 Android-Universal-Image-Loader

    今天在做项目的时候用了之前写的图片载入类.尽管也能实现缓存什么的.可是在载入大图的时候非常慢非常慢.于是上网找解决方式,准备优化一下,无意中发现了Android-Universal-Image-Loa ...

  4. android menu事件

    @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(0,1,1,R.string.exit); menu.add(0, ...

  5. hihoCoder 1234 fractal

    #1234 : Fractal 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 This is the logo of PKUACM 2016. More specific ...

  6. iOS之UI--涂鸦画板实例

     iOS之UI--涂鸦画板实例  首先是搭建框架 其他的略过,直接展示效果: 然后接下来上传搭建好两个控制器框架的源码百度云下载链接: http://pan.baidu.com/s/1skjpDox  ...

  7. WPF绑定各种数据源之object数据源

    一.WPF绑定各种数据源索引 WPF 绑定各种数据源之Datatable WPF绑定各种数据源之object数据源 WPF绑定各种数据源之xml数据源 WPF绑定各种数据源之元素控件属性 Bindin ...

  8. 全局钩子 实例(不使用DLL和使用DLL两种)

    大家应该都知道,全局消息钩子要依赖于一个DLL才能够正常工作.于是呢,我也就理所当在地认为全局钩子都要依赖于一个DLL才能正常工作的,我想大部分人肯定和我一样也这么认为的. 但实际上不是这样的.有某些 ...

  9. 2016/05/25 抽象类与API(接口)差别

    简单来说, 接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的, 另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的 ...

  10. 【bzoj3671】[Noi2014]随机数生成器

    优先按照它说明的方法处理数组 然后为了让数列中尽可能多的出现小的数字 所以1是必须要出现的,这样才能使整个数列的排序后字典序最小. 我们思考,如果2也能在这个数列中那就最好不过了 但是2有可能不在这个 ...