Spring - 如何为我返回的所有响应添加标题?

时间:2017-04-18 20:23:36

标签: java spring rest

假设我有一个Spring REST API,它会在整个代码中返回许多响应。

如果我想在发送的每个响应中返回两个特定的标题,我怎么能以更智能的方式执行此操作,而不是在返回之前手动将它们添加到每个响应中?

是否有一种机制允许我在发送之前捕获响应并添加标题?

编辑:未来的访问者提出这个问题。这里没有任何答案实际上会产生一个有效的拦截器。我建议到别处寻找。

5 个答案:

答案 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个不同的点为请求处理生命周期添加功能:

  1. 在控制器处理请求之前
  2. 在控制器方法完成其代码执行后
  3. 当视图即将呈现并作为对客户端的响应发回时
  4. 我认为选项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()方法。

example