我需要在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安全性设置的缓存控制头?
答案 0 :(得分:3)
可能有所帮助:
@EnableWebSecurity
public class WebSecurityConfig extends
WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
// ...
.headers()
.defaultsDisabled()
.cacheControl();
}
}
答案 1 :(得分:1)
您需要一个使用两个重叠配置方法扩展WebSecurityConfigurerAdapter的类来配置过滤器和身份验证提供程序。例如,以下内容至少可以起作用:
e.g, NSLog("%@", modelObj.Name);
您还可以完全取消Spring Security的公共静态资源,如下所示(与上述相同的类):
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.servlet.configuration.EnableWebMvcSecurity;
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfigDemo extends WebSecurityConfigurerAdapter {
@Autowired
private DemoAuthenticationProvider demoAuthenticationProvider;
@Override
protected void configure(HttpSecurity http) throws Exception {
// Prevent the HTTP response header of "Pragma: no-cache".
http.headers().cacheControl().disable();
}
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(demoAuthenticationProvider);
}
}
这需要配置两个资源处理程序才能正确获取缓存控制标头:
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/static/public/**");
}
答案 2 :(得分:1)
所以,我自己找到了答案:
我最终通过在名为spring.resources.cachePeriod
的yml配置文件中创建一个新条目并将其设置为不同于0
的值来使Cache-Control标头更改其值。不好的是,所有资源都使用此设置,因此根据资源情况,无法根据资源进行区分。
this question的答案帮助很大。
答案 3 :(得分:0)
所以我遇到了类似的问题,希望我的大多数REST端点都有标准的“不要缓存我”标题Spring正在注入,但在一个端点上我想插入自己的。
在您给予ResponseEntry的HttpHeaders对象中指定自己的对象不起作用。
什么工作是在HttpServletResponse上直接显式设置标题。
Spring正在设置“Cache-Control”,“Pragma”和“Expires”。以下演示了如何覆盖和设置1分钟缓存:
response.setHeader("Cache-Control", "max-age=60");
response.setHeader("Pragma", "");
HttpHeaders headers = new HttpHeaders();
headers.setExpires(System.currentTimeMillis()+60000);
return new ResponseEntity<>(body, headers, HttpStatus.OK);
答案 4 :(得分:0)
在我的应用程序类中通过@EnableOAuth2Sso
启用OpenId Connect后出现此问题。经过大约六个小时的调试和阅读文档后,发现@EnableOAuth2Sso
必须放在WebSecurityConfigurerAdapter
上,否则默认设置会覆盖自定义设置:
不可强>
// In Application.java
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
//In WebSecurity.java
@Configuration
@EnableOAuth2Sso // <- This MUST be here, not above
public class WebSecurity extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.headers().disable();
}
}
<强>为强>
// In Application.java
@SpringBootApplication
@EnableOAuth2Sso // <- Will overwrite config below
public class Application {
//...
}
@Configuration
public class WebSecurity extends WebSecurityConfigurerAdapter {
//...
}
答案 5 :(得分:-2)
使用
是对的http
.headers().disable()
...
将停用您的标头。如果您只想禁用缓存控制,则可以使用以下命令:
http
.headers()
.cacheControl().disable()
.and()
...
我发布了a sample,证明了这一点与with a test一致。
我的猜测是你遇到的问题是你有多个HttpSecurity
配置。请记住,如果你有:
http
.antMatchers("/myPath/**")
...
只有以/myPath/
开头的网址才会受到影响。此外,如果您有多个HttpSecurity
个实例,则会按顺序考虑每个HttpSecurity
实例,并且仅使用第一个HttpSecurity
实例。例如,如果你有:
@Configuration
@Order(1)
public class MyPathAdminWebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatchers("/myPath/admin/**")
.authorizeRequests()
.anyRequest().hasRole("ADMIN");
}
}
@Configuration
@Order(2)
public class MyPathWebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatchers("/myPath/**")
.headers()
.cacheControl().disable();
}
}
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated();
}
}
如果您请求/ myPath / admin / abc
首先考虑MyPathAdminWebSecurityConfig
。由于/myPath/admin/
以/myPath/admin/
开头,我们将使用MyPathAdminWebSecurityConfig
而不考虑任何其他配置。这意味着您将期望为此请求获取标头。