为什么 springmvc 在 controller 层使用异步方法的时候,很多地方都会有奇怪的影响?

2018-11-17 23:03:34 +08:00
 shayang888

比如 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 的值始终是第一次的值

有大佬知道为什么吗?

3186 次点击
所在节点    Java
6 条回复
johnniang
2018-11-17 23:23:28 +08:00
是否因为由于异步导致再次回调造成的呢
shayang888
2018-11-17 23:33:17 +08:00
@johnniang 请问你有遇到过吗
johnniang
2018-11-17 23:46:32 +08:00
@shayang888 没有关注过这个 handler 的执行次数。不过建议你打断点调试一下,弄清楚异步请求的原理
mmdsun
2018-11-18 01:29:33 +08:00
我记得拦截异步需要用异步拦截器。spring 有异步拦截器的
sutra
2018-11-18 13:06:44 +08:00
session 管理机制可能用到了 ThreadLocal。
shayang888
2018-11-18 13:17:53 +08:00
@mmdsun 我用了异步拦截器也是一样 会输出 2 次 我在网上倒是搜到个答案就是判断请求的 dispatchServeletName == REQUEST

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/508866

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX