【发布时间】:2016-06-30 13:59:16
【问题描述】:
我需要在我的 Spring Security conf 中禁用缓存控制标头。
根据文档,一个简单的http.headers.disable() 应该可以做到,但我仍然看到
Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Expires:0
Pragma:no-cache
响应中的标题。
我当前的安全配置是:
http.antMatcher("/myPath/**") // "myPath" is of course not the real path
.headers().disable()
.authorizeRequests()
// ... abbreviated
.anyRequest().authenticated();
到目前为止我尝试过的事情:
application.properties
我添加了security.headers.cache=false 行,但这并没有什么不同。
使用过滤器
我尝试了以下过滤器:
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
chain.doFilter(request, new HttpServletResponseWrapper((HttpServletResponse) response) {
@Override
public void setHeader(String name, String value) {
if (name.equalsIgnoreCase("Cache-Control")) {
value = "";
} else if (name.equalsIgnoreCase("Expires")) {
value = "";
} else if (name.equalsIgnoreCase("Pragma")) {
value = "";
}
super.setHeader(name, value);
}
});
}
添加日志后,我看到此过滤器仅写入 X-XSS-Protection 标头,所有缓存标头都稍后写入某处,此过滤器无权“覆盖”它们。即使我将此过滤器添加到安全过滤器链的最后位置也会发生这种情况。
使用拦截器
我尝试了以下拦截器:
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
String requestUri = request.getRequestURI();
response.setHeader("Cache-Control", "max-age=3600");
response.setHeader("Expires", "3600");
response.setHeader("Pragma", "");
}
这(完全可以预见)只是添加了标头,这意味着除了拦截器添加的标头之外,原始的 no-cache 标头仍然出现。
我的智慧到此为止。如何摆脱 Spring security 设置的缓存控制头?
【问题讨论】:
-
对我来说,感谢您的问题,在我的 application.properties 添加:security.headers.cache=false 后,它起作用了
标签: java security caching spring-security spring-boot