我正在使用 Spring boot 应用程序,并且需要通过禁用网页之间的缓存来启用安全性。 据我了解,默认情况下,Spring Security 为我们设置特定的缓存控制标头值,而我们无需配置任何内容。
但是对于我的 Web 应用程序,不存在以下响应标头。 缓存控制”、“无存储” Pragma”、“无缓存” 过期”、“0” 我尝试使用拦截器(实现 HandlerInterceptor)来设置它们,并在 preHandle、postHandle 和 afterCompletionMethod 中添加以下代码。
response.setHeader("Cache-Control", "no-store"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setHeader("Expires", "0"); // Proxies.
虽然控制来自这些方法并且设置了标头,但当我检查网络浏览器时,我没有看到这些标头。
可能是什么原因?
设置标题有不同类型。
我建议使用过滤器或配置来设置它。
配置
默认情况下,spring-boot 设置安全标头。使用 .defaultsDisabled() 您可以禁用它们并可以有选择地激活所需的标头。
@EnableWebSecurity
public class WebSecurityConfig extends
WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
// ...
.headers()
// do not use any default headers unless explicitly listed
.defaultsDisabled()
.cacheControl();
}
}
将标题设置为以下设置:
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
有关配置的更多详细信息,请参见文档。 https://docs.spring.io/spring-security/site/docs/4.0.x/reference/html/headers.html
您也可以使用过滤器。
过滤器
@WebFilter("/filter-response-header/*")
public class AddResponseHeaderFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
httpServletResponse.setHeader(
"Cache-Control", "no-store");
httpServletResponse.setHeader(
"Pragma", "no-cache");
httpServletResponse.setHeader(
"Expires", "0");
chain.doFilter(request, response);
}
对于单个回复
HttpServlet响应:
HttpServletResponse response
response.addHeader("Cache-Control", "no-store");
response.addHeader("Pragma", "no-cache");
response.addHeader("Expires", "0");