spring security - 如何在特定的URL模式中去除缓存控制

IT小君   2023-10-24T23:21:01

我正在尝试过滤一些URL模式以进行缓存。 我尝试的方法是将一些代码放入WebSecurityConfigurerAdapter的实现中。

 @Override
protected void configure(HttpSecurity http) throws Exception {
    initSecurityConfigService();

    // For cache
    http.headers().defaultsDisabled()
            .cacheControl()
            .and().frameOptions();

    securityConfigService.configure(http,this);
}

然而,这段代码会影响到整个Web应用程序。我如何将其应用于某个指定的URLContent-Type,比如images?

我已经尝试过使用RegexRequestMatcher,但对我来说没有起作用。

// For cache
        http.requestMatcher(new RegexRequestMatcher("/page/", "GET"))
                .headers().defaultsDisabled()
                .cacheControl()
                .and().frameOptions();

我阅读了这篇文章:SpringSecurityResponseHeaders,但没有这种情况的示例。

谢谢。

P.S. 简而言之,我想针对某些URL和资源移除SpringSecurity defaults

评论(2)
IT小君

多个WebSecurityConfigurerAdapters怎么样?一个适配器可以对特定的URL设置缓存控制,而另一个适配器则不会对这些URL启用缓存控制。

2023-10-24T23:21:07   回复
IT小君

我解决了这个问题,使用了 Filter。 下面是我在 AbstractAnnotationConfigDispatcherServletInitializer 中的部分实现。在 onStartup 方法中进行了重写。

FilterRegistration.Dynamic springSecurityFilterChain = servletContext.addFilter("springSecurityFilterChain", new DelegatingFilterProxy());
if(springSecurityFilterChain != null){
    springSecurityFilterChain.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/render/*", "/service/*");
    // 我删除了 url 匹配模式 "/image/*" :)
}

我所做的是从 MappingUrlPatterns 中删除了 /image/*。 谢谢你们的回答!

2023-10-24T23:21:34   回复