5

我们在 Web 应用程序中有一堆 .js 文件,它们不位于单个目录下。UI 是单独开发的,重新设计它以将所有 *.js 文件放在一个地方非常耗时。

问题是这些文件被浏览器大量缓存,这会在每次应用程序更新时产生很多问题。我们决定关闭这些文件的缓存。

因此,*.js 文件被包含在 servlet 映射中:

<servlet-mapping>
    <servlet-name>app</servlet-name>
    <url-pattern>*.js</url-pattern>
</servlet-mapping>

我尝试过使用 mvc:resources 但它不能像这样处理 url 的掩码:

<mvc:resources mapping="*.js" location="*.js" cache-period="0"/>

这不起作用,当我尝试访问 js 文件时,我得到了 404 响应。

我也试过 mvc:interceptor:

    <mvc:interceptor>
        <mvc:mapping path="*.js"/>
        <bean id="webJSContentInterceptor"
              class="org.springframework.web.servlet.mvc.WebContentInterceptor">
            <property name="cacheSeconds" value="0"/>
            <property name="useExpiresHeader" value="true"/>
            <property name="useCacheControlHeader" value="true"/>
            <property name="useCacheControlNoStore" value="true"/>
        </bean>
    </mvc:interceptor>

这也会导致 404 错误。

这种事情可能吗?

4

3 回答 3

6

我意识到这个答案来得太晚了,但这里供将来参考。

使用 ResourceHttpRequestHandlers (Spring 3.2+) 提供静态资源

首先,你在正确的轨道上<mvc:resources>,你的路径模式声明中只有一个错字:

  • 必须是您的资源所在的location文件夹位置(这可以在您的文件系统上、在您的 webapp 资源中、在类路径上、在 webJAR 中......)
  • 模式必须考虑到您的项目布局

假设您有以下结构:

src/main/webapp/static/
  |- js/
  |- js/lib/jquery.js
  |- js/main.js
  |- css/style.css

您可以像这样提供所有静态资源:

<mvc:resources mapping="/**" location="/static/"/>

注意:cache-period其他属性应该可以正常工作。

资源处理功能(Spring 4.1+)

从 Spring 4.1 开始,有新的、更灵活的方法来处理它。

例如,您可以使用 JS 和 CSS 文件实现缓存清除,如下所示:

<mvc:resources mapping="/**" location="/static/"/>
  <mvc:resource-chain resource-cache="true">
    <mvc:resolvers>
      <mvc:version-resolver>
        <mvc:content-version-strategy patterns="/**"/>
      </mvc:version-resolver>
    </mvc:resolvers>
  </mvc:resource-chain>
</mvc:resources>

当然,您可以使用 javaconfig 实现相同的目标(更优雅):

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {

  VersionResourceResolver versionResolver = new VersionResourceResolver()
    .addContentVersionStrategy("/**");

  registry.addResourceHandler("/**")
    .addResourceLocations(/static/)
    .resourceChain(true).addResolver(versionResolver);
}

有关更多信息,请参阅此博客文章此示例应用程序

于 2015-05-09T11:36:43.927 回答
2

这是不可能的。但是有几种选择:

  • 实现一个自定义过滤器,将其映射到 *.js 掩码并从那里设置所需的标题。
  • 在 JavaScript 中处理缓存破坏。我们这样做了,并在我们的 JS 文件的路径中添加了一个版本号。
于 2012-09-28T17:55:42.550 回答
0

据我说,问题是你的 JS 文件没有被加载。在您尝试过的第二种方法中,您没有正确指定路径属性的值。映射是正确的,但是您需要从根目录中指定 JS 文件所在的确切位置来代替路径。

尝试这样做。希望这对您有所帮助。

于 2012-09-21T10:39:35.507 回答