问题描述
我们将一个项目从 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 (将#修改为@)