JavaWeb 10 Filter

10918 ワード

1、概念
Filter、フィルター.主に要求のフィルタリングに使用され、サーバ側の3つのコンポーネントの1つです.
サーバ側の3つのコンポーネント:サーブレット、Filter、Listener
3つのコンポーネントの特徴:(1)サーバ側(2)で実行する必要があるインタフェース(3)を実現するにはwebが必要である.xmlに登録
2、Filterを作成するには
⑴クラスを作成し、Filterインタフェースを実現させ、抽象的な方法を実現する(2)web.xmlに登録する
サーバはwebに基づいています.xmlで構成されているFilterの全クラス名を使用して、インスタンスを作成し、リクエストをフィルタします.
例:【Filterインタフェースを実装するクラスを作成する】
public class MyFilter implements Filter {}

【web.xmlに登録する】
<filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>com.test.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <!--         -->
    <url-pattern>/hellofilter.jsp</url-pattern>
</filter-mapping>

3、Filterの役割
(1)リクエストがターゲットリソースに到達する前に、リクエストをブロックする(2)ローリクエストをブロックする(3)ブラウザに到達する前に、他の操作を行う
4、Filterの宣言周期
Filterは作成から破棄まで、4つの方法に反映されています.
⑴構築方法
①サーバが起動すると、メソッドが呼び出され、Filterオブジェクトが作成されます.説明Filterオブジェクトは、サーバ起動時に作成される②このメソッドは、Filterのライフサイクル全体で1回しか呼び出されません.Filterが一例であることを示す
(2)initメソッド
public void init(FilterConfig filterConfig);
①このメソッドは、Filterの構築メソッドが呼び出された直後に呼び出される.これは主にFilterオブジェクトを初期化するための操作である2この方法はFilterのライフサイクル全体で1回しか呼び出されない
パラメータFilterConfigオブジェクトの役割
サーブレットのinitメソッドのサーブレットコンフィグオブジェクトと似ています
⑴Filterをwebで取得する.xmlに登録されている名前public String getFilterName()
(2)サーブレットContextオブジェクトpublicサーブレットContext getサーブレットContext()を取得する.
(3)初期化パラメータpublic String getInitParameter(String name)を取得する.param-nameに基づいてwebに取得する.xmlのfilterラベルのinit-paramのparam-valueの値
 <filter>
       <init-param>
           <param-name>key</param-name>
           <param-value>value</param-value>
       </init-param>
 </filter>

例:
@Override
public void init(FilterConfig filterConfig) throws ServletException {
    //   FilterName
    String filterName = filterConfig.getFilterName();
    System.out.println(filterName);

    //   ServletContext  
    ServletContext servletContext = filterConfig.getServletContext();
    System.out.println(servletContext);

    //        
    String value = filterConfig.getInitParameter("key");
    System.out.println(value);
}

(3)doFilterメソッドpublic void doFilter(サーブレットRequest request,サーブレットResponse response,FilterChain chain);
①この方法は、Filterにアクセスするたびにwebにある.xmlに登録されている、マッピングされたリクエストパス【url-pattern】の場合に呼び出されます.要求をブロックするために使用されます②このメソッドは、Filterのライフサイクル全体で複数回呼び出されます③1.サーブレットRequestとサーブレットResponseオブジェクトは、サーブレットのサービスメソッドのサーブレットRequestとサーブレットResponseオブジェクトと同様に、要求を解放するために使用されます.doFilterを呼び出す必要がありますメソッドpublic void doFilter(サーブレットRequest request,サーブレットResponse response);リクエストとresponseオブジェクトを転送
(4)destroy方法public void destroy()
①このメソッドは、サーバがシャットダウンする前に呼び出され、Filterオブジェクトを破棄するために使用されます②このメソッドは、Filterのライフサイクル全体で1回しか呼び出されません
5、複数のフィルタの実行順序
同じリソースに複数のフィルタを設定でき、複数のフィルタが1つのフィルタチェーンを構成します.複数のフィルタの実行順序は、web.xmlの
  <filter-mapping>

ラベル決定
Tips:(1)前に宣言し、先に実行する.宣言後、後実行(2)複数のフィルタが要求を解放した場合、FilterChainオブジェクトのdoFilterメソッドは、上のコードが宣言の前後順に実行される.次のコードの実行順序は、宣言の順序とは逆です.
注意:tomcat 6.0で、filter-mappingラベルは対応するfilterラベルの下にある必要があります.そうしないと、エラーが発生します.tomcat 7では0でfilter-mappingはfilterの上に
例:【OrderFilter 1】
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
    System.out.println(" 1   ");
    chain.doFilter(request, response);
    System.out.println(" 5   ");
}

【OrderFilter2】
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
    System.out.println(" 2   ");
    chain.doFilter(request, response);
    System.out.println(" 4   ");
}

【index.jsp】
<body>
    <% System.out.println(" 3   "); %>
</body>

【web.xmlプロファイル】
<filter>
    <filter-name>OrderFilter1</filter-name>
    <filter-class>com.test.filter.OrderFilter1</filter-class>
</filter>
<filter-mapping>
    <!--      -->
    <filter-name>OrderFilter1</filter-name>
    <url-pattern>/index.jsp</url-pattern>
</filter-mapping>

<filter>
    <filter-name>OrderFilter2</filter-name>
    <filter-class>com.test.filter.OrderFilter2</filter-class>
</filter>
<filter-mapping>
    <!--      -->
    <filter-name>OrderFilter2</filter-name>
    <url-pattern>/index.jsp</url-pattern>
