UserLoginInterceptor
这段代码定义了一个名为 `UserLoginInterceptor` 的拦截器,用于拦截用户登录请求,在用户登录时进行身份验证和用户信息存储。接下来我会逐一解释代码中使用到的各个部分:
1. `package com.cqupt.software_1.intercepter;`:声明了拦截器所在的包路径。
2. 导入了必要的类和注解,包括 Spring 相关的注解和接口。
3. `@Component`、`public class UserLoginInterceptor implements HandlerInterceptor` 类:标记这是一个 Spring 组件,并实现了 Spring MVC 的 `HandlerInterceptor` 接口,用于进行请求拦截和处理。
4. `@Autowired UserService userService;`:自动注入了 `UserService` 接口,用于处理用户相关的逻辑。
5. `preHandle` 方法:在请求处理前执行的方法,用于对用户登录状态进行验证。首先尝试从请求中获取用户ID,然后根据用户ID查询用户信息,并使用 `UserThreadLocal` 类存储用户信息在当前线程中。如果用户已登录,则返回 `true`,否则返回 `false`。
6. `afterCompletion` 方法:在请求处理完成后执行的方法,用于清除当前线程中存储的用户信息,确保不会出现线程安全问题。
通过这个拦截器,可以实现对用户登录状态的拦截和处理,确保用户在进行相关操作时已登录且可以获取到相应的用户信息。这对于系统安全性和用户身份识别非常重要。
package com.cqupt.software_1.intercepter;
import com.cqupt.software_1.common.UserThreadLocal;
import com.cqupt.software_1.entity.User;
import com.cqupt.software_1.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class UserLoginInterceptor implements HandlerInterceptor {
@Autowired
UserService userService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Integer userId = (Integer)request.getSession().getAttribute("userId");
if(userId!=null){
User user = userService.getUserById(userId);
UserThreadLocal.put(user);
return true;
}
System.out.println("没有携带cookie");
return false;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
UserThreadLocal.remove();
}
}