Spring Security - 无法避免缓存控制

时间:2015-07-14 17:01:01

标签: spring caching spring-security

我有一个应用程序并使用spring的控制器映射来将图像加载到我的用户。 (InputStream,response等)。

在我的控制器中,我将标题设置为缓存控制,基于文件等等。但总是pragma:no-cache和Cache-Control:" max-age = 0"在所有请求中,这取代了我的响应设置。

我正在努力解决这个问题,但没有任何作用。

我已经阅读了所有页面并尝试了我发现的所有内容: http://docs.spring.io/autorepo/docs/spring-security/3.2.0.CI-SNAPSHOT/reference/html/headers.html

我的spring security.xml有:

    <security:headers disabled="true"/>

任何人都有好主意解决这个问题?

请记住,要加载我需要通过控制器加载的图像,我从不直接调用静态。

5 个答案:

答案 0 :(得分:15)

Cache-Control标题可以通过在HttpServletResponse中覆盖{/ 1}}来基于每个操作进行控制:

@RequestMapping(value = "/foo", method = RequestMethod.GET)
public String someAction(HttpServletResponse response) {
    response.setHeader("Cache-Control", "no-transform, public, max-age=86400");

    // ...
}

无需摆弄Spring Security配置。

请参阅http://docs.spring.io/spring-security/site/docs/current/reference/html/headers.html#headers-cache-control

答案 1 :(得分:12)

如果使用基于Java的配置,可以通过以下方式禁用缓存控制标头:

@Configuration
@EnableWebMvcSecurity
class SpringWebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        http.headers().cacheControl().disable();
    }
}

这将删除CacheControlHeadersWriter,Spring不再编写缓存控制头。

答案 2 :(得分:0)

你已经链接到Spring Security reference(3.2.0),

  

可以使用没有子元素的元素轻松添加所有默认标题

单独添加headers将打开所有子元素(例如缓存控制,xxs,...)。要么根本不包含标题,要么明确指定要启用的子元素。

BTW,我认为disabled不是标题的属性(对于3.2.0)。如果您使用的是version 4.0,则会有disabled属性以及disabled-defaults,这可能是您想要的属性。

答案 3 :(得分:0)

添加到aha的答案。您还需要使用一些垃圾覆盖Pragma标头。

@RequestMapping(value = "/foo", method = RequestMethod.GET)
public String someAction(HttpServletResponse response) {
    response.setHeader("Cache-Control", "no-transform, public, max-age=86400");
    response.setHeader("Pragma", "");
    // ...
}

Expires标头仍然显示在响应中,但似乎被大多数浏览器中的Cache-Control标头覆盖。

答案 4 :(得分:-1)

已经有一段时间了 - 但是在研究同样的问题时,我发现了这篇帖子,这对我有用 -

disable caching for specific url in spring security

上面提到的解决方案的优点在于它使每个标头专门使用其原始类,并使用antmatcher将特定请求路径与各自的标头对齐。在我的例子中,我为静态资源使用了一个单独的Cache引用,其中包含缓存到期设置,另一个缓存引用用于所有没有缓存的jsps。由于它是一个蚂蚁匹配器,控制器uri可以使用相同的方法进行匹配。