本文主要是介绍SPRING-分布式环境下Springboot的登录如何保证session共享,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一个很简单的项目,需要介入到权限,于是我直接新建了几张权限用户表。由于该功能仅仅给后台的几个工作人员使用,登录用的很简单。在测试环境一直部署了一台,所以直接用的sessionId是没有问题的。但是部署到了正式环境,由于是分布式部分,平台直接部署了2个实例,这样用sessionId来判断是否登录就有问题了。
怎么解决,用spring-session-data-redis。该包是基于redis的。
引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>2.0.5.RELEASE</version></dependency><dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId><version>2.1.7.RELEASE</version></dependency>
增加配置代码
package com.dashboard.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;/*** 配置在redis中共享session*/
@Configuration
/*** 设置session的默认在redis中的存活时间*/
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)
public class SessionConfig {
}
package com.dashboard.auth;import com.dashboard.config.SessionConfig;
import org.springframework.session.web.context.AbstractHttpSessionApplicationInitializer;/*** 初始化*/
public class SessionInitializer extends AbstractHttpSessionApplicationInitializer {public SessionInitializer() {super(SessionConfig.class);}
}
##redis的配置
spring.redis.sentinel.master=redis1
spring.redis.sentinel.nodes=地址:2680,地址:2630
spring.redis.timeout=6000
spring.redis.database=0
spring.redis.lettuce.pool.max-active=16
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.min-idle=0
spring.redis.lettuce.pool.max-wait=-1ms
spring.redis.lettuce.shutdown-timeout=100ms
增加登录/校验代码
/*** * 登录-生成sessionId* @return*/@PostMapping("/login")public Result<AuthUser> login(HttpServletRequest request, String username, String password) {if (StringUtils.isBlank(username)||StringUtils.isBlank(password)){return Result.ofFail(-1, "Invalid username or password");}AuthUser authUser= new AuthUser();authUser.setId(22222);String sessionId= request.getSession().getId(); stringRedisTemplate.opsForValue().set(sessionId, gson.toJson(authUser),30, TimeUnit.MINUTES);return Result.ofSuccess();}else {return Result.ofFail(-1, "Invalid username or password");}
}
/*** * 通过获取sessionId来判断是否登录* @return*/public AuthUser getAuthUser( HttpServletRequest request) {String sessionId= request.getSession().getId();if (StringUtils.isNotBlank(sessionId)){String str = stringRedisTemplate.opsForValue().get(sessionId);if (StringUtils.isNotBlank(str)){return new Gson().fromJson(str, AuthUser.class);}else {return null;}}else {return null;}}
分布式环境下session是否一致
部署了多个实例,多次刷新列表,里面的SESSION一样,分布式环境下,session共享成功。
这篇关于SPRING-分布式环境下Springboot的登录如何保证session共享的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!