Java Filterフィルタの詳細とインスタンスコード

11624 ワード

Filterの概要
Filterはフィルタとも呼ばれ、サーブレット技術の中で最も実用的な技術であり、WEB開発者はFilter技術を通じて、Jsp、サーブレット、静的ピクチャファイル、静的htmlファイルなど、webサーバが管理するすべてのwebリソースをブロックし、いくつかの特殊な機能を実現する.例えば、URLレベルのアクセス制御、機密語彙のフィルタリング、応答情報の圧縮などの高度な機能を実現します.
主にユーザ要求の前処理に用いられるか、HttpServeretResponseの後処理に用いられる.Filterの完全なプロセス:Filterを使用してユーザー要求を前処理し、次に要求をサーブレットに渡して処理し、応答を生成し、最後にFilterはサーバ応答を後処理します.
Filter機能
1.HttpServletRequestがServletに到着する前に、お客様のHttpServletRequestをブロックします.必要に応じてHttpServertRequestをチェックし、HttpServertRequestヘッダとデータを変更することもできます.
2.HttpServeretResponseがクライアントに到着する前に、HttpServeretResponseをブロックします.必要に応じてHttpServertResponseをチェックしたり、HttpServertResponseヘッダとデータを変更したりすることができます. 
Filterによるブロッキング機能の実装方法
FilterインタフェースにはdoFilterメソッドがあり、開発者がFilterを作成し、どのウェブリソースをブロックするかを構成した後、WEBサーバはウェブリソースのserviceメソッドを呼び出すたびに、filterのdoFilterメソッドを先に呼び出すので、このメソッド内でコードを書くことは以下の目的を達成することができる.
1.ターゲットリソースを呼び出す前に、コードを実行させます.
2.ターゲットリソースを呼び出すかどうか(すなわち、Webリソースにユーザーをアクセスさせるかどうか).
WebサーバはdoFilterメソッドを呼び出すと、filterChainオブジェクトが渡されます.filterChainオブジェクトはfilterインタフェースの中で最も重要なオブジェクトです.doFilterメソッドも提供されています.開発者は必要に応じてこのメソッドを呼び出すかどうかを決定し、そのメソッドを呼び出すと、WebサーバはWebリソースのサービスメソッド、すなわちWebリソースがアクセスされます.そうでなければ、Webリソースはアクセスされません.
Filter開発の2段階
Javaクラス実装Filterインタフェースを記述し、doFilterメソッドを実装します.Web.xmlファイルで作成したfilterクラスを和要素で登録し、ブロックできるリソースを設定します.Web.xml構成の各ノードの紹介:
  • フィルタを指定します.
  • フィルタの名前を指定するために使用されます.この要素の内容は空ではありません.
  • 要素は、フィルタの完全な限定クラス名を指定するために使用されます.
  • 要素は、フィルタの初期化パラメータを指定するために使用され、そのサブ要素はパラメータの名前を指定し、パラメータの値を指定します.
  • フィルタでは、FilterConfigインタフェースオブジェクトを使用して初期化パラメータにアクセスできます.

  • 要素は、Filterがブロックするリソースを設定するために使用されます.Filterブロッキングされたリソースは、サーブレット名とリソースアクセスの要求パスの2つの方法で指定できます.
  • サブエレメントは、filterの登録名を設定するために使用されます.この値は、要素に宣言されたフィルタの名前
  • でなければなりません.
  • filterによってブロックする要求経路(フィルタ関連URLスタイル)
  • を設定する.
    フィルタによってブロックされるサーブレットの名前を指定します.
    フィルタによってブロックされるリソースがサーブレットコンテナによって呼び出される方法を指定します.REQUEST、INCLUDE、FOrWARD、ERRORのいずれか、デフォルトのREQUESTです.ユーザは、複数のサブエレメントを設定して、Filterがリソースの複数の呼び出し方法をブロックすることを指定できます.
    サブエレメントが設定できる値とその意味
  • REQUEST:ユーザーが直接ページにアクセスすると、Webコンテナがフィルタを呼び出します.ターゲットリソースがRequestDispatcherのinclude()またはforward()メソッドでアクセスされている場合、フィルタは呼び出されません.
  • INCLUDE:ターゲットリソースがRequestDispatcherのinclude()メソッドでアクセスされている場合、フィルタが呼び出されます.このほか、フィルタは呼び出されません.
  • FOrWARD:ターゲットリソースがRequestDispatcherのforward()メソッドでアクセスされている場合、フィルタは呼び出されます.それ以外の場合、フィルタは呼び出されません.
  • ERROR:ターゲットリソースが宣言例外処理メカニズムによって呼び出された場合、フィルタが呼び出されます.それ以外は、フィルタは呼び出されません.

  • Filterチェーン
    1つのウェブアプリケーションでは、複数のFilterを作成することができ、これらのFilterを組み合わせて1つのFilterチェーンと呼ぶことができる.
    Webサーバは、Web.xmlファイルにおけるFilterの登録順序に従って、どのFilterを先に呼び出すかを決定し、最初のFilterのdoFilterメソッドが呼び出されると、WebサーバはFilterチェーンを表すFilter Chainオブジェクトを作成してメソッドに渡す.doFilterメソッドでは、開発者がFilterChainオブジェクトのdoFilterメソッドを呼び出すと、WebサーバはFilterChainオブジェクトにfilterがあるかどうかをチェックし、ある場合は2番目のfilterを呼び出し、ない場合はターゲットリソースを呼び出す.
     Filterのライフサイクル
    
    public void init(FilterConfig filterConfig) throws ServletException;//   

    私たちが作成したサーブレットプログラムと同様に、Filterの作成と破棄はWEBサーバが担当します.Webアプリケーションが起動すると、WebサーバはFilterのインスタンスオブジェクトを作成し、そのinitメソッドを呼び出し、Web.xml構成を読み取り、オブジェクトの初期化機能を完了し、後続のユーザーにブロックの準備を要求します(filterオブジェクトは1回しか作成されず、initメソッドも1回しか実行されません).開発者はinitメソッドのパラメータにより,現在のfilter構成情報を表すFilterConfigオブジェクトを得ることができる.
    
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;//    
    

    この方法は実際のフィルタリング操作を完了する.お客様がフィルタに関連付けられたURLへのアクセスを要求すると、サーブレットフィルタはdoFilterメソッドを先に実行します.FilterChainパラメータは、後続のフィルタにアクセスするために使用されます.
    
    public void destroy();//  

    Filterオブジェクトが作成されるとメモリに常駐し、Webアプリケーションの削除やサーバの停止時に破棄されます.WebコンテナがFilterオブジェクトをアンインストールする前に呼び出されます.このメソッドはFilterのライフサイクルで1回のみ実行されます.この方法では、フィルタで使用されるリソースを解放することができる.
    FilterConfigインタフェース
    ユーザは、filterを構成するときに、filterに初期化パラメータを設定することができ、webコンテナがFilterオブジェクトをインスタンス化し、そのinitメソッドを呼び出すと、filter初期化パラメータをカプセル化したfilter Configオブジェクトが渡されます.そのため、開発者はfilterを作成する際に、filterConfigオブジェクトの方法によって、以下の内容を得ることができます.
    
    String getFilterName();//  filter   。 
    String getInitParameter(String name);//                    。       null. 
    Enumeration getInitParameterNames();//                     。 
    public ServletContext getServletContext();//  Servlet        。

    Filter使用例
    Filterを使用したユーザーログインセキュリティ制御の検証
    この間、1つのプロジェクトのメンテナンスに参加し、ユーザーがシステムを終了した後、アドレスバーに行って履歴にアクセスし、urlに基づいて、依然としてシステム応答ページに入ることができます.リクエストがフィルタされていないことを確認してユーザーログインを検証します.filterを追加して問題を解決します!
    Web.xmlで先に構成
    
    
     SessionFilter
     com.action.login.SessionFilter
     
      logonStrings
      /project/index.jsp;login.do
     
     
      includeStrings
      .do;.jsp
     
     
      redirectPath
      /index.jsp
     
     
      disabletestfilter
      N
     
    
    
     SessionFilter
     /*
    
    

    次にFilterServicelet.javaを記述します.
    
    package com.action.login;
    import java.io.IOException;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpServletResponseWrapper;
    /**
     *         ,        
     * http://www.manongjc.com/article/1613.html 
     */
    public class SessionFilter implements Filter {
    
     public FilterConfig config;
    
     public void destroy() {
      this.config = null;
     }
    
     public static boolean isContains(String container, String[] regx) {
      boolean result = false;
      for (int i = 0; i < regx.length; i++) {
       if (container.indexOf(regx[i]) != -1) {
        return true;
       }
      }
      return result;
     }
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
      HttpServletRequest hrequest = (HttpServletRequest)request;
      HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper((HttpServletResponse) response);
    
      String logonStrings = config.getInitParameter("logonStrings");  //       
      String includeStrings = config.getInitParameter("includeStrings"); //         
      String redirectPath = hrequest.getContextPath() + config.getInitParameter("redirectPath");//         
      String disabletestfilter = config.getInitParameter("disabletestfilter");//        
    
      if (disabletestfilter.toUpperCase().equals("Y")) { //     
       chain.doFilter(request, response);
       return;
      }
      String[] logonList = logonStrings.split(";");
      String[] includeList = includeStrings.split(";");
    
      if (!this.isContains(hrequest.getRequestURI(), includeList)) {//               
       chain.doFilter(request, response);
       return;
      }
    
      if (this.isContains(hrequest.getRequestURI(), logonList)) {//           
       chain.doFilter(request, response);
       return;
      }
    
      String user = ( String ) hrequest.getSession().getAttribute("useronly");//        
      if (user == null) {
       wrapper.sendRedirect(redirectPath);
       return;
      }else {
       chain.doFilter(request, response);
       return;
      }
     }
     public void init(FilterConfig filterConfig) throws ServletException {
      config = filterConfig;
     }
    }
    
    

    これにより、ユーザに対するすべての要求が完了し、このFilterを介してユーザログインを検証することができる.
    中国語の文字化けしフィルタ
    プロジェクトがspringフレームワークを使用する場合.現在のステージJSPページとJAVAコードで異なる文字セットを使用して符号化されている場合、フォームに提出されたデータのアップロード/ダウンロードで中国語名ファイルが文字化けしてしまうという問題が発生しますので、このフィルタを使用してください.
    
    
     encoding
     org.springframework.web.filter.CharacterEncodingFilter
     
      encoding
      UTF-8
     
     
      forceEncoding
      false
     
    
    
     encoding
     /*
    
    

    Spring+HibernateのOpenSessionInViewFilter制御セッションのスイッチ
    hibernate+springが併用されている場合、lazy=true(遅延ロード)が設定されている場合、データを読み出す際に親データを読み出すと自動的にsessionが閉じられ、これに関連するデータ、サブデータを使用する場合、lazyinitのエラーが投げ出されます.この場合springが提供するOpenSessionInViewFilterを使用する必要があります.
    OpenSessionInViewFilterは、requestがすべてのページをクライアントに送信するまでSession状態を維持し、リクエストが終了するまでsessionを閉じます.これにより、遅延ロードによる問題を解決できます.
    注意:OpenSessionInViewFilter構成はstruts 2の構成の前に書きます.tomcatコンテナはフィルタをロードするときに順番にロードされるので、プロファイルがstruts 2のフィルタ構成と書かれていれば、OpenSessionInViewFilter構成になるので、ロードの順番によって、actionはデータを取得するときにsessionがspringに管理されていません.
    
    
     OpenSessionInViewFilter
     org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
     
      sessionFactoryBeanName
      sessionFactory
     
     
      singleSession
      true
     
    
    
     OpenSessionInViewFilter
     *.do
    
     
    
    

    Struts 2のweb.xml構成
    プロジェクトでStruts 2を使用するには、要求を切り取り、Struts 2のActionに移動して処理するためにweb.xmlでフィルタを構成する必要があります.
    注意:2.1.3以前のStruts 2バージョンの場合、フィルタはorg.apache.struts 2.dispatcher.FilterDispatcherを使用します.そうでなければorg.apache.struts 2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilterを使用します.Struts 2.1.3からActionContextCleanUpフィルタは廃棄され、StrutsPrepareAndExecuteFilterには対応する機能が含まれます.
    3つの初期化パラメータ構成:
  • configパラメータ:ロードするプロファイルを指定します.カンマ分割.
  • actionPackagesパラメータ:アクションクラスが存在するパッケージ空間を指定します.カンマ分割.
  • configProvidersパラメータ:コンフィギュレーションファイルプロバイダをカスタマイズし、コンフィギュレーションProviderインタフェースクラスを実装する必要があります.カンマ分割.
  • 
    
    
     struts2
     org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
    
    
     struts2
     *.do
    
    

     読書に感謝して、みんなを助けることができることを望んで、みんなの当駅に対する支持に感謝します!