7

如何为使用 Spring Boot 进行的应用程序中的每个调用设置响应标头?我想尝试使用过滤器来拦截所有调用并能够设置响应标头。我按照指南禁用浏览器缓存 HTML5,但只设置请求标头,并非总是如此。

4

2 回答 2

20

有三种方法可以做到这一点:

  1. 在 Controller 类中设置特定控制器的响应:

    @控制器
    @RequestMapping(值 = DEFAULT_ADMIN_URL + "/xxx/")
    公共类 XxxController
    ……
        @ModelAttribute
        公共无效 setResponseHeader(HttpServletResponse 响应) {
           response.setHeader("缓存控制", "无缓存");
           ……
        }
    

    或者

    @RequestMapping(value = "/find/employer/{employerId}", 方法 = RequestMethod.GET)
    public List getEmployees(@PathVariable("employerId") 长的employerId,最终的HttpServletResponse 响应) {
        response.setHeader("缓存控制", "无缓存");
        return employeeService.findEmployeesForEmployer(employerId);
    }
    
    1. 或者您可以将每个调用的响应头放在应用程序中(这是基于 Spring 注释的,否则请参阅自动将头添加到每个响应):
    @零件
    公共类过滤器扩展了OncePerRequestFilter {
    ……
     @覆盖
     protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            抛出 ServletException,IOException {
        //response.addHeader("Access-Control-Allow-Origin", "*");
        //response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1。
        response.setHeader("Cache-Control", "no-store"); // HTTP 1.1。
        response.setHeader("Pragma", "no-cache"); // HTTP 1.0。
        response.setHeader("过期", "0"); // 代理。
        filterChain.doFilter(request, response);
     }
    }
    
    1. 我发现的最后一种方法是使用扩展 HandlerInterceptorAdapter 的拦截器;有关更多信息,请参阅https://www.concretepage.com/spring/spring-mvc/spring-handlerinterceptor-annotation-example-webmvcconfigureradapter

      • 创建扩展 HandlerInterceptorAdapter 的拦截器:
    公共类 HeaderInterceptor 扩展 HandlerInterceptorAdapter {
    
      @覆盖
      公共布尔preHandle(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,对象处理程序){
        httpServletResponse.setHeader("Cache-Control", "no-store"); // HTTP 1.1。
        httpServletResponse.setHeader("Pragma", "no-cache"); // HTTP 1.0。
        httpServletResponse.setHeader("过期", "0"); // 代理。
        返回真;
      }
    }
    
    • 在扩展 WebMvcConfigurerAdapter 的 MvcConfig 中,您必须重写 addInterceptors 方法并添加新的拦截器:
    @覆盖
    公共无效添加拦截器(拦截器注册表){
        ……
        registry.addInterceptor(new HeaderInterceptor());
    }
    

我希望我有帮助!

于 2018-03-22T14:49:11.757 回答
0

实现Filter并通过@Component注解注册。@Order(Ordered.HIGHEST_PRECEDENCE) 用于建议执行优先级。

 @Component
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public class NoCacheWebFilter implements Filter {
       private static final Logger logger = LoggerFactory.getLogger(NoCacheWebFilter.class);


    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        logger.debug("Initiating WebFilter >> ");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
HeaderMapRequestWrapper requestWrapper = new 
                    HeaderMapRequestWrapper(req);
            // implement you logic to add header
            //requestWrapper.addHeader("remote_addr", "");
        chain.doFilter(requestWrapper, response); 

    }

    @Override
    public void destroy() {
        logger.debug("Destroying WebFilter >> ");
    }
    }
于 2018-03-22T14:26:19.707 回答