拦截器+ThreadLocal验证用户

本文介绍了如何结合ThreadLocal和拦截器(Interceptor)进行用户验证。首先讲解了ThreadLocal类的基本概念,接着详细阐述了拦截器的编写步骤,并展示了在XML中配置拦截器的方法。最后,通过实例说明了在实际应用中的具体使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ThreadLocal 类定义

public class UserContext {
   
   	public static final ThreadLocal<String> USER_NAME = new ThreadLocal<>();
}

拦截器编写

@Component
public class UserSecurityInterceptor implements HandlerInterceptor {
   

    public static final Logger logger = LoggerFactory.getLogger(UserSecurityInterceptor.class);

    @Autowired
    private UserInfoCacheManager userInfoCacheManager;
    
    // 方法处理之前执行
    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
   
        response.setHeader("Access-Control-Allow-Origin", request.getHeader("origin"));
        response.setHeader("Access-Control-Allow-Headers"</
### 使用 ThreadLocal 在 Spring 拦截器中保存和传递用户信息 #### 1. 定义 ThreadLocal 存储用户信息 为了在线程内安全地存储用户信息,定义一个静态 `ThreadLocal` 变量来持有这些信息。这确保了每个线程都有自己独立的副本。 ```java public class UserContextHolder { private static final ThreadLocal<UserInfo> userContext = new ThreadLocal<>(); public static void setUser(UserInfo userInfo) { userContext.set(userInfo); } public static UserInfo getUser() { return userContext.get(); } public static void clearUser() { userContext.remove(); } } ``` 此代码片段展示了如何通过 `ThreadLocal` 来封装用户的上下文信息[^3]。 #### 2. 创建自定义拦截器 接下来,在 Spring MVC 中配置一个拦截器,以便可以在请求处理的不同阶段捕获并设置用户信息到 `ThreadLocal` 中。 ```java import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; @Component public class UserContextInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String userId = extractUserIdFromRequest(request); // 假设这里是从请求头或其他地方获取用户ID的方法 if (userId != null && !userId.isEmpty()) { UserInfo userInfo = new UserInfo(userId); UserContextHolder.setUser(userInfo); } return true; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { UserContextHolder.clearUser(); // 请求结束后清理ThreadLocal中的数据 } private String extractUserIdFromRequest(HttpServletRequest request) { // 这里可以根据实际情况调整逻辑,比如从JWT令牌、Cookie或HTTP头部提取用户ID return request.getHeader("X-User-ID"); } } ``` 这段代码实现了在每次 HTTP 请求到达之前读取用户 ID 并将其存入 `ThreadLocal` 的功能;当请求完成之后,则清除掉这个临时存储的数据以防止内存泄漏[^1]。 #### 3. 注册拦截器 为了让上述拦截器生效,还需要把它注册到应用程序的全局过滤链路当中去: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private UserContextInterceptor userContextInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(userContextInterceptor).addPathPatterns("/**"); // 应用于所有路径下的API调用 } } ``` 以上就是完整的流程说明以及具体实现方式,利用 `ThreadLocal` 和 Spring 提供的拦截机制能够有效地在整个请求生命周期内保持住必要的用户身份验证信息而不必每次都手动传递它们[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值