【问题标题】:Spring boot web application does not have cache-control headerSpring Boot Web 应用程序没有缓存控制标头
【发布时间】:2020-11-19 01:32:02
【问题描述】:

我正在使用 Spring Boot 应用程序,并且需要通过禁用网页之间的缓存来启用安全性。 据我了解,默认情况下,Spring Security 会为我们设置特定的缓存控制标头值,而无需我们进行任何配置。

但是对于我的 Web 应用程序,以下响应标头不存在。 缓存控制”,“无存储” Pragma”,“无缓存” 过期”、“0” 我尝试使用拦截器(实现 HandlerInterceptor)设置它们,并在 preHandle、postHandle 和 afterCompletionMethod 中添加以下代码。

    response.setHeader("Cache-Control", "no-store"); // HTTP 1.1.
    response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
    response.setHeader("Expires", "0"); // Proxies. 

虽然控制到这些方法并设置了标头,但当我检查网络浏览器时,我看不到这些标头。

可能是什么原因?

【问题讨论】:

    标签: java spring-boot security cache-control


    【解决方案1】:

    设置标题有不同的类型。

    我建议使用过滤器或配置来设置它。

    配置

    默认情况下 spring-boot 设置安全标头。使用 .defaultsDisabled() 您可以禁用它们并可以选择性地激活所需的标头。

    @EnableWebSecurity
    public class WebSecurityConfig extends
    WebSecurityConfigurerAdapter {
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
        // ...
        .headers()
            // do not use any default headers unless explicitly listed
            .defaultsDisabled()
            .cacheControl();
    }
    }
    

    将标题设置为以下设置:

    Cache-Control: no-cache, no-store, max-age=0, must-revalidate
    Pragma: no-cache
    Expires: 0
    

    有关配置的更多详细信息,请参阅文档。 https://docs.spring.io/spring-security/site/docs/4.0.x/reference/html/headers.html

    你可以选择一个过滤器。

    过滤器

    @WebFilter("/filter-response-header/*")
    public class AddResponseHeaderFilter implements Filter {
     
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, 
          FilterChain chain) throws IOException, ServletException {
            HttpServletResponse httpServletResponse = (HttpServletResponse) response;
            httpServletResponse.setHeader(
              "Cache-Control", "no-store");
    httpServletResponse.setHeader(
                  "Pragma", "no-cache");
    httpServletResponse.setHeader(
                  "Expires", "0");
            chain.doFilter(request, response);
        }
    

    对于单个响应

    HttpServlet响应:

    HttpServletResponse response
    response.addHeader("Cache-Control", "no-store");
    response.addHeader("Pragma", "no-cache");
    response.addHeader("Expires", "0");
    

    更多信息请看这里:https://www.baeldung.com/spring-response-header

    【讨论】:

      猜你喜欢
      • 2016-06-17
      • 2017-10-30
      • 2016-05-25
      • 1970-01-01
      • 2016-08-29
      • 2021-10-20
      • 2020-03-22
      • 2021-06-27
      • 2019-07-16
      相关资源
      最近更新 更多