12

/grails-app/views/index.gspに変更を加えています。

ファイルを保存してFirefoxでhttp:// localhost:8080 / index.gspを更新すると、古いバージョンのファイルが取得されます。

Grailsが古いバージョンのファイルをキャッシュおよびレンダリングするのを防ぐ方法はありますか?

(サーバーを再起動してFirefoxのキャッシュをクリアしてみました。)

ありがとう!

4

6 に答える 6

16

このようなフィルターは使えませんか?

class CacheFilters{

    def filters = {
        all(controller: '*', action: '*') {
            before = {
                ((HttpServletResponse) response).setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
            }
            after = {

            }
            afterView = {

            }
        }
    }

}
于 2011-06-15T10:48:19.023 に答える
8

これを行う簡単な方法はないようですが、それほど手間はかかりません。私のソリューションは、GSPをレンダリングするサーブレット(および非GSP要求に使用されるコントローラー)をサブクラス化します。

サーブレットサブクラスは次のとおりです。

package com.burtbeckwith;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.codehaus.groovy.grails.web.pages.GroovyPagesServlet;

public class CachingPageServlet extends GroovyPagesServlet {

   private static final String HEADER_PRAGMA = "Pragma";
   private static final String HEADER_EXPIRES = "Expires";
   private static final String HEADER_CACHE_CONTROL = "Cache-Control";

   @Override
   public void doPage(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      response.setHeader(HEADER_PRAGMA, "no-cache");
      response.setDateHeader(HEADER_EXPIRES, 1L);
      response.setHeader(HEADER_CACHE_CONTROL, "no-cache");
      response.addHeader(HEADER_CACHE_CONTROL, "no-store");
      super.doPage(request, response);
   }
}

そして、web.xmlのオリジナルを置き換える必要があります(「grailsinstall-templates」を実行し、src / templates / war / web.xmlを編集します)。

<servlet>
   <servlet-name>gsp</servlet-name>
   <servlet-class>com.burtbeckwith.CachingPageServlet</servlet-class>
</servlet>

また、コントローラーベースの応答についても同じことを行う必要があるため、このコントローラーサブクラスを使用します。

package com.burtbeckwith;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.codehaus.groovy.grails.web.servlet.mvc.SimpleGrailsController;
import org.springframework.web.servlet.ModelAndView;

public class CachingSimpleGrailsController extends SimpleGrailsController {

   private static final String HEADER_PRAGMA = "Pragma";
   private static final String HEADER_EXPIRES = "Expires";
   private static final String HEADER_CACHE_CONTROL = "Cache-Control";

   @Override
   public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
      response.setHeader(HEADER_PRAGMA, "no-cache");
      response.setDateHeader(HEADER_EXPIRES, 1L);
      response.setHeader(HEADER_CACHE_CONTROL, "no-cache");
      response.addHeader(HEADER_CACHE_CONTROL, "no-store");
      return super.handleRequest(request, response);
   }
}

通常のSpringBeanをオーバーライドするには、grails-app / conf / spring/resources.groovyに登録する必要があります。

mainSimpleController(com.burtbeckwith.CachingSimpleGrailsController) {
   grailsApplication = ref('grailsApplication', true)
}

共有ヘッダー設定コードは、ここで行ったようにコピー/貼り付けするのではなく、ユーティリティクラスに抽出する必要があります。

于 2009-08-31T03:07:29.677 に答える
3

キャッシュヘッダーと呼ばれる、grailsのキャッシュ動作を制御するためのプラグインがあります:http: //grails.org/plugin/cache-headers

于 2012-03-13T21:55:36.953 に答える
2

開発モードで実行していることを確認してください(つまり、grailstest | prodrun-appではなくgrailsrun-appを使用すると、テストと本番環境でページのキャッシュが有効になります。開発モードの場合は、Shiftキーを押しながらクリックしてみてください。 Firefoxの更新。

于 2009-08-30T07:05:31.150 に答える
1

開発中にブラウザのキャッシュを無効にしたいだけの場合は、Firefox用のWebDeveloperアドオンを使用できます。

https://addons.mozilla.org/en-US/firefox/addon/60

このアドオンをインストールし、「キャッシュを無効にする」を選択します。これにより、すべてのWebサイトのキャッシュが無効になることを忘れないでください。

于 2009-08-31T13:25:13.943 に答える
-1

開発目的でctrl+F5を押すと、ページとキャッシュも更新されます。本番環境でキャッシュし、ページルックアップのパフォーマンスを向上させるために、ui-performanceプラグインとgrailsのリソースプラグインを使用します。

于 2012-03-14T04:42:48.250 に答える