1

ビューがレンダリングされた後に実行するように現在定義されているフィルターがあります。

class MyFilter {
  def filters = {
    doStuff(controller: '*', action: '*') {
      before = {...}
      after = {...} 
      afterView = { 
        // code I want to run when EVERYTHING is set and done }
        Holder.setCurrentData(null)
    }
  }
}

これは機能するはずですが、フィルター<g:message />の後にタグ (およびおそらく他のもの。これは現時点で私が興味を持っているものです) が実行されることに気付きました。afterView

このフィルターを使用して、ThreadLocal での現在の実行に関する情報を追跡し、要求が完了したときに自分でクリーンアップしたことを確認したいため、これは問題です。リクエスト/セッション オブジェクトを使用してデータをシャッフルしたくありません。そのままで、ThreadLocal の値を照会できる Holder クラスがあります。

カスタム MessageSource でその ThreadLocal からの情報が必要です。それが、フィルター<g:message />の後に呼び出されることに気付いた方法です。afterView

4

1 に答える 1

2

サーブレット フィルターを使用できます。

package com.mycompany

import java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.springframework.web.filter.GenericFilterBean;

public class MyFilter extends GenericFilterBean {

   public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {

      try {
         chain.doFilter(req, res);
      }
      finally {
         Holder.setCurrentData(null);   
      }
   }
}

まだ実行grails install-templatesしていない場合は実行してから、次のように src/templates/war/web.xml に登録できます。

<filter>
   <filter-name>myFilter</filter-name>
   <filter-class>com.mycompany.MyFilter</filter-class>
</filter>

<filter-mapping>
   <filter-name>myFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

GenericFilterBean便宜上拡張しましたが、javax.servlet.Filterインターフェイスを直接実装することもできます。Groovy で作成することもできますが、フィルターはすべての要求に対して呼び出されるため、Java で作成する傾向があり、Groovy が追加するわずかなオーバーヘッドがここで追加される可能性があります。

于 2013-01-25T04:18:04.220 に答える