2015-07-10 220 views
1

我有一个Spring 4 MVC应用程序,其中有一个拦截器,用于计算请求响应周期的执行时间,我想设置一个头,如X-Runtime,其值为执行时间处理时间。但是,response.setHeader函数不起作用。当响应到达我的浏览器时,它被覆盖。Spring MVC 4:拦截器无法设置响应头

我有一个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,响应可能已经犯下的时间,这意味着你可以不写响应头了。

这就是为什么大多数情况下,这种行为是在Servlet过滤器中实现的,并用缓存包装器封装响应。请参阅ShallowEtagHeaderFilter以及在Spring中使用ContentCachingResponseWrapper