我们将一个项目从spring迁移到springboot(版本2.2.5)。我们也有 Spring 安全措施。所以以前(使用“纯spring”)我们通过定义自己的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");
这工作正常,缓存控制已像预期的那样转移到web浏览器。
现在,由于切换到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覆盖。
如何在SpringBoot中将缓存控制头添加到静态资源?禁用SpringSecurity头不起作用
如何将mycachecontrolfilter的缓存控制值再次传输到浏览器?
暂无答案!
目前还没有任何答案,快来回答吧!