</filter-mapping>

6、url-patternの配置規則
正確な一致
完全なパスを設定
<url-pattern>/index.jsp</url-pattern>

アクセスはindexのみです.jspの場合、フィルタはリクエストをブロックします.
Tips:/現在のプロジェクトを表すルートパス注意:必ずパスの前に/を付けてください.そうしないとtomcatは正常に起動できません.
ファジイ整合
接頭辞照合
指定したパスの先頭にあるリソースをブロック
  <url-pattern>/pages/*</url-pattern>

フィルタはpagesパスの下のリソースにアクセスする場合にのみ要求をブロックします.
接尾辞の一致
指定した文字の末尾にあるリソースをブロック
   <url-pattern>*.jsp</url-pattern>

jspページにアクセスしている場合、フィルタはリクエストをブロックします.
注意事項
接頭辞照合と接尾辞照合を同時に追加することはできません.たとえば、
  <url-pattern>/pages/*.jsp</url-pattern>

このような構成は無効であり、tomcatが正常に起動することができず、エラーが報告される:IllegalArgumentException:Invalid/pages/*である.jsp in filter mapping
サーブレットをブロック
filter-mappingにurl-patternラベルを付ける
例:
 <filter-mapping>
     <url-pattern>/loginServlet</url-pattern>
 </filter-mapping>

  : url-pattern       Servlet web.xml    url-pattern  

filter-mappingにservlet-nameラベルを付ける
例:
  <filter-mapping>
      <servlet-name>LoginServlet</servlet-name>
  </filter-mapping>

注意:servlet-nameは、ブロックするサーブレットとwebにある必要があります.xmlに登録されているservlet-nameは一致しています
7、dispatcherの構成
コンセプト
Filterのデフォルトでは、直接要求、すなわちページに直接アクセスする要求のみがブロックされます.ただし、リクエストの転送はブロックできません.このようなリクエストをブロックするには、filter-mappingのサブラベルdispatcherで構成する必要があります.
<filter-mapping>
    <dispatcher></dispatcher>
</filter-mapping>

REQUEST
既定値.ダイレクトリクエストのみブロックできます【ダイレクトアクセスページのリクエスト】
注意:他のブロックしたいリクエストを構成し、直接アクセスするリクエストをブロックしたい場合は、リクエストを同時に構成する必要があります.
例:【page.jspページへの直接要求をブロックする】
<filter>
    <filter-name>TestFilter</filter-name>
    <filter-class>com.test.filter.TestFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>TestFilter</filter-name>
    <url-pattern>/page.jsp</url-pattern>

    <dispatcher>REQUEST</dispatcher>
</filter-mapping>

FORWARD
転送をブロックする要求にはgetRequestDispatcher()が含まれる.forward(); メソッドまたはアクションラベル転送のリクエスト
例:【page.jspへの転送要求と直接要求のブロック】【index.jsp】
<jsp:forward page="/page.jsp"></jsp:forward>

【web.xml】
<filter>
    <filter-name>TestFilter</filter-name>
    <filter-class>com.test.filter.TestFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>TestFilter</filter-name>
    <url-pattern>/page.jsp</url-pattern>

    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

INCLUDE
ダイナミックインクルードのブロック
すなわち,アクションラベルによって動的に含まれるページはブロックされる.orgが呼び出されたからですapache.jasper.runtime.JspRuntimeLibrary.include(request,response,「/動的に含まれるページ」,out,false);メソッドは<%@include%>コマンドラベルで、静的に含まれるページはブロックできません.ページの内容を直接コピーしているからです
例:【ブロック対page.jspの動的包含】【index.jsp】
<jsp:include page="/page.jsp"></jsp:include>

【web.xml】
<filter>
    <filter-name>TestFilter</filter-name>
    <filter-class>com.test.filter.TestFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>TestFilter</filter-name>
    <url-pattern>/page.jsp</url-pattern>

    <dispatcher>INCLUDE</dispatcher>
</filter-mapping>

ERROR
Webにブロックするxmlで構成されたエラーページ
注意:url-patternラベルのパスとerror-pageラベルのサブラベルlocationのパスは一致します.
Webでxmlでの構成エラーページ
 <error-page>
     <error-code></error-code>
     <location></location>
 </error-page>

Error-code:エラーステータスコードlocation:エラーページのアドレス注意:このアドレスは/先頭【サーバによる解析】が必要です
使用例
<filter>
    <filter-name>TestFilter</filter-name>
    <filter-class>com.test.filter.TestFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>TestFilter</filter-name>
    <!--             -->
    <url-pattern>/404.jsp</url-pattern>

    <dispatcher>ERROR</dispatcher>
</filter-mapping>

<error-page>
    <error-code>404</error-code>
    <!--         -->
    <location>/404.jsp</location>
</error-page>

8、HttpFilter
システムはdoFilterメソッドのrequestとresponseのオブジェクトがHttpServeretRequestとHttpServeretResponseであることを提供していないので、サブFilterが継承し、コード量を減らすために自分で書くことができます.
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;

public abstract class HttpFilter implements Filter {
    // FilterConfig  
    private FilterConfig filterConfig;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
        init();
    }

    //       init  
    public void init() {
    }

    //        FilterConfig get  
    public FilterConfig getFilterConfig() {
        return filterConfig;
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        //     
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;

        //          
        doFilter(req, resp, chain);
    }

    //           
    public abstract void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws IOException, ServletException;

    @Override
    public void destroy() {
    }

}