5

Webアプリケーションには、単一のディレクトリの下にない多数の.jsファイルがあります。UIは個別に開発されており、すべての*.jsファイルを1か所にまとめるように再設計するのはかなり時間がかかります。

問題は、これらのファイルがブラウザによってかなり大量にキャッシュされることであり、これにより、アプリケーションの更新ごとに多くの問題が発生します。そして、それらのファイルのキャッシュをオフにすることにしました。

したがって、*。jsファイルはサーブレットマッピングに含まれていました。

<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ファイルがロードされていないことです。試した2番目のアプローチでは、パス属性の値を正しく指定していません。マッピングは適切ですが、パスの代わりに、JSファイルがあるルートからの正確な場所を指定する必要があります。

そうしてみてください。これがお役に立てば幸いです。

于 2012-09-21T10:39:35.507 に答える