子线程获取主线程的Request对象问题

子线程获主线程HttpServletRequest对象

  • 需求
  • 解决问题
    • 利用ServletRequestAttributes
    • 继承HttpServletRequest对象
    • 继承HttpServletRequestWrapper
  • 测试案例

需求

需求:太平xxx异步执行流转逻辑。
简述:类似A调用B的业务,无需等待B执行结果,调用后立即返回。
坑:原有业务使用了HttpServletRequest对象,捆绑很深明显不适合修改代码。

解决问题

利用ServletRequestAttributes

比如网上很多人说的这个【请出门左转】:
在这里插入图片描述
该思路解决的是主线程存活情况下,不传递request参数而获取该对象。类型session缓存的模式,只要能拿到session的地方都能拿到session中存的值。

继承HttpServletRequest对象

继承这个需要实现所有的方法

继承HttpServletRequestWrapper

实现几个常见方法即可。
getSession、removeParameter、getSession、getParameter等按需实现即可。主要是需要把原reuest的参数拿到存放到继承后的类中即可

//我这里介于只需要getParameter、getSession
public class SystemRequest extends HttpServletRequestWrapper {
    //请求参数
    private Map params = new HashMap();
    //session参数
    private HttpSession session;
    //请求头
    private String remoteAddr = "";
    //请求头集合
    private Map headers = null;
    
    public SystemRequest(HttpServletRequest request) {
        super(request);
        this.remoteAddr = request.getRemoteAddr();
        this.params.putAll(request.getParameterMap());
        this.session = request.getSession();
        Enumeration<String> e = request.getHeaderNames();
        headers = new HashMap();
        while (e.hasMoreElements()) {
            String key = e.nextElement();
            headers.put(key, request.getHeader(key));
        }
    }
    @Override
    public Map getParameterMap() {
        return params;
    }

    @Override
    public String getParameter(String name) {
        Object obj = params.get(name);
        if (obj == null) {
            return "";
        }
        if (obj instanceof String[]) {
            return ((String[]) obj)[0];
        }
        return (String) obj;
    }
    public HttpSession getSession() {
        return session;
    }
    public String getRemoteAddr() {
        return remoteAddr;
    }
    public void removeParameter(String name) {
        params.remove(name);
    }
}

测试案例

子线程获取主线程的Request对象问题_第1张图片


欢迎访问系统搭建页面,功能持续建设中【https://blog.csdn.net/ljcc122/article/details/118250990】

你可能感兴趣的:(错误之解决,子线程获取主线程request,多线程获取request,子线程获取request空指针,继承Request对象,主线程与子线程销毁关系)