前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用springboot2.1.x+redis来实现session共享采坑实录

使用springboot2.1.x+redis来实现session共享采坑实录

作者头像
lyb-geek
发布2019-05-29 00:26:51
1.4K0
发布2019-05-29 00:26:51
举报
文章被收录于专栏:Linyb极客之路

在springboot2.0版本之前,大家使用redis+springboot来实现session分布式共享的方式可能如下

1、pom.xml引入如下依赖

代码语言:javascript
复制
<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>  </dependency>  

2、application.properties写入类似如下内容

代码语言:javascript
复制
spring.redis.host=localhost  spring.redis.port=6379  

3、写个开启http session的配置类

代码语言:javascript
复制
@Configuration  @EnableRedisHttpSession  public class RedisSessionConfig {  }  

按以上3个步骤就可以实现session分布式共享,而在2.1.x以上的版本(ps:本文实验springboot版本为2.1.5版本,jdk8),虽然实现步骤和大致一样,但是多了一些额外的细节,比如pom,要额外引入

代码语言:javascript
复制
        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-security</artifactId>        </dependency>

否则可能会出现如下异常

代码语言:javascript
复制
    Caused by: java.lang.ClassNotFoundException: org.springframework.security.web.authentication.RememberMeServices

而引入spring-boot-starter-security模块时,默认是会有一个表单验证登陆,如下图

当我们权限框架不是用security,而是其他权限框架比如shiro等,此时我们是不需要security提供的表单验证。而不需要security提供的表单验证的方式有两种,一种是直接禁用security,第二种是配置security权限过滤规则,而在2.1.x后面的版本,security.basic.enabled = false已经被弃用,因此可以采用权限过滤规则,如下配置

代码语言:javascript
复制
    @Configurationpublic class WebSecurityConfig extends WebSecurityConfigurerAdapter {
  @Override  public void configure(WebSecurity web) throws Exception {
    web.ignoring().anyRequest();  }

}

允许所有请求,就相当于security失效。在之前版本的seesion共享基础上,额外补充实现上述的2点,就可以实现session共享,不过此时如果你查看控制台的话,还是会发现有如下内容

代码语言:javascript
复制
 2019-05-25 13:20:54.468  INFO 17976 --- [  restartedMain] .s.s.UserDetailsServiceAutoConfiguration : 
Using generated security password: 274c0d40-f297-485d-867b-11d0ef405700

如果不想输出上面的内容,可以在启动类上排除UserDetailsServiceAutoConfiguration类@SpringBootApplication(exclude = {UserDetailsServiceAutoConfiguration.class}),或者重新注入一个UserDetailsService,如下

代码语言:javascript
复制
   @Bean  public UserDetailsService userDetailsService() {
    return (userName) -> {      return null;    };
  }

总结

用springboot2.1.x+redis来实现session分布式共享,和之前springboot实现的方式大致上没有区别,唯一的区别就是要额外引入security包模块,主要是springboot2.1.x的spring-session-data-redis额外又实现了RememberMe功能。

此外说个题外话,spring2.1.x后边的版本,控制台默认不会输出controller相关路由信息,比如/user/{id},这在一定程度上会影响调试。如果要让控制台输出路由信息,可在application.yml配置如下内容

代码语言:javascript
复制
  logging:  level:    web: trace

就会输出controller路由信息了,输出形如

代码语言:javascript
复制
 c.d.a.r.c.RoleController:    {POST /role/add}: add(RoleAddRequest)    {POST /role/get}: get()    {POST /role/del}: del(RoleDelRequest)    {POST /role/edit}: edit(RoleEditRequest)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Linyb极客之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档