春学習(三〇から三) - インターセプタ

インターセプタSpringMVCインターセプタも非常に重要と非常に便利であり、その主な役割は、ユーザの要求と対応する処理を実行するを傍受することです。たとえば、アクセス許可を確認するためにそれを使用するか、またはユーザーがログインし、またはあるされているかどうか、それは、現在の時刻が購入時であるかどうかを判断するために12306のように見えます。

  Aは、実装クラスインターセプタを定義します

 インターセプタSpringMVC傍受要求はHandlerInterceptorによって達成されます。SpringMVCインターセプタは非常に単純な定義では、二つの方法は、第一の方法はHandlerInterceptorインタフェースの春を達成するために、クラスインターセプタを定義することである、又はHandlerInterceptorクラス継承このクラスであり、存在するように既に設けられたバネとして実装するインタフェース、実装する抽象クラスHandlerInterceptorAdapter HandlerInterceptorインタフェース;第二の方法は、スプリングWebRequestInterceptorインターフェース、または継承達成WebRequestInterceptorクラスを達成することです。

(A)インタフェースを実装HandlerInterceptor

HandlerInterceptorインタフェース定義の三つの方法、私たちは、これらの三つの方法を介してユーザの要求を傍受するために処理されています。

   (1)preHandle(HttpServletRequestのリクエスト、HttpServletResponseの応答、オブジェクトハンドル)メソッド、名前が示すように、この方法は、要求処理の前に呼び出されます。SpringMVCインターセプタは、コールの鎖で、又は同時に一つのアプリケーションに要求インターセプタ複数の中に存在してもよいです。インターセプタへの各呼び出し順次その宣言順序の点で行われ、第一及びpreHandleインターセプタメソッドが実行され、この方法では、いくつかの事前初期化を行うことが可能であるが、前処理、又は現在の要求であり、そしてあなたは、要求を継続すべきかどうかを判断するために、この方法では、いくつかの判断を行うことができます。それはリクエストの終了を示す、偽に戻り、それ以降のインターセプタコントローラがもはや行われなくなる場合は、このプロセスの戻り値は、ブール値ブール型である戻り値がtrueの場合preHandleがインターセプタでメソッドをコールし続けますインターセプターは、最後の時間であればコントローラのメソッド現在のリクエスト呼び出しされます。

   (2)postHandle(HttpServletRequestのリクエスト、HttpServletResponseの応答、オブジェクトハンドル、のModelAndViewのModelAndView)法、解釈preHandleの方法我々はこの方法を知っているafterCompletionメソッドに言うべきバックのみインターセプタのpreHandle方法で返すことができ含んが現在属し値がtrueの場合の順序で呼び出されます。現在のリクエストがコントローラメソッドの呼び出し後に実行され、処理された後に定義することによりpostHandle方法は、ですが、それは、ビューが返すのDispatcherServletをレンダリングする前に、我々はこの方法でコントローラの処理後のModelAndViewオブジェクトを操作することができますので、呼ばれるようになります。preHandle postHandle方法と方向が呼び出され、逆に、会議の後の文に反して、実行のpostHandleインターセプタ方法、そのインターセプタと少しタイプ内部Struts2のの実装です。インターセプタ内部Struts2の実行が鎖であるが、内部のニーズが次インターセプタまたはアクションの呼び出しをトリガするための方法のActionInvocationたinvoke手動Struts2のを呼び出すために、その後、呼出しメソッド呼び出しの前に、各インターセプタの内容に従っています宣言オーダー実行、およびメソッド呼び出し内容が反転した後。

   (3)afterCompletion(HttpServletRequestのリクエスト、HttpServletResponseの応答、オブジェクトハンドル、例外EX)、この方法は、電流が戻り値が真であるときに実行されるインターセプタpreHandle方式に対応する必要があります。名前が示すように、全体の要求後方法、その実行後にレンダリングされた対応するビューのDispatcherServletあります。この方法の主な役割は、クリーンアップ作業のための資源ということです。

