【发布时间】:2015-03-05 10:27:29
【问题描述】:
我在 Spring Boot 1.2.2 中使用 VersionResourceResolver 进行缓存清除。不幸的是,它认为操纵 CSS 文件中指定的 URI 很聪明。
以 Twitters Bootstrap 为例。它会在 CSS 文件所在目录上方的目录中查找字体。
@font-face {
font-family: 'Glyphicons Halflings';
src: url('../fonts/glyphicons-halflings-regular.eot');
src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');
}
如果没有 VersionResourceResolver,它会像预期的那样工作:
GET http://example.com/res/css/bootstrap.min.css
GET http://example.com/res/fonts/glyphicons-halflings-regular.woff
现在我添加 VersionResourceResolver:
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/res/**")
.addResourceLocations("/resources/")
.setCachePeriod(CACHE_SECONDS)
.resourceChain(true)
.addResolver(new VersionResourceResolver()
.addFixedVersionStrategy(buildVersion, "/**/"))
.addResolver(new PathResourceResolver());
}
现在发生了:
GET http://example.com/res/085a8/css/bootstrap.min.css
GET http://example.com/res/085a8/css/fonts/glyphicons-halflings-regular.woff
那么,为什么会这样呢?因为有人篡改了 CSS 文件中的 URI:
@font-face {
font-family: 'Glyphicons Halflings';
src: url('085a8/../fonts/glyphicons-halflings-regular.eot');
src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('085a8/../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('085a8/../fonts/glyphicons-halflings-regular.woff') format('woff'), url('085a8/../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');
}
Bootstrap 只是一个例子。这发生在 CSS 资源中指定的几乎所有(奇怪的是不是所有的)URI 上。使用 Spring 的 CssLinkResourceTransformer 没有帮助。那么,我如何告诉 Spring 不要操作 CSS 文件呢?
编辑:我发现,Spring 调用了 CssLinkResourceTransformer。但我没有在任何地方指定。可能 Spring Boot 会在某个地方自动配置它。
03-05 16:12:47.711 TRACE 11064 --- [nio-8080-exec-2] o.s.w.s.r.CssLinkResourceTransformer : Transforming resource: ServletContext resource [/resources/css/bootstrap.min.css]
2015-03-05 16:12:47.716 TRACE 11064 --- [nio-8080-exec-2] o.s.w.s.r.CssLinkResourceTransformer : Link modified: 77a6e2aa77283c05d58f4ab52102f55684b6fb04/../fonts/glyphicons-halflings-regular.eot (original: ../fonts/glyphicons-halflings-regular.eot)
2015-03-05 16:12:47.716 TRACE 11064 --- [nio-8080-exec-2] o.s.w.s.r.CssLinkResourceTransformer : Link not modified: ../fonts/glyphicons-halflings-regular.eot?#iefix
2015-03-05 16:12:47.717 TRACE 11064 --- [nio-8080-exec-2] o.s.w.s.r.CssLinkResourceTransformer : Link modified: 77a6e2aa77283c05d58f4ab52102f55684b6fb04/../fonts/glyphicons-halflings-regular.woff2 (original: ../fonts/glyphicons-halflings-regular.woff2)
2015-03-05 16:12:47.718 TRACE 11064 --- [nio-8080-exec-2] o.s.w.s.r.CssLinkResourceTransformer : Link modified: 77a6e2aa77283c05d58f4ab52102f55684b6fb04/../fonts/glyphicons-halflings-regular.woff (original: ../fonts/glyphicons-halflings-regular.woff)
2015-03-05 16:12:47.719 TRACE 11064 --- [nio-8080-exec-2] o.s.w.s.r.CssLinkResourceTransformer : Link modified: 77a6e2aa77283c05d58f4ab52102f55684b6fb04/../fonts/glyphicons-halflings-regular.ttf (original: ../fonts/glyphicons-halflings-regular.ttf)
2015-03-05 16:12:47.719 TRACE 11064 --- [nio-8080-exec-2] o.s.w.s.r.CssLinkResourceTransformer : Link not modified: ../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular
Edit2:如果你注册了 RessourceChain -.-,Spring 会自动创建一个 CssLinkResourceTransformer。见https://github.com/spring-projects/spring-framework/blob/master/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ResourceChainRegistration.java#L112
【问题讨论】:
标签: css spring-mvc spring-boot