配置拦截器拦截用户登录保存用户信息到Redis中 并且用户退出登录时从Redis中清除
时间: 2024-05-08 13:16:10 浏览: 15
在Spring Boot中配置拦截器可以通过实现HandlerInterceptor接口来实现,具体步骤如下:
1. 创建一个拦截器类,实现HandlerInterceptor接口,并实现其三个方法preHandle、postHandle和afterCompletion。
```java
public class LoginInterceptor implements HandlerInterceptor {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 在请求处理之前进行拦截处理
String token = request.getHeader("Authorization");
if (StringUtils.isBlank(token)) {
throw new RuntimeException("未登录");
}
// 从Redis中获取用户信息
Object userInfo = redisTemplate.opsForValue().get(token);
if (userInfo == null) {
throw new RuntimeException("登录已失效,请重新登录");
}
// 将用户信息存放到request中,方便后续处理
request.setAttribute("userInfo", userInfo);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 在请求处理之后进行拦截处理
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 请求处理完成后进行拦截处理
}
}
```
2. 在Spring Boot配置类中注册拦截器
```java
@Configuration
public class WebAppConfig implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册拦截器
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**") // 拦截所有请求
.excludePathPatterns("/login", "/logout"); // 排除登录和退出登录请求
}
}
```
3. 在用户登录成功后将用户信息保存到Redis中,并将token作为响应头返回给客户端
```java
@PostMapping("/login")
public String login(@RequestParam("username") String username,
@RequestParam("password") String password,
HttpServletResponse response) {
// 校验用户名和密码
// ......
// 生成token
String token = UUID.randomUUID().toString();
// 将用户信息存放到Redis中
redisTemplate.opsForValue().set(token, userInfo, 30, TimeUnit.MINUTES);
// 将token作为响应头返回给客户端
response.setHeader("Authorization", token);
return "登录成功";
}
```
4. 在用户退出登录时从Redis中清除用户信息
```java
@PostMapping("/logout")
public String logout(HttpServletRequest request) {
// 从request中获取用户信息
Object userInfo = request.getAttribute("userInfo");
if (userInfo == null) {
return "未登录";
}
// 从Redis中清除用户信息
redisTemplate.delete(token);
return "退出登录成功";
}
```