我想为某些请求增加延迟,而又不要在码头上保持线程。我认为可以使用添加到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)
如何继续使用过滤器链?