【java】【08】使用ThreadLocal保持当前HttpServletRequest和User对象对象

1.定义RequestAndUserHolder

package com.yinzhen.demo;

import javax.servlet.http.HttpServletRequest;

public class RequestAndUserHolder {

	private static final ThreadLocal<SysUser> userHolder = new ThreadLocal<SysUser>();

    private static final ThreadLocal<HttpServletRequest> requestHolder = new ThreadLocal<HttpServletRequest>();

    public static void addUser(SysUser sysUser) {
        userHolder.set(sysUser);
    }
    public static void addRequest(HttpServletRequest request) {
        requestHolder.set(request);
    }
    public static SysUser getCurrentUser() {
        return userHolder.get();
    }
    public static HttpServletRequest getCurrentRequest() {
        return requestHolder.get();
    }
    public static void remove() {
        userHolder.remove();
        requestHolder.remove();
    }
}

2.在登录Filter验证登录成功把user和request对象放到ThreadLocal中

3.在拦截器中的完成方法afterCompletion把user和request对象删除

RequestAndUserHolder.remove();

如果使用ThreadLocal进行线程隔离HttpServletRequest无效,可能是由于以下原因: 1. 线程池复用线程:如果您的应用程序使用线程池来处理请求,线程可能会被复用,而不是针对每个请求创建一个新的线程。这样会导致ThreadLocal中的HttpServletRequest对象在不同的请求之间被共享,无法实现线程隔离。 解决方法:可以尝试在每个请求处理完毕后,手动清除ThreadLocal中的HttpServletRequest对象,以确保下一个请求可以获得一个新的HttpServletRequest对象。 2. 请求被转发或异步处理:如果您的应用程序中存在请求转发或异步处理的情况,ThreadLocal中的HttpServletRequest对象可能无法正确传递给下游的处理器。这样也会导致线程隔离无效。 解决方法:在进行请求转发或异步处理时,需要手动将ThreadLocal中的HttpServletRequest对象传递给下游的处理器,以确保下游可以访问到正确的HttpServletRequest对象。 3. 框架或中间件干扰:某些框架或中间件可能会对HttpServletRequest对象进行处理或操作,可能会影响ThreadLocal使用。例如,一些框架可能会在请求到达时创建HttpServletRequest对象,并在处理完请求后销毁它。 解决方法:请检查您所使用的框架或中间件是否对HttpServletRequest对象进行了特殊处理,并参考它们的文档或示例代码,以确定如何正确地实现线程隔离。 如果以上解决方法仍然无效,可能需要更详细地了解您的应用程序环境和具体的代码实现,才能给出更准确的建议。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值