ETag-фильтр Spring не эффективен при использовании асинхронного сервлета (spring 3.2)
Недавно мы использовали асинхронную функцию в сервлете 3.0 с пружиной 3.2, но тогда наш ShallowEtagHeaderFilter вообще не был эффективен, я думаю, что это должна быть среда, сбрасывающая ответ до того, как мой контент был обработан... Как его решить? У кого-нибудь есть опыт?
1 ответ
Ссылаясь на фрагменты кода ShallowEtagFilter в Spring 4.3.5,
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
HttpServletResponse responseToUse = response;
if (!isAsyncDispatch(request) && !(response instanceof ContentCachingResponseWrapper)) {
responseToUse = new HttpStreamingAwareContentCachingResponseWrapper(response, request);
}
filterChain.doFilter(request, responseToUse);
if (!isAsyncStarted(request) && !isContentCachingDisabled(request)) {
updateResponse(request, responseToUse);
}
}
/**
* Whether request processing is in asynchronous mode meaning that the
* response will not be committed after the current thread is exited.
* @param request the current request
* @since 3.2
* @see WebAsyncManager#isConcurrentHandlingStarted()
*/
protected boolean isAsyncStarted(HttpServletRequest request) {
return WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted();
}
Когда вы используете асинхронный сервлет, условие не будет выполнено, что означает, что бизнес-логика генерации etag не будет вызываться.