springboot redis 单点登录
时间: 2025-05-27 07:33:37 浏览: 41
### Spring Boot 使用 Redis 实现单点登录方案
在现代企业级应用开发中,单点登录(SSO)是一个常见的需求。以下是基于 Spring Boot 和 Redis 的单点登录实现方案。
#### 配置 Redis 连接
首先,在 `application.properties` 文件中配置 Redis 的连接信息。这些参数定义了如何与 Redis 数据库交互[^1]:
```properties
spring.redis.database=0
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=123456
spring.redis.lettuce.pool.min-idle=5
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-wait=1ms
spring.redis.lettuce.shutdown-timeout=100ms
```
以上配置项涵盖了数据库编号、主机地址、端口以及密码等基本信息,并设置了 Lettuce 连接池的相关属性以优化性能。
#### 创建自定义拦截器
为了实现单点登录的功能,可以通过创建一个自定义拦截器来验证用户的会话状态。以下是一个典型的拦截器类示例[^2]:
```java
package cn.xiaohe.config;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class RedisSessionInterceptor {
private static final String SESSION_KEY = "user_session";
public boolean preHandle(HttpServletRequest request, HttpServletResponse response) throws Exception {
String token = request.getHeader("Authorization");
if (token != null && validateToken(token)) {
return true; // 如果令牌有效,则允许请求继续处理
}
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
return false; // 否则返回未授权错误
}
private boolean validateToken(String token) {
// 在此方法中可以调用 Redis 来校验 Token 是否存在并合法
// 示例逻辑:从 Redis 中获取对应键值的数据是否存在且未过期
return false;
}
}
```
该拦截器会在每次 HTTP 请求到达控制器之前执行预处理操作,主要负责检查请求头中的认证信息是否匹配存储于 Redis 中的有效记录。
#### 注册拦截器到全局配置
接着需要将这个拦截器注册至整个应用程序上下文中以便生效。这通常是在 Web 安全配置类里完成的[^2]:
```java
@Configuration
public class WebSecurityConfig extends WebMvcConfigurerAdapter {
@Bean
public RedisSessionInterceptor getSessionInterceptor() {
return new RedisSessionInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(getSessionInterceptor())
.addPathPatterns("/api/**")
.excludePathPatterns("/api/user/login");
}
}
```
这里指定了哪些 URL 路径应当受到保护(即 `/api/**`),同时也明确了例外情况——比如登录接口不需要被拦截。
#### 登录成功后的 Token 存储
当用户成功登录之后,服务器应该生成唯一标识符作为 session ID 或者 JSON Web Tokens(JWT),并将它们存入 Redis 缓存服务当中。下面给出了一种可能的方式[^5]:
```java
String sessionId = UUID.randomUUID().toString();
stringRedisTemplate.opsForValue()
.set(sessionId, userJsonData,
SecretConstant.EXPIRESSECOND, TimeUnit.MILLISECONDS);
response.setHeader("Authorization", sessionId);
```
这段代码片段展示了如何利用 Spring Data Redis 提供的操作 API 将新产生的 Session ID 关联的具体数据保存下来,同时还设定了有效期。
#### 总结说明
综上所述,通过合理运用 Spring Boot 框架所提供的组件配合高性能 NoSQL 解决方案 Redis ,能够轻松构建起一套稳定可靠的单点登录体系结构。它不仅简化了跨域资源访问管理难题,而且极大地提升了用户体验满意度。
阅读全文
相关推荐


















