使用spring时在异步超时后恢复javax.servlet.Filter筛选器链

使用spring时在异步超时后恢复javax.servlet.Filter筛选器链,java,spring,spring-security,servlet-3.0,Java,Spring,Spring Security,Servlet 3.0,我想给一些请求增加一个延迟,而不必在jetty下保留线程。我认为这可以使用Servlet3中添加的异步支持来实现 我的过滤器是第一个运行的过滤器,它的内部增加了延迟: AsyncContext asyncContext = request.startAsync(); asyncContext.setTimeout(1000L); 这似乎会延迟请求,但我不确定如何恢复过滤链。我想在超时时恢复筛选器链 我尝试添加一个侦听器: asyncContext.addListener(new AsyncLi

我想给一些请求增加一个延迟,而不必在jetty下保留线程。我认为这可以使用Servlet3中添加的异步支持来实现

我的过滤器是第一个运行的过滤器,它的内部增加了延迟:

AsyncContext asyncContext = request.startAsync();
asyncContext.setTimeout(1000L);
这似乎会延迟请求,但我不确定如何恢复过滤链。我想在超时时恢复筛选器链

我尝试添加一个侦听器:

asyncContext.addListener(new AsyncListener() {
@Override
public void onTimeout(AsyncEvent event) throws IOException {
    try {
        chain.doFilter(event.getAsyncContext().getRequest(), event.getAsyncContext().getResponse());
    } catch (ServletException e) {
        throw new RuntimeException(e);
    }
}
看起来链中的下一个过滤器被调用了,但我认为spring对此并不满意。对于一些请求,我没有得到任何错误,但是对于登录API,我总是得到一个401,但是我检查身份验证的代码没有被调用。在其他情况下,我看到空指针异常: 2019-06-28 13:27:08772[admin-78][:::]警告建议

java.lang.NullPointerException
        at org.springframework.util.StringUtils.uriDecode(StringUtils.java:724)
        at org.springframework.web.util.UriUtils.decode(UriUtils.java:342)
        at org.springframework.web.util.UrlPathHelper.decodeInternal(UrlPathHelper.java:464)
        at org.springframework.web.util.UrlPathHelper.decodeRequestString(UrlPathHelper.java:455)
        at org.springframework.web.util.UrlPathHelper.getContextPath(UrlPathHelper.java:344)
        at org.springframework.web.util.UrlPathHelper.getPathWithinApplication(UrlPathHelper.java:239)
        at org.springframework.web.util.UrlPathHelper.getPathWithinServletMapping(UrlPathHelper.java:192)
        at org.springframework.web.util.UrlPathHelper.getLookupPathForRequest(UrlPathHelper.java:169)
        at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:365)

如何继续过滤链?

我认为,一旦延迟后读取了请求对象,就无法再次构建它,因此无法再次读取它。这可能是空指针异常的原因。您可以尝试将所有http请求信息存储在内存中,然后在延迟后尝试构建一个模拟请求对象,以便使用筛选器链继续。但要做到这一点并不容易,在大多数情况下,最好重新考虑为什么需要推迟请求。此外,当您延迟请求时,如何将后续响应发送给客户端将是另一个问题。我认为,一旦延迟后读取了请求对象,它就无法再次构建,因此无法再次读取。这可能是空指针异常的原因。您可以尝试将所有http请求信息存储在内存中,然后在延迟后尝试构建一个模拟请求对象,以便使用筛选器链继续。但要做到这一点并不容易,在大多数情况下,最好重新考虑为什么需要推迟请求。此外,当您延迟请求时,如何向客户机发送后续响应将是另一个问题。