Spring Boot+Zuul(Edgware.SR3)集成Spring Security时如何保留上游缓存控制头
解决方案:保留上游缓存控制头同时保留Spring Security安全头
当然可以实现你的需求!不用一刀切禁用所有安全头,只需要针对性调整Spring Security和Zuul的配置,就能既保留HSTS、XSS防护这些安全头,又让上游的Cache-Control(带public策略)正常透传。下面是具体步骤:
1. 禁用Spring Security默认的缓存控制头注入
Spring Security默认会往所有响应里添加Cache-Control: no-cache, no-store, max-age=0, must-revalidate这类强制无缓存的头,这正是你要去掉的。我们可以在Security配置类里直接禁用这个行为:
import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { // 保留你的其他Security配置(比如认证、授权规则) http.authorizeRequests() // ... 你的自定义规则 .and() .headers() // 禁用Spring Security自动添加的缓存控制头 .cacheControl().disable(); } }
这样Spring Security就不会再干预缓存相关的响应头了,上游返回的Cache-Control就能优先生效。
2. 确保Zuul不会过滤上游的缓存控制头
Zuul默认会把Cookie、Set-Cookie、Authorization列为敏感头(不会透传),但Cache-Control不在默认列表里。如果你的配置里手动添加过Cache-Control到敏感头,一定要把它移除:
application.properties 配置:
# 明确指定敏感头,排除Cache-Control(默认就是这三个,没改的话可以不用写,但写出来更清晰) zuul.sensitive-headers=Cookie,Set-Cookie,Authorization
application.yml 配置:
zuul: sensitive-headers: Cookie,Set-Cookie,Authorization
3. 不要设置zuul.ignore-security-headers=true
这个配置会移除所有Spring Security添加的安全头(包括HSTS、X-Frame-Options、XSS保护等),完全不符合你的需求。保持它的默认值false即可,这样那些安全头会正常保留在响应里。
验证效果
完成配置后,你可以请求Zuul路由后的接口,检查响应头:
- 能看到上游返回的
Cache-Control: public, max-age=xxx - 同时存在
Strict-Transport-Security、X-Frame-Options、X-XSS-Protection这些安全头 - 没有Spring Security默认的无缓存头
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

