2015-07-10 2 views
1

У меня есть приложение Spring 4 MVC, где у меня есть перехватчик, который вычисляет время выполнения для цикла ответа на запрос, и я хочу установить заголовок, например X-Runtime, со значением время исполнения. Однако функция response.setHeader не работает. К тому времени, когда ответ достигнет моего брата, он будет отменен.Spring MVC 4: Interceptor не может установить ответ Заголовок

У меня есть фильтр CORS, где я устанавливаю заголовки запросов и ответов, чтобы разрешать запросы на кросс-поиск, и это работает нормально.

Вот мой перехватчик:

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.web.servlet.ModelAndView; 
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; 

public class ExecuteTimeInterceptor extends HandlerInterceptorAdapter { 

    private static final Logger LOGGER = LoggerFactory.getLogger(ExecuteTimeInterceptor.class.getName()); 

    @Override 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
     long startTime = System.currentTimeMillis(); 
     LOGGER.info("Request URL::" + request.getRequestURL().toString() + ":: Start Time=" + System.currentTimeMillis()); 
     request.setAttribute("startTime", startTime); 
     return true; 
    } 

    @Override 
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 
     Long startTime = (Long) request.getAttribute("startTime"); 
     Long timeTaken = (System.currentTimeMillis() - startTime); 
     LOGGER.info("Request URL::" + request.getRequestURL().toString() + ":: Time Taken=" + timeTaken); 
     response.setHeader("X-Runtime", timeTaken.toString()); 
    } 

    @Override 
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 
     // Do nothing. 
    } 
} 

Я настроил перехватчик правильно в моем файле dispatcher.xml конфигурации. Время выполнения регистрируется правильно slf4j, поэтому я могу подтвердить, что сам перехватчик работает правильно.

Любая идея, почему это происходит? Я использую WildFly (ранее JBoss) 8.1 как мой контейнер/сервер приложений.

ответ

3

К тому времени отклика ударяется метод postHandle в вашем HandlerInterceptor, ответ может быть совершено уже, а это значит, что вы не можете писать заголовки ответа больше.

Именно поэтому в большинстве случаев такое поведение реализуется в сервлет-фильтре и обертывает ответ оболочкой-кэшированием. См. ShallowEtagHeaderFilter и его использование весной ContentCachingResponseWrapper.

Смежные вопросы