在这个世界上,一切都预先被谅解了,一切也就被卑鄙地许可了。——《不能承受的生命之轻》

写一个接口,用于测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import cn.hutool.core.thread.AsyncUtil;
import javax.annotation.Resource;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.concurrent.CompletableFuture;


@RestController
@RequestMapping("test")
public class TestController {

@Resource
private HttpServletRequest request;

@GetMapping("request")
public String request() {
AsyncUtil.get(CompletableFuture.runAsync(() -> {
String id = request.getParameter("id");
System.out.println(id);
}));
AsyncUtil.get(CompletableFuture.runAsync(() -> {
String id = request.getParameter("id");
System.out.println(id);
}));
return "";
}
}

我们请求一下

image-20220118160548784

发现抛出了异常

image-20220118160326487

我们在第一行加上这行代码:

1
RequestContextHolder.setRequestAttributes(RequestContextHolder.getRequestAttributes(), true);

成功获取

image-20220118160501199

尝试将这行代码放入拦截器,也成功生效

image-20220118160710865

这是因为源码中,如果我们传入inheritabletrue,则在NamedInheritableThreadLocal中设置值

该类继承了InheritableThreadLocal,因此可以在子线程共享变量

image-20220118160902067