假设我有一个Spring REST API,它会在整个代码中返回许多响应。
如果我想在发送的每个响应中返回两个特定的标题,我怎么能以更智能的方式执行此操作,而不是在返回之前手动将它们添加到每个响应中?
是否有一种机制允许我在发送之前捕获响应并添加标题?
编辑:未来的访问者提出这个问题。这里没有任何答案实际上会产生一个有效的拦截器。我建议到别处寻找。
答案 0 :(得分:3)
我开始工作的方式是使用ResponseBodyAdvice,如example所链接的Faxy所示。
以下是我为每个请求添加缓存控制标头的解决方案:
@ControllerAdvice
public class HeaderModifierAdvice implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(final MethodParameter returnType, final Class<? extends HttpMessageConverter<?>> converterType) {
return true;
}
@Override
public Object beforeBodyWrite(final Object body,
final MethodParameter returnType,
final MediaType selectedContentType,
final Class<? extends HttpMessageConverter<?>> selectedConverterType,
final ServerHttpRequest request,
final ServerHttpResponse response) {
response.getHeaders().add("Cache-Control", "no-cache, no-store, must-revalidate");
response.getHeaders().add("Pragma", "no-cache");
response.getHeaders().add("Expires", "0");
return body;
}
}
答案 1 :(得分:2)
正确答案是使用过滤器。无论人们在网上说什么,拦截器都不正确。拦截器根本无法正常工作。
工作解决方案是按如下方式创建过滤器:
public class myAwesomeFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
response.addHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.addHeader("pragma", "no-cache");
filterChain.doFilter(request, response);
}
}
然后,在web.xml中 - 您需要以下内容:
<filter>
<filter-name>sensitiveFormHeaderFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
答案 2 :(得分:1)
您可以使用Handler Interceptor轻松完成这些操作,允许您修改Spring MVC中的请求处理生命周期。拦截器是一个非常强大的工具,它允许我们在3个不同的点为请求处理生命周期添加功能:
我认为选项2将满足您的需求。
然后你可以这样写:
public class MyInterceptor extends HandlerInterceptorAdapter {
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
super.postHandle(request, response, handler, modelAndView);
//add your two headers on the response here
}
}
第2步是在配置文件中注册该拦截器,将下一行添加到XML配置中:
<mvc:interceptors>
<bean Class="your interceptor class">
</mvc:interceptors>
从现在开始,拦截器将适用于每个请求。
答案 3 :(得分:-1)
您可以将spring interceptors用于此目的。 或者有更通用的方法来做到这一点,这不需要Spring。这是filter
答案 4 :(得分:-2)
我相信你可以实现HandlerInterceptorAdapter接口并覆盖postHandle()方法。