比如 controller 是这样的
@RestController
public class TestController{
@GetMapping(value="/test")
public CompletableFuture<Object> testController(){
.....
return CompletableFuture.completedFuture(service())
}
1.这种情况,当使用拦截器 preHandle 那里会执行 2 次输出结果
public Callable<Object> getTokenService(HttpSession httpSession) {
Map<String, Object> map = new HashMap<>(8);
String token = UUID.randomUUID().toString();
httpSession.setAttribute("token", token);
map.put("data", httpSession.getAttribute("token"));
return () -> map;
}
public Callable<Object> getTokenController(HttpSession httpSession){
return () -> service.getTokenService();
}
2.这种情况,用 redis 管理的 session,会发现就是只会在每次启动 server 后,第一次执行此方法时,token 会插入,当我再次请求这个方法时,session 里 token 的值始终是第一次的值
有大佬知道为什么吗?
1
johnniang 2018-11-17 23:23:28 +08:00 via Android
是否因为由于异步导致再次回调造成的呢
|
2
shayang888 OP @johnniang 请问你有遇到过吗
|
3
johnniang 2018-11-17 23:46:32 +08:00 via Android
@shayang888 没有关注过这个 handler 的执行次数。不过建议你打断点调试一下,弄清楚异步请求的原理
|
4
mmdsun 2018-11-18 01:29:33 +08:00 via Android
我记得拦截异步需要用异步拦截器。spring 有异步拦截器的
|
5
sutra 2018-11-18 13:06:44 +08:00
session 管理机制可能用到了 ThreadLocal。
|
6
shayang888 OP @mmdsun 我用了异步拦截器也是一样 会输出 2 次 我在网上倒是搜到个答案就是判断请求的 dispatchServeletName == REQUEST
|