【问题标题】:Suppress Vary:* response headers generated by Spring Boot抑制 Spring Boot 生成的 Vary:* 响应标头
【发布时间】:2020-08-08 03:45:05
【问题描述】:

我们的 Spring Boot 应用会生成 Vary 响应标头,用于传输静态资源(顺便也用于 REST API 调用)。我想禁止这样做,但我找不到执行此操作的配置选项。

生成以下标头:

Vary:Origin
Vary:Access-Control-Request-Method
Vary:Access-Control-Request-Headers

设置和使用各种缓存属性spring.resources.cache.* 未成功。 spring.resources.cache 属性在 https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html 中描述。

是否有有效的选项来抑制这些标头的生成?

【问题讨论】:

    标签: spring-boot


    【解决方案1】:

    Vary 标头在CORS 激活后立即设置。

    CORS 可能已被*Controller 类中的@CrossOrigin 注释激活。

    不过,CORS 也可以通过SecurityConfig 设置

    @Override
    protected void configure (HttpSecurity http) throws an exception {
        ...
        http.cors ();
        ...
    }}
    

    有关详细信息,另请参阅此问题:

    https://github.com/spring-projects/spring-framework/issues/18378

    另请参阅CORS 规范,因为Vary 标头:

    https://developer.mozilla.org/de/docs/Web/HTTP/CORS

    如果服务器指定单一来源而不是“*”通配符, 那么服务器还应该在 Vary 响应标头中包含 Origin — 向客户端指示服务器响应将根据不同而有所不同 Origin 请求头的值。

    【讨论】:

      【解决方案2】:
      【解决方案3】:

      让我们检查一下这个 hack 以抑制 HttpServletResponse 中的每个标题。

      默认情况下无法从HttpServletResponse中删除标头,该接口不支持删除标头或其他功能。

      使用自定义HttpFilter 可以通过做一些小技巧来禁止添加标题。

      在过滤器链中,您可以添加 HttpServletResponseWrapper 并覆盖 addHeadersetHeader 方法。现在是在HttpServletResponse 中设置的自定义逻辑。确保您的过滤器是链中的第一个过滤器之一。

      如果您使用的是 Spring Boot,请查看此示例 @Component(Java EE 也可以使用此技巧,因此请使用 Java EE 过滤器规范来启用过滤器):

      package com.example.demo;
      
      import org.springframework.http.HttpHeaders;
      import org.springframework.stereotype.Component;
      
      import javax.servlet.*;
      import javax.servlet.http.HttpServletResponse;
      import javax.servlet.http.HttpServletResponseWrapper;
      import java.io.IOException;
      
      @Component
      public class VaryHeaderFilter implements Filter {
      
          @Override
          public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
              chain.doFilter(request, new HttpServletResponseWrapper((HttpServletResponse) response) {
                  @Override
                  public void addHeader(String name, String value) {
                      if (!HttpHeaders.VARY.equals(name)) {
                          super.addHeader(name, value);
                      }
                  }
      
                  @Override
                  public void setHeader(String name, String value) {
                      if (!HttpHeaders.VARY.equals(name)) {
                          super.setHeader(name, value);
                      }
                  }
              });
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-23
        • 2011-12-12
        • 2017-05-26
        • 2018-03-24
        • 2019-10-19
        • 1970-01-01
        • 2020-10-21
        • 1970-01-01
        相关资源
        最近更新 更多