子线程获主线程HttpServletRequest对象
需求
需求:太平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);
}
}
测试案例
欢迎访问系统搭建页面,功能持续建设中【https://blog.csdn.net/ljcc122/article/details/118250990】
版权声明:本文为ljcc122原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。