4

コントローラの各defが呼び出される前に(新しいリクエストがサーバーに送信される前に)関数を実行する必要があります。この関数では、1)有効かどうかのセッションチェックを実行し、パラメーターを使用して適切なアクションとコントローラーにリクエストを転送します。2)ユーザーが送信したパラメーターのサニタイズチェックを実行します。

コントローラーごとのインターセプターを認識していますが、グローバル共通インターセプターを作成するにはどうすればよいですか。

この関数をgrailsでどこでどのように呼び出すことができますか?前もって感謝します..

4

3 に答える 3

6

コントローラでbeforeInterceptorをまったく同じ目的で使用できます。これをBaseControllerなどの新しいコントローラーに入れ、実行したいすべてのものを入れてから、既存のすべてのコントローラーをBaseControllerで拡張すると、準備が整います。beforeInterceptorの詳細については、ここをクリックしてください

:他のすべてのコントローラーによって拡張された共通のコントローラーが既にある場合は、新しいコントローラーを実装する必要はありません。そのコントローラー自体にbeforeInterceptorを実装するだけです。

または、フィルターを実装して、そのフィルターですべての作業を行うこともできます。Grailsのフィルターの詳細については、ここをクリックしてください

于 2012-03-27T02:05:44.580 に答える
4

次の方法でフィルターを追加して、各アクションをインターセプトできます


class AbcFilters {
 def filters = {
  abc1(controller: '*', action: '*') {
  }

  abc2(controller: '*Test', action: '*') {
  }


  abc2(controllerExclude: 'AppStartup*', action: '*') {

  }
 }
}
于 2012-03-27T04:47:50.673 に答える
3

すべてのコントローラーのすべてのアクションのフィルターは次のとおりです。

all(controller: '*', action: '*') {
    before = {

    }
    after = {

    }
    afterView = {

    }
}

スプリングセキュリティを使用するセッションチェックのフィルターは次のとおりです。

     auditEntry(controller:'*', action:'*') {
            before = {
                if (session.isNew()){
                    def userName
                    def principal = SCH?.context?.authentication?.principal 
                    if (principal instanceof String){
                        userName = principal
                        log.info "Anonymous user has logged into the application."
                    }else{
                        userName = principal?.username
                        log.info "User $userName has logged into the application."
                        log.debug (principal)
                    }
                }
            }
        }
于 2012-03-27T04:56:46.777 に答える