【发布时间】:2018-02-07 23:22:36
【问题描述】:
我正在使用 Spring 的 OncePerRequestFilter 覆盖 shouldNotFilterAsyncDispatch 方法来返回 false。这样它就可以处理异步请求。在过滤器中,我尝试执行以下操作:
if (isAsyncDispatch(request)) {
request.getAsyncContext().addListener(new AsyncListener() {
@Override
public void onComplete(AsyncEvent event) throws IOException {
System.out.println("onComplete");
}
@Override
public void onTimeout(AsyncEvent event) throws IOException {
}
@Override
public void onError(AsyncEvent event) throws IOException {
System.out.println("onError");
}
@Override
public void onStartAsync(AsyncEvent event) throws IOException {
}
});
}
所以isAsyncDispatch 按预期返回 true。但是当我尝试getAsyncContext 时,它会失败并出现以下异常:
IllegalStateException: It is illegal to call this method if the current request is not in asynchronous mode (i.e. isAsyncStarted() returns false)
确实,request.isAsyncStarted() 返回 false,但 request.isAsyncSupported() 为 true,request.getDispatcherType() 为 ASYNC。
我不明白:它是否异步?也许我以错误的方式使用 API?如何添加AsyncListener?可能是因为我用的是Tomcat?
提前谢谢你!
【问题讨论】:
-
AFAIK 请求在 DispatcherServlet 的某处开始异步。或者更准确地说,在处理返回一种异步结果的实际请求映射方法时。因此,如果此代码在预请求端的过滤器中,则尚未调用
startAsync()方法。
标签: java spring-mvc servlet-filters servlet-3.0