gpt4 book ai didi

java - Spring MVC 4 : Interceptor not being able to set Response header

转载 作者:行者123 更新时间:2023-11-29 05:03:14 31 4
gpt4 key购买 nike

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

我有一个 CORS 过滤器,我在其中设置请求和响应 header 以启用跨源请求并且工作正常。

这是我的拦截器:

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 作为我的容器/应用程序服务器。

最佳答案

当响应到达 HandlerInterceptor 中的 postHandle 方法时,响应可能已经提交,这意味着您可以不再写响应头了。

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

关于java - Spring MVC 4 : Interceptor not being able to set Response header,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31342931/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com