在这篇文章中,我想分享一下O&B的一个团队的经验教训。 他们正在使用带有Spring Security的Spring Boot。
默认情况下,Spring Security保护的所有内容都将通过以下HTTP标头发送到浏览器:
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
本质上,响应将永远不会被浏览器缓存。 尽管这似乎效率低下,但实际上有充分的理由要采用这种默认行为。 当一个用户注销时,我们不希望下一个登录的用户能够看到前一个用户的资源(如果缓存了,则可以这样做)。
默认情况下不缓存任何内容,并保留显式启用缓存是有意义的。 但是,如果不缓存任何内容,则不好,因为这会导致高带宽使用和缓慢的页面加载。
很好的是,在Spring Boot中启用静态内容缓存非常容易(即使使用Spring Security也是如此)。 只需配置一个缓存周期。 就是这样!
# Boot 2.x
spring.resources.cache.cachecontrol.max-age=14400
# Boot 1.x
spring.resources.cache-period=14400
但是有一些陷阱! 对于某些版本,它不是那么简单! 让我进一步解释。
有几种方法可以返回内容:
- 通过Spring Boot自动配置的静态资源请求处理程序的静态内容
- 控制器方法返回视图名称(例如,解析为JSP)
- 返回
HttpEntity
(或ResponseEntity
)的控制器方法
启用静态内容缓存
第一个(提供静态内容)是通过配置所述属性(通常在如上所述的application.properties
中)来处理的。
通过HttpServletResponse设置
在第二种情况下,控制器处理程序方法可以选择通过HttpServletResponse
方法参数设置“ Cache-Control”标头。
@Controller
... class ... {
@RequestMapping(...)
public String ...(..., HttpServletResponse response) {
response.setHeader("Cache-Control", "max-age=14400");
return ...; // view name
}
}
只要Sp