(1)使用多线程时有时候会碰到子线程获取不到主线程的request的请求头信息,可以通过下面的代码让子线程获取父线程的请求头信息,前提是在执行子线程的时候父线程还在没有提前结束,如果父线程提前结束的话就会删除请求头信息,此时子线程获取请求头信息亦然是获取不到。此方法中的父线程需要等待子线程执行结束的情况。
//获取父线程的请求头信息
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
//在子线程中设置父线程的请求头信息
RequestContextHolder.setRequestAttributes(requestAttributes);
//或者在父线程中设置请求头为父线程与子线程共享
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
RequestContextHolder.setRequestAttributes(requestAttributes,true);
(2)如果父线程不需要等待子线程执行结束的情况下,提前结束的情况下。一是可以提前将父线程中的请求头信息获取到传入子线程中。二是将需要请求头的代码段放在父线程中去执行或者取消异步将代码都放在同一个线程中,这样就违背的设置多线程的初中。
public String getCurrentThreadHeaderInto(){
ServletRequestAttributes attributes =(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attributes != null) {
HttpServletRequest request = attributes.getRequest();
return request.getHeader("key");
}
return StrUtil.EMPTY;
}