基于Spring Boot/Spring Session/Redis的分布式Session共享解决方案
分布式Web网站一般都会碰到集群session共享问题,之前也做过一些Spring3的项目,当时解决这个问题做过两种方案,一是利用nginx,session交给nginx控制,但是这个需要额外工作较多;还有一种是利用一些tomcat上的插件,修改tomcat配置文件,让tomcat自己去把Session放到Redis/Memcached/DB中去。这两种各有优缺,也都能解决问题。
但是现在项目全线Spring Boot,并不自己维护Tomcat,而是由Spring去启动Tomcat。这样就会有一个问题:在服务器上并不存在一个持久存在的Tomcat程序,这样也无从去修改Tomcat的配置文件了。经过了一番搜索,发现Spring果然对这个问题有自己的解决方案,那就是Spring-Session.
Spring-Session是通过过滤器实现的session共享,具体原理可以自己去官网查,这里只说一下如何配置。整个项目基于Spring Boot,如果不是Boot项目就需要自己去调整了。
项目需要先准备一个Redis服务,在本地启动一个即可。还需要有一个已经使用session但是未做session共享的Spring Boot项目,下面我就讲述一下如何给这个项目加上基于redis的session共享。
引入依赖
首先,要在maven中加入以下依赖:
- <dependencies>
- <!-- ... -->
- <dependency>
- <groupId>org.springframework.session</groupId>
- <artifactId>spring-session</artifactId>
- <version>1.2.2.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-redis</artifactId>
- </dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>1.2.2.RELEASE</version>
<type>pom</type>
</dependency>
- </dependencies>
这些就是Spring-Session和Redis相关的依赖。
配置Redis
在项目目前在使用的properties文件中,加入如下配置:
- spring.redis.host=localhost
- spring.redis.password=secret
- spring.redis.port=6379
host就是redis地址,password为密码,port为端口号。
Spring配置
在项目的目录中,创建一个Config.java文件(名称随意)
- @Configuration
- @EnableRedisHttpSession
- public class Config {
- @Bean
- public JedisConnectionFactory connectionFactory() {
- return new JedisConnectionFactory();
- }
- }
@EnableRedisHttpSession这个注解就是最重要的东西,加了它之后,spring生产一个新的拦截器,用来实现Session共享的操作,具体实现这里暂不展开。而配置的这个Bean,则是让Spring根据配置文件中的配置连到Redis。
如果不使用Security,下面的几步就不用做了,这个类中配置的Bean也不用配置。
Spring Security 配置
在项目中添加该类:
- public class SecurityInitializer extends AbstractSecurityWebApplicationInitializer {
- public SecurityInitializer() {
- super(SecurityConfig.class, Config.class);
- }
- }
super()的第二个参数,就是我们上面的那个Config文件。添加这个配置文件后,Spring Security就会把Session放到Redis中,这样基于Spring Security的项目也可以实现Session共享了。
Initializer 配置
这一步写法异常简单,还是创建文件:
- public class Initializer extends AbstractHttpSessionApplicationInitializer {
- }
就这样,继承一个类即可。
大功告成!简单的超乎想像,这就是Spring Boot的优势所在。下面我们来自己登录一下,看看Spring Security是否把Session放到Redis中。
(登录过程我就不讲了,,在自己项目中调用一下Security的登录即可)
然后用redis-cli连接到redis,执行keys *
会看到如下:
你会发现redis里多了一堆以spring:session:***为key的东西,这样就说明Spring Security确实把Session放到了我们配置的redis中。这样就可以实现session共享了。
基于Spring Boot/Spring Session/Redis的分布式Session共享解决方案的更多相关文章
- Spring Boot 应用使用spring session+redis启用分布式session后,如何在配置文件里设置应用的cookiename、session超时时间、redis存储的namespace
现状 项目在使用Spring Cloud搭建微服务框架,其中分布式session采用spring session+redis 模式 需求 希望可以在配置文件(application.yml)里设置应用 ...
- Spring Session + Redis实现分布式Session共享
发表于 2016-09-29 文章目录 1. Maven依赖 2. 配置Filter 3. Spring配置文件 4. 解决Redis云服务Unable to configure Redis to k ...
- spring boot 中使用redis session
spring boot 默认的httpsession是存在内存中.这种默认方式有几个缺点:1.当分布式部署时,存在session不一致的问题:2.当服务重启时session就会丢失,这时候用户就需要重 ...
- 170222、使用Spring Session和Redis解决分布式Session跨域共享问题
使用Spring Session和Redis解决分布式Session跨域共享问题 原创 2017-02-27 徐刘根 Java后端技术 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用 ...
- 使用Spring Session和Redis解决分布式Session跨域共享问题
http://blog.csdn.net/xlgen157387/article/details/57406162 使用Spring Session和Redis解决分布式Session跨域共享问题
- Spring Boot+Spring Security:获取用户信息和session并发控制
说明 (1)JDK版本:1.8(2)Spring Boot 2.0.6(3)Spring Security 5.0.9(4)Spring Data JPA 2.0.11.RELEASE(5)hiber ...
- Spring Boot + MyBatis + Druid + Redis + Thymeleaf 整合小结
Spring Boot + MyBatis + Druid + Redis + Thymeleaf 整合小结 这两天闲着没事想利用**Spring Boot**加上阿里的开源数据连接池**Druid* ...
- Cola Cloud 基于 Spring Boot, Spring Cloud 构建微服务架构企业级开发平台
Cola Cloud 基于 Spring Boot, Spring Cloud 构建微服务架构企业级开发平台: https://gitee.com/leecho/cola-cloud
- Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session框架
Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session import tornado.ioloop import tornado.web from myhas ...
随机推荐
- Thinkpad T420 指纹开机 win10 解决方案
以前没感觉笔记本上的指纹有什么用,后来无意看到了指纹能开机.便尝试把这个功能给用起来.果然麻烦了些. 1.官网上没有win10的指纹应用软件. 下载了win8的版本,安装后没有问题,可以登录win10 ...
- PHP中CURL方法curl_setopt()函数的一些参数
bool curl_setopt (int ch, string option, mixed value)curl_setopt()函数将为一个CURL会话设置选项.option参数是你想要的设置,v ...
- html中meta的介绍
前言 meta是html语言head区的一个辅助性标签.也许你认为这些代码可有可无.其实如果你能够用好meta标签,会给你带来意想不到的效果,meta标签的作用有:搜索引擎优化(SEO),定义页面使用 ...
- 内存的crash记录分析
服务器上线之后,发生了3次crash,感觉是一次比较典型的内存bug的排错经历,所以特地记录下来供以后借鉴.下面描述一下3次crash时候的coredump的当前堆栈信息. 第一次crash的core ...
- (原创)MongoDB之NoSQL简介
Nosql简介1.1系统对数据的需求 Nosql[Nosql主要用途大数据处理]的全称为”not only sql”,为非关系型数据库[非关系型数据库就是关系型数据库的所有特点都没有了, ...
- tab切换效果
选项卡是一个神奇的网页效果,不论大小网站,比如B2B像阿里巴巴,慧聪网,还有B2C这个不用说了吧,爱逛网店的童鞋们都知道的,像京东商城,淘宝网,拍拍网,一号店,凡客诚品,等等各种网各种网店,选项卡不仅 ...
- serialVersionUID的作用
Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的seri ...
- JavaScript变量作用域
全部变量拥有全局作用域,局部变量拥有局部作用域(这里注意函数的参数也是局部变量) 1.在函数体内,局部变量的优先级高于同名的全局变量. 我的理解就是当你同时定义了同名的局部变量和全局变量时,函数体内返 ...
- Swift—继承
一个类可以继承另一个类的方法,属性和其他特性.当一个类继承其他类时,继承类叫子类,被继承类叫超类(或父类).在Swift中,继承具有单继承的特点,每个子类只有一个直接父类,继承是区分类与其他类型的一个 ...
- 集合框架(JCF/Java Collection Framework)
集合的特点:1.数据的类型可以不同2.集合长度可变3.空间不固定集合也是对象,用于检索,存储以及传输对象集合框架的组成Collection接口和Map接口 Collection是Set接口和List接 ...