Spring Boot 中的 Thymeleaf 缓存和安全性

Posted

技术标签:

【中文标题】Spring Boot 中的 Thymeleaf 缓存和安全性【英文标题】:Thymeleaf cache and security in Spring Boot 【发布时间】:2018-04-21 02:40:55 【问题描述】:

在我的网络应用程序(Spring Boot + Spring Security + Thymeleaf)中,出于安全目的,我禁用了缓存:

spring.thymeleaf.cache=false

我不记得我从哪里得到这些信息,甚至不记得它是否属实。 我的网站上有很多图片,我想缓存它们。你会推荐什么?

【问题讨论】:

【参考方案1】:

看看Spring Security – Cache Control Headers,它解释了 ResponseEntity 对象的缓存,它可以用来以字节数组的形式返回图像。

This 还专门展示了一种缓存图像的方法,虽然帖子本身是 2015 年的,但某些部分仍然是相关的。

【讨论】:

【参考方案2】:

实际上spring.thymeleaf.cache 属性与安全无关,而更多与性能有关。如果禁用 Thymeleaf 缓存,模板将在需要解析时自动重新加载,这与热交换服务器端模板有关。

这在开发过程中很有帮助,因为您可以立即看到模板的更改。如果不是,您将不得不重新启动您的应用程序。

请参阅Developer tools 上的文档了解其用途。

Spring 4.x 版本有几种方法可以通过版本控制(缓存清除机制)实现static resource caching。假设您通过 Spring 将图像作为静态资源提供,您可能需要研究这些。

如果图像本身不需要保护,将它们作为静态资源提供并应用缓存就足够了。

【讨论】:

【参考方案3】:

Spring Security 将自动“缓存”所有请求,which is by design。

但是对于那些不需要由 Spring Security 管理的图像,您可以在 WebSecurityConfigurerAdapter 中为特定资源目录禁用它(在这种情况下,图像目录将在您的 ../resources/static 目录中) .

@Override
public void configure(WebSecurity webSecurity) 
    webSecurity.ignoring().antMatchers(
                "/images/**"
    )

而Spring Boot way 是添加

spring.resources.cache-period=your value here in seconds

您只想在开发中关闭 Thymeleaf 缓存,当您想要对模板进行热重载时。

测试它是否适用

curl -X GET -I https://your-site/images/foo.png

这将在浏览器级别缓存它们。如果您需要在服务器级别缓存它们,您可以使用像 nginx 这样的反向代理。

【讨论】:

以上是关于Spring Boot 中的 Thymeleaf 缓存和安全性的主要内容,如果未能解决你的问题,请参考以下文章

Thymeleaf 模板 在spring boot 中的引用和应用

IntelliJ中的Spring boot + thymeleaf:无法解析变量

Spring Boot + Thymeleaf 应用程序中的缓存破坏

Thymeleaf 无法检测到 spring-boot 项目中的模板

spring boot + thymeleaf 无法正确编码 POST 中的 UTF-8 字符

Spring Boot 中的 I18n + Thymeleaf