在springboot2.0版本之前,大家使用redis+springboot来实现session分布式共享的方式可能如下
1、pom.xml引入如下依赖
<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写入类似如下内容
spring.redis.host=localhost spring.redis.port=6379
3、写个开启http session的配置类
@Configuration @EnableRedisHttpSession public class RedisSessionConfig { }
按以上3个步骤就可以实现session分布式共享,而在2.1.x以上的版本(ps:本文实验springboot版本为2.1.5版本,jdk8),虽然实现步骤和大致一样,但是多了一些额外的细节,比如pom,要额外引入
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
否则可能会出现如下异常
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已经被弃用,因此可以采用权限过滤规则,如下配置
@Configurationpublic class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override public void configure(WebSecurity web) throws Exception {
web.ignoring().anyRequest(); }
}
允许所有请求,就相当于security失效。在之前版本的seesion共享基础上,额外补充实现上述的2点,就可以实现session共享,不过此时如果你查看控制台的话,还是会发现有如下内容
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,如下
@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配置如下内容
logging: level: web: trace
就会输出controller路由信息了,输出形如
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)