我设置了一个过滤bean来插入缓存控制头。这工作正常,除了在过滤器之后的某个时刻,插入了额外的缓存控制头。
我正在使用Spring Boot。
关于可能导致问题的任何想法?
public class CacheControlFilter extends GenericFilterBean {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
Calendar expires = Calendar.getInstance();
expires.add(Calendar.HOUR, 24);
HttpServletResponse httpResponse = (HttpServletResponse) response;
// Returns false
System.out.println("==========> " + httpResponse.containsHeader("Cache-Control"));
httpResponse.addHeader("Cache-Control", "max-age=" + (expires.getTimeInMillis() / 1000));
httpResponse.addDateHeader("Expires", expires.getTimeInMillis());
chain.doFilter(request, response);
}
}
请参阅重复的缓存控制标头:
HTTP/1.1 200 OK
...
Cache-Control: max-age=1411755690
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Expires: Fri, 26 Sep 2014 18:21:30 GMT
Expires: 0
Pragma: no-cache
Content-Type: image/png
...
答案 0 :(得分:2)
原因是Spring Security在使用Java配置时默认添加它们。以下是他们如何被禁用:
@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
// ...
.headers().disable();
}
}
答案 1 :(得分:1)
使用setHeader
代替addHeader
。
Spring Security documentation说:
如果您确实想要缓存特定的响应,那么您的应用程序可以 有选择地调用
HttpServletResponse.setHeader(String,String)
覆盖Spring Security设置的标头。这有助于确保 CSS,JavaScript和图像等内容都已正确缓存。
或者您可以使用以下命令指定需要不同缓存控制的URL:
@EnableWebMvc
public class WebMvcConfiguration implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.addResourceHandler("/resources/**")
.addResourceLocations("/resources/")
.setCachePeriod(31556926);
}
// ...
}