使用spring时,在异步超时后恢复javax.servlet.Filter过滤器链

时间:2019-06-28 03:43:40

标签: java spring spring-security servlet-3.0

我想为某些请求增加延迟,而又不要在码头上保持线程。我认为可以使用添加到Servlet 3的异步支持来完成。

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

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:08,772 [admin-78] [::] WARN建议.CatchAllException-捕获

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)

如何继续使用过滤器链?

0 个答案:

没有答案