ここでは簡単なコードを記述されています。

インターセプタパッケージ; 

インポートするjavax.servlet.http.HttpServletRequest; 
インポートするjavax.servlet.http.HttpServletResponse; 
インポートorg.springframework.stereotype.Component; 
インポートorg.springframework.web.servlet.ModelAndView; 
インポートorg.springframework.web.servlet。 handler.HandlerInterceptorAdapter; 

@Component 
パブリック クラスLoginInterceptor延び巧妙名前HandlerInterceptorAdapter { 

    / * * 
     *名前が示すように、この方法は、コントローラの処理の前に呼び出されるプロセッサを傍受するために使用されるpreHandle、
     インターセプタインターセプタがする鎖であり、* SpringMVC同時にそこにある
     以上*インターセプタ、他の後に続いSpringMVCの一つは声明によるとオーダーの実行前と後、およびpreHandle方法でインターセプタのすべてがします
     *コントローラのメソッド呼び出しの前に呼び出されます。このSpringMVCインターセプター鎖構造も中断されることが、この割り込みは、戻りpreHandleを作ることです
     リターンの偽のpreHandleが全体の要求が終わったときとき*戻り値は、falseです。
     * /   
    @Override 
    パブリックブールザpreHandle(HttpServletRequestのリクエスト、レスポンスHttpServletResponseの、オブジェクトハンドラ)が
        例外{スロー
        システム。OUTは .println(" =なparameterMap " + request.getParameterMap()); 
        ザシステムOUT .println(" のinputStream = " + 依頼.getInputStream());
         戻り ; 
    } 
    
    / * * 
     のみ電流preHandleで*このメソッドの戻り真インターセプタこの方法が実行されます。postHandleインターセプトプロセッサが使用され、実行時間のプロセッサで処理されます
     *の後に、それはコントローラの実行メソッド呼び出しの後に、ですが、あなたがこの方法で動作させるのModelAndViewできる手段、のDispatcherServletにビューをレンダリングする前に実行されます 
     のために*。鎖状構造のこの方法は、通常、会議後の最初の文であると反対方向、インターセプタインターセプタ方法でアクセスが、内部ビット等Struts2のインターセプタ実装プロセスでそれと呼ばれ
     手動で起動するだけでStruts2のインターセプトメソッド内* Struts2ののメソッド呼び出しActionInvocationのinvokeメソッド呼び出しActionInvocationは、次のインターセプタを呼び出すことで
     、そのコンテンツは、コンテンツがインターセプタを呼び出すための呼び出しに書き込まれた後に呼び出されるために、インタセプタが呼び出しを呼び出す前に書かれた前に呼び出される*またはアクションを呼び出しますメソッドの後。
     * /   
    @Override 
    公共 ボイド(postHandle 
            HttpServletRequestのリクエスト、レスポンスHttpServletResponseの、オブジェクトハンドラのModelAndViewのModelAndView)が
            例外をスロー{ 
    } 
    
    / * *は、
     プロセスが*返すことであるときに実行されるこの方法はpreHandleはインターセプタが真の対応が必要です。方法は、要求全体、レンダリング即ちDispatcherServletのビューが完了した後 
     このメソッドの主な役割は、リソースをクリーンアップするために使用されている*、当然のことながら、この方法は、この現在のインターセプタすることができます実行されるとき、真preHandleメソッドの戻り値。
     * /   
    @Override 
    公共 無効afterCompletion(
            HttpServletRequestのリクエスト、HttpServletResponseの応答、オブジェクト・ハンドラは、例外EX)が
            例外をスロー{ 
    } 
    
}
    

 

(B)界面WebRequestInterceptorを実装

 WebRequestInterceptorも3つのメソッドを定義して、我々は、これらの3つの方法で傍受を達成するためにあります。これらの三つの方法は、同じパラメータのWebRequestを渡され、それこのWebRequestクラス何ですか?これは、WebRequestクラスWebRequestInterceptorのすべての操作は、HttpServletRequestのに同期され、現在の要求で渡された、WebRequestクラススプリングは、基本的にHttpServletRequestのと同じである方法を定義するインターフェイスを定義しています。

   (1)preHandle(WebRequestクラスリクエスト)方法。要求が処理される前に、このメソッドは、コントローラのメソッドの呼び出しの前に呼び出されますよう、呼び出されます。preHandleでHandlerInterceptorと、この方法は異なって、メソッドの戻り値の主な違い嘘は無効であり、戻り値ではありませんそのため、休止状態を使用しているとき、私たちは、一般的に主に私達ができるよう、準備作業のリソースを実行するためにそれを使用しますセッション・オブジェクトを作成し、[プロパティに入れWebRequestクラスのsetAttribute(名前、値、範囲)WebRequestクラスを使用するには、この方法を休止。ここで第三のパラメータは、Integer型のパラメータであり、この方法の範囲のsetAttributeを話すことができます。インタフェースRequestAttributesで親レイヤーは、3つの定数を定義してWebRequestクラス:

   SCOPE_REQUEST:その値は、リクエストへのアクセスのみを表す、0です。

   SCOPE_SESSION:環境は、それがローカルセッション、または一般に代わってセッションを表し、セッションスコープ内でアクセスすることができる単離することができた場合、その値は、1です。

   SCOPE_GLOBAL_SESSION:その値が環境で許可されていれば、それはグローバルに共有セッションを表し、又は通常のセッションの代わりに、セッションの範囲内でアクセスすることができ、2です。

   (2)postHandle(WebRequestクラス要求、ModelMapモデル)方法。このメソッドは、コントローラのメソッドの呼び出し後に呼び出される要求、後に処理されますが、この方法は、データの表示を変更するにはしたデータモデルModelMapを変更することができますので、前にレンダリングされ返されるビューに呼び出されます。この方法は、2つのパラメータがあり、WebRequestクラスオブジェクト全体がデータを要求転送するために使用される、そのようなデータはpreHandleで調製され、アクセスがWebRequestクラスによって送達され得る; ModelMap処理後に返さモデルコントローラオブジェクトであり、我々は変更することができモデルは、返されたモデルを変更する属性。

   (3)afterCompletion(WebRequestクラス要求、例外EX)方法。この方法は、リターンを考慮してレンダリングした後に実行され、全体の処理が終了する要求することができます。そのため、リソースを操作する方法で解放することができます。私たちはここでpreHandleに準備することができますリソースに渡されたWebRequestのパラメータが解放されます。例外は、例外ハンドラの例外となっている春のコントローラでスローケースを扱う場合、例外オブジェクトパラメータは、現在の要求を示している、これは例外オブジェクトがnullです。

ここでは簡単なコードを記述されています。

インターセプタパッケージ; 

インポートorg.springframework.stereotype.Component; 
インポートorg.springframework.ui.ModelMap; 
インポートorg.springframework.web.context.request.WebRequest; 
インポートorg.springframework.web.context.request.WebRequestInterceptor; 

@Component 
公衆 クラスSessionInterceptor実装WebRequestInterceptor { 

    / * * 
     *処理前の要求に行う、方法は、主にリソースデータを作成するために使用され、そしてそれらが要求された属性としてWebRequestクラスに配置することができる
     * /   
    @Override 
    公共 ボイドpreHandle(WebRequestクラスリクエスト)が
        例外をスロー{ 
        // この要求が範囲内に配置され、あなたはで取得した現在のリクエスト要求でき   
        request.setAttribute(要求を要求、WebRequest.SCOPE_REQUEST);
         // 状況がそうでなければ、それはアクセスすることができる一般的な現在のセッションであり、それだけセッションの範囲内のセッションの部分分離にアクセスすることができ、許可されている場合、これは、場所である   
        request.setAttribute (セッションセッション、WebRequest.SCOPE_SESSION);
         // 環境が許すならば、それはグローバル共有セッションにアクセスすることができ、そうでなければ、それは通常、現在のセッションでアクセスされる   
        request.setAttribute(globalSession " globalSession "WebRequest.SCOPE_GLOBAL_SESSION) システムOUTの .println(" セッションID = " + リクエスト。GETSESSIONID())。
    } 
    
    
    * 
     *実行リターンが表示する前にこのメソッドは、要求を処理した後、返さModelMapモデルコントローラオブジェクトを示す、コントローラの後に実行されます、あなたができる
     モデルリターンを変更する効果を達成するように、* ModelMapこの方法のプロパティを変更します。* / 
    @Override 公共のボイドザ・postHandleは(WebRequestクラス要求、ModelMapモデル)が
            スロー例外{ 
    } / * * 
     *コール・ビューのレンダリングは、主にいくつかのリソースを解放するために使用され、全体の要求の後に完了した後と言うことです。この方法は、* / 
    @Override 公共ボイドafterCompletion(WebRequestクラス要求、例外EX)が
            例外をスロー{ 
    } 
} / *
       
     
        

    
     
     
    

 

第二に、クラスの定義は、傍受システムSpringMVCにインターセプターに追加されます

  

<豆のxmlns = " http://www.springframework.org/schema/beans "   
    のxmlns:XSI = " http://www.w3.org/2001/XMLSchema-instance "のxmlns:コンテキスト= " のhttp:// WWW .springframework.org /スキーマ/コンテキスト"   
    のxmlns:MVC = " http://www.springframework.org/schema/mvc "   
    のxsi:schemaLocationの = " http://www.springframework.org/schema/beans   
     のhttp:// www.springframework.org/schema/beans/spring-beans-3.0.xsd   
     ます。http:// www.springframework.org/schema/context   
     ます。http://www.springframework.org/schema/context/spring-context-3.0.xsd   
     HTTP:// www.springframework.org/schema/mvc   
     HTTP:// www.springframework.org/schema/mvc/spring-mvc-3.0。 XSD ">
      
     < -インターセプタをインスタンス化するために、スキャンインターセプターが配置されているパック- >!
     <コンテキスト:スキャンコンポーネントベースの -package = " インターセプタ" /> 
     
     < -コンフィギュレーション・インターセプター- >!
     <MVC:インターセプタ>   
         < -直接MVCで定義されたインターセプタを使用してBeanの定義、:!ルートインターセプタ以下インターセプタはすべての要求をインターセプトします- >   
         <豆のクラス = interceptors.SessionInterceptor  />   
          
         <MVC:インターセプター>  
             <MVC:マッピングパス= "/ littleController / getLittleBallName " />   
             < - MVC :!インターセプター次の式で定義されるがMVCである。のみ切片にマッピング構成要求を- > 
       <ビーンクラス = " interceptors.LoginInterceptor " />
     </ MVC:インターセプタ>
   </ MVC:インターセプタ>
</豆>

MVCを利用することができる上記の例から分かるように:ラベルクレームインターセプタのインターセプタシリーズ、それらは鎖インターセプターを形成することができ、インターセプタの実行順序は、順に実行され、最初の文インターセプタpreHandle方法は、最初に実行されますが、その方法とpostHandle afterCompletionメソッドが、それは実行後になります。

          MVCでは:インターセプターは、ラベル文インターセプタの下で、主に二つの方法があります。

                    (1)直接目的インターセプターBean実装クラスを定義しています。このように宣言インターセプタインターセプタは、すべての要求をインターセプトします。

                    (2)使用MVC:迎撃ラベル文。この方法を使用すると、インターセプタMVC宣言することができます:必要なパスのインターセプトマッピングサブタブを定義するための要求。

          上記の二つの工程の後、インターセプターの役割の定義は、特定の要求が発生インターセプト。

 

 

 

 

 

 

おすすめ

転載: www.cnblogs.com/gllegolas/p/11862800.html