缓存控制过滤器值被 WebContentGenerator

问题描述

我们将一个项目从 spring 迁移到 spring-boot(版本 2.2.5)。我们也有弹簧安全措施。所以以前(使用“普通弹簧”)我们通过定义我们自己的 AbstractSecurityWebApplicationInitializer 覆盖了 afterSpringFilterChain 的方法

public class SecurityWebInitializer extends AbstractSecurityWebApplicationInitializer {

    @Override
    protected void afterSpringSecurityFilterChain(ServletContext servletContext) {
        servletContext.addFilter("MyCacheControlFilter",MyCacheControlFilter.class).addMappingForUrlPatterns(null,false,"/*");
    }

}

过滤器的本质是为缓存控制响应头定义自定义值。

response.setHeader("Cache-Control","max-age="31556926"); 

这工作正常,缓存控制已按预期转移到网络浏览器。

现在,由于切换到 spring 启动,此方法似乎不再被调用(调试器在应用程序启动或第一个请求期间不会停止)。有人知道为什么吗?

目前我们尝试通过像这样配置 FilterRegistrationBean 来绕过:

@Bean
public FilterRegistrationBean<MyCacheControlFilter> CacheControlFilterRegistrationBean() {
    FilterRegistrationBean<MyCacheControlFilter> registrationBean = new FilterRegistrationBean<>();
    registrationBean.setFilter(this.MyFilter);
    registrationBean.setorder(Order.LOWEST_PRECEDENCE);
    registrationBean.setUrlPatterns("/**");
    return registrationBean;
}

虽然过滤器在启动期间被初始化,但它仍然没有在请求中被调用。像这样将它包含到 securityConfig 中后,它会在最后被调用

@Autowired
private FilterRegistrationBean myFilterBean;

...
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
...

@Override
protected void configure(HttpSecurity http) throws Exception {
...
http.addFilterafter(myFilterBean.getFilter(),FilterSecurityInterceptor.class);
...
  }
}

通过这样做,缓存控制由过滤器写入。然而,尽管它被配置为具有最低优先级,但缓存控制值会被 WebContentGenerator 及其 ccValue(WebContentGenerator.java 第 462 行)覆盖。

cControl = (this.useCacheControlNoStore ? CacheControl.noStore() : CacheControl.noCache());

我们特别检查了这些文章的答案,但似乎没有任何影响 - 缓存控制标头仍然被 WebContentGenerator 覆盖。

How to add Cache-Control header to static resource in Spring Boot? Disabling Spring Security headers does not work

如何实现将MyCacheControlFilter的缓存控制值再次传递给浏览器?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)