JAvaブロッキング、フィルタ

8888 ワード

フィルタとブロッキング:両者には大きな類似性があります.しかし、Struts 2のブロッキングはサーブレットのフィルタほど機能的ではないようです.理由は以下の2点である:1 interceptorはaction(servletに相当)のみをブロックし、jspページに対して無効である2 interceptorはフォームを提出した後にしか機能せず、アドレスバーに直接入力したurlに対しては無力である.これにより、完全な認証ができなくなります.一、Struts 2ブロックの理解
  • Struts 2ブロッキングは、あるアクションまたはアクションにアクセスする方法である、フィールドの前後にブロッキングを実施し、Struts 2ブロッキングは挿抜可能であり、ブロッキングはAOPの実現である.
  • インターセプタスタック(Interceptor Stack).Struts 2ブロッキングスタックは、ブロッキングを一定の順序でチェーンに結合することである.ブロックされたメソッドまたはフィールドにアクセスすると、Struts 2ブロックチェーン内のブロックは、以前に定義された順序で呼び出されます.二、Struts 2ブロッキングを実現する原理Struts 2ブロッキングの実現原理は比較的簡単であり、struts 2のactionを要求すると、Struts 2はプロファイルを検索し、その構成に基づいて相対的なブロッキングオブジェクトをインスタンス化し、リストに列挙し、最後に列表のブロッキング3を呼び出し、Struts 2ブロッキングを定義する.Struts 2は、ユーザカスタムブロッカーがcom.opensymphony.xwork 2.interceptor.Interceptorインタフェースを実装する必要があることを規定している.このインタフェースは3つのメソッドを宣言している
     void init(); void destroy(); String intercept(ActionInvocation invocation) throws Exception;
    
  • ここで、initメソッドとdestroyメソッドは、ブロックが使用されているかどうかにかかわらず、struts.xmlにStruts 2ブロックが宣言されている限り、プログラムの開始と終了時に1回ずつ実行されます.interceptメソッドはブロックの主体であり,ブロックが有効になるたびにその論理を実行する.しかし、strutsでは、このステップを簡略化するためにいくつかの抽象クラスが提供されています.
    public abstract class AbstractInterceptor implements Interceptor;
    public abstract class MethodFilterInterceptor extends AbstractInterceptor;
    

    いずれもテンプレートメソッドで実現されています.AbstractInterceptorはinit()とdestroy()の空の実装を提供し、intercept()メソッドを上書きするだけで使用できます.一方、MethodFilterInterceptorは、includeMethodsとexcludeMethodsの2つのプロパティを提供し、このブロッキングを実行するactionをブロックする方法を提供します.ブロックする必要がある方法はparamによって追加または排除することができる.一般的に、ブロッキングの書き方はあまり悪くありません.次の例を示します.
    package interceptor;
    import com.opensymphony.xwork2.ActionInvocation;
    import com.opensymphony.xwork2.interceptor.Interceptor;
    public class MyInterceptor implements Interceptor {
    public void destroy() {
    // TODO Auto-generated method stub
    }
    public void init() {
    // TODO Auto-generated method stub
    }
    public String intercept(ActionInvocation invocation) throws Exception {
    System.out.println("Action        ");      
    //       (        ,    Action)   
    final String res = invocation.invoke();   
    System.out.println("Action        ");   
    return res;   
    }
    }
    

    四、Struts 2ブロッカーStruts 2ブロッカーを構成するにはstruts.xmlで次のように宣言する必要がありますstruts.xmlプロファイル
    
    
    
    
    
             /index.jsp  /success.jsp    
       
    
    
    
    
    
    
    
       
      
      
    
    
    Alias Interceptor
    alias
                        ,      
    
    
    Chaining Interceptor
    chain
        Action         Action  ,   chain   result()    。
    
    
    Checkbox Interceptor
    checkbox
       checkbox      ,      checkbox      false, HTML             checkbox。
    
    
    Cookies Interceptor
    cookies
         name,value   cookies
    
    
    Conversion Error Interceptor
    conversionError
        ActionContext    Action      。
    
    
    Create Session Interceptor
    createSession
         HttpSession,        HttpSession      。
    
    
    Debugging Interceptor
    debugging
                         。
    
    
    Execute and Wait Interceptor
    execAndWait
         Action,                。
    
    
    Exception Interceptor
    exception
              
    
    
    File Upload Interceptor
    fileUpload
            
    
    
    I18n Interceptor
    i18n
           locale
    
    
    Logger Interceptor
    logger
      Action   
    
    
    Message Store Interceptor
    store
            ValidationAware   Action      ,  ,     。
    
    
    Model Driven Interceptor
    model-driven
            ModelDriven, getModel       Value Stack 。
    
    
    Scoped Model Driven
    scoped-model-driven
        Action   ScopedModelDriven,           Scope   model  Action setModel      Action  。
    
    
    Parameters Interceptor
    params
              Action  。
    
    
    Prepare Interceptor
    prepare
      Acton   Preparable,       Action  prepare  。
    
    
    Scope Interceptor
    scope
     Action    session application     。
    
    
    Servlet Config Interceptor
    servletConfig
        HttpServletRequest HttpServletResponse   , Map     。
    
    
    Static Parameters Interceptor
    staticParams
     struts.xml                Action 。
    
    
    Roles Interceptor
    roles
            JAAS   Role,      。
    
    
    Timer Interceptor
    timer
      Action     
    
    
    Token Interceptor
    token
      Token     
    
    
    Token Session Interceptor
    tokenSession
     Token Interceptor  ,                Session 
    
    
    Validation Interceptor
    validation
      action-validation.xml               。
    
    
    Workflow Interceptor
    workflow
      Action validate  ,       ,     INPUT  
    
    
    Parameter Filter Interceptor
    N/A
                  
    
    
    Profiling Interceptor
    profiling
          profile
    

    =フィルタ=====================================================================================================================================次にservletまたはstrutsのactionに転送してビジネスロジックを行います.例えば、不正url(login.doのアドレス要求ではありません.ユーザーがログインしていない場合はフィルタリングします)をフィルタリングしたり、servletまたはstrutsのactionに転送する前に文字セットを統一的に設定したり、不正な文字ブロックを削除したりします.フェース向けにプログラミングするのは、あなたのserviceまたは方法です.前にメソッドを呼び出したり、メソッドの後にメソッドを呼び出したりします.例えば、動的エージェントはブロックの簡単な実装です.メソッドを呼び出す前に文字列を印刷したり(または他のビジネスロジックの操作をしたり)、メソッドを呼び出した後に文字列を印刷したり、異常を投げ出したりするときにビジネスロジックの操作をしたりすることができます.ブロッカーとフィルタの違い:
    ブロッキングはjavaの反射機構に基づいており,フィルタは関数コールバックに基づいている.ブロッカーはservletコンテナに依存せず、フィルタはservletコンテナに依存します.ブロッキングはactionリクエストにのみ機能し、フィルタはほとんどのリクエストに機能します.ブロッキングはactionコンテキスト、値スタック内のオブジェクトにアクセスできますが、フィルタはアクセスできません.Actionのライフサイクルでは、ブロッキングは複数回呼び出されますが、フィルタはコンテナの初期化時に1回しか呼び出されません.
    実行順序:フィルタ前-ブロック前-Action処理-ブロック後-フィルタ後.個人的にはフィルタリングは横方向のプロセスであり、まずクライアントが提出した内容をフィルタリングする(例えば、ログインしていないユーザーが内部ページにアクセスできない処理).フィルタリングが通過すると、ブロッカーはユーザーが提出したデータの検証を検査し、前期のデータ処理を行い、処理後のデータを対応するActionに送る.Action処理が完了して戻った後、ブロッキングは他のプロセス(まだ何をするか考えていない)を行い、フィルタの後続操作に戻ることができます.1つのFilterは、複数の要求または応答をブロックする責任を負うことができる.1つの要求または応答は、複数のFilterによってブロックされることもできる.Filterを作成するには、(1)Filter処理クラスの作成:(2)Web.xmlファイルでFilterを構成する2つのステップしか必要ありません.Filterを作成するにはjavax.servlet.Filterインタフェースを実装する必要があります.このインタフェースには3つの方法が定義されています.•void init(FilterConfig config):Filterの初期化を完了します.•void destroy():Filterが破棄される前に、一部のリソースの回収を完了します.•void doFilter(サーブレットRequest request,サーブレットResponse response,FilterChain chain):各リクエストおよびレスポンスの追加処理を行うフィルタ機能を実現します.フィルタFilterには、配置ファイルのfilter要素によって駆動されるinit()->doFilter()->destroy()というライフサイクルもあります.servlet 2.4では、フィルタは同様にディスペンサを要求するために使用できますが、INCLUDEまたはFOrWARDまたはREQUESTまたはERROR要素がfilter-mappingにあることをweb.xmlで宣言する必要があります.Filterでよく使われるシーン:例1、ログの記録、リクエストが到着したときに、このフィルタでログの記録を行う.処理が完了すると、後続のFilterまたは処理に進む.手順1:Filterクラスの作成
    package test.filter;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    
    
    public class LogFilter implements Filter {
    private FilterConfig config;
    //        
    public void init(FilterConfig config) {
    this.config = config;
    }
    //       
    public void destroy() {
    this.config = null;
    }
    public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain) {
    //   ServletContext   ,      
    ServletContext context = this.config.getServletContext();
    long before = System.currentTimeMillis();
    System.out.println("    ... ");
    //       HttpServletRequest   
    HttpServletRequest hrequest = (HttpServletRequest) request;
    //     
    context.log("Filter             : " + hrequest.getServletPath());
    try {
    // Filter       ,           。
    chain.doFilter(request, response);
    } catch (Exception e) {
    e.printStackTrace();
    }
    long after = System.currentTimeMillis();
    //     
    context.log("    ");
    //       
    context.log("       " + ((HttpServletRequest) request).getRequestURI()
    + "      : " + (after - before));
    }
    }
    

    上記のリクエストFilterでは、リクエストのURLのみをログに記録し、すべてのリクエストに対してchain.doFilter(request,reponse)メソッドを実行し、Filterがリクエストをフィルタリングした後もリクエストを宛先アドレスに送信する.手順2:Web.xmlでFilterを構成する
    	
    	
    	
    	log
    	
    	 test.filter.LogFilter
    	
    	
    	
    	
    	log
    	
    	/filter/*
    	
    	
    	
    

    フィルタの一般的な適用:1、ユーザー要求を統一的に検証する2、request.setCharacterEncoding(符号化フォーマット)とfilterのfilterconfig.getInitParameter(符号化フォーマット名)を組み合わせてfilterのparamに構成された符号化方式を取得して要求を符号化変換する.3、ユーザから送信されたデータをフィルタ置換する4、画像フォーマットを変換する5、対応するコンテンツを圧縮する