サーブレットフィルタ、リスナー


FilterフィルタFilterはフィルタとも呼ばれ、WEB開発者はFilter技術を通じて、Jsp、サーブレット、静的ピクチャファイル、静的htmlファイルなど、webサーバが管理するすべてのwebリソースをブロックし、いくつかの特殊な機能を実現します.例えば、URLレベルのアクセス制御、機密語彙のフィルタリング、応答情報の圧縮などの機能を実現する.サーブレットAPIにはFilterインタフェースが提供されており,webアプリケーションを開発する際に作成されたJavaクラスがこのインタフェースを実現した場合,このjavaクラスをフィルタFilterと呼ぶ.Filterにより以下の目的を達成できます.
               ,      。
               ,      。

主にシーンを適用/仕様に従って推奨される様々なタイプのフィルタ:
       (Authentication Filters)。
       (Data compression Filters)。
     (Encryption Filters)。
           。
       (Image Conversion Filters)。
          (Logging and Auditing Filters)。
MIME-TYPE     (MIME-TYPE Chain Filters)。
      (Tokenizing Filters)。
XSL/T    (XSL/T Filters),   XML   。

Filterフィルタ方法
方法
説明
public void doFilter (ServletRequest, ServletResponse, FilterChain)
この方法は、クライアントがチェーンの末端でリソースを要求するためにチェーンを介して伝達されるたびにコンテナによって呼び出される.
public void init(FilterConfig filterConfig)
この方法は、Webコンテナによって呼び出され、フィルタがサービスに格納されることを示す.
public void destroy()
この方法は、Webコンテナによって呼び出され、フィルタがサービスから取り出されることを示す.
FilterのライフサイクルFilterの作成と破棄は、Webサーバが担当します.
1.Filterの作成Webアプリケーションが起動すると、WebサーバはFilterのインスタンスオブジェクトを作成し、そのinitメソッドを呼び出してオブジェクトの初期化機能を完了し、後続のユーザーがブロックの準備を要求すると、filterオブジェクトは1回しか作成されず、initメソッドも1回しか実行されません.Initメソッドのパラメータにより、現在のfilter構成情報を表すFilterConfigオブジェクトを取得できます.InitメソッドでFilterConfigオブジェクトを使用してパラメータを取得します.
public void init(FilterConfig config) throws ServletException {
        //        
        String name=config.getInitParameter("name");
        System.out.println(name);
}

2.Filterの呼び出しWebサーバdoFilterメソッドを呼び出すと、filterChainオブジェクトが渡されます.filterChainオブジェクトはfilterインタフェースの中で最も重要なオブジェクトです.doFilterメソッドも提供されています.開発者は必要に応じてこのメソッドを呼び出すかどうかを決定し、このメソッドを呼び出すと、WebサーバはWebリソースのサービスメソッドを呼び出すことができます.すなわち、Webリソースがアクセスされます.そうしないと、Webリソースはアクセスされません.
Filterチェーン/filterChainは、1つのウェブアプリケーションにおいて、1つのFilterチェーンと呼ばれる複数のFilterを作成するために開発することができる.Webサーバは、Web.xmlファイルにおけるFilterの登録順序に従って、どのFilterを先に呼び出すかを決定し、最初のFilterのdoFilterメソッドが呼び出されると、WebサーバはFilterチェーンを表すFilter Chainオブジェクトを作成してメソッドに渡す.doFilterメソッドでは、開発者がFilterChainオブジェクトのdoFilterメソッドを呼び出すと、WebサーバはFilterChainオブジェクトにfilterがあるかどうかをチェックし、ある場合は2番目のfilterを呼び出し、ない場合はターゲットリソースを呼び出す.
3.Filterの破棄webコンテナはdestroyメソッドを呼び出してFilterを破棄する.destroyメソッドはFilterのライフサイクルで1回のみ実行されます.destroyメソッドでは、フィルタで使用されるリソースを解放できます.
public void destroy() {
    System.out.println("       ");
}

FilterフィルタインスタンスFilter開発は2つのステップに分かれています.*javaクラス実装Filterインタフェースを記述し、doFilterメソッドを実装します.*Web.xmlファイルで作成したfilterクラスを和要素で登録し、ブロックできるリソースを設定します.
(1)作成フィルタ
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.GregorianCalendar;

@WebFilter(filterName = "LoginFilter")
public class LoginFilter implements Filter {
     public void init(FilterConfig config) throws ServletException {
        //       
        String name=config.getInitParameter("name");
        //       top
        System.out.println(name);
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest hsr=(HttpServletRequest)req;
        //      
        String name=hsr.getParameter("name");
        //      
        if("top".equals(name)){
            //        IP   
            String ipAddress = req.getRemoteAddr();

            //    IP         
            System.out.println("IP " + ipAddress + ", Time "
                    + new SimpleDateFormat("HH:mm:SS").format(new GregorianCalendar().getTime()));
            //         
            chain.doFilter(req, resp);
            return;
        }
        /*      */
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter pw=resp.getWriter();
        pw.println("
"
+ "
"
+ " <br>"</span> + <span class="hljs-string">"<br>"</span> + <span class="hljs-string">"<br>"</span> + <span class="hljs-string">" <h1>"</h1></span>+<span class="hljs-string">" "</span>+<span class="hljs-string">""</span> + <span class="hljs-string">"<br>"</span> + <span class="hljs-string">""</span>); } <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">destroy</span>() { System.out.println(<span class="hljs-string">" "</span>); } }</code></pre> <p> ServletDemo:</p> <pre><code><span class="hljs-keyword">import</span> javax.servlet.ServletConfig; <span class="hljs-keyword">import</span> javax.servlet.ServletException; <span class="hljs-keyword">import</span> javax.servlet.http.HttpServletRequest; <span class="hljs-keyword">import</span> javax.servlet.http.HttpServletResponse; <span class="hljs-keyword">import</span> java.io.IOException; <span class="hljs-keyword">import</span> java.io.PrintWriter; <span class="hljs-keyword">import</span> java.util.Calendar; <span class="hljs-keyword">import</span> java.util.GregorianCalendar; <span class="hljs-javadoc">/** * Created by Top on 2017/12/5. */</span> <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ServletDemo</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">javax</span>.<span class="hljs-title">servlet</span>.<span class="hljs-title">http</span>.<span class="hljs-title">HttpServlet</span> {</span> <span class="hljs-keyword">public</span> <span class="hljs-title">ServletDemo</span>() { System.out.println(<span class="hljs-string">" servlet"</span>); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">service</span>(HttpServletRequest req, HttpServletResponse resp) <span class="hljs-keyword">throws</span> ServletException, IOException { System.out.println(<span class="hljs-string">" servlet"</span>); <span class="hljs-comment">// 5 </span> resp.setIntHeader(<span class="hljs-string">"Refresh"</span>, <span class="hljs-number">5</span>); <span class="hljs-comment">// </span> resp.setContentType(<span class="hljs-string">"text/html"</span>); <span class="hljs-comment">// </span> Calendar calendar = <span class="hljs-keyword">new</span> GregorianCalendar(); String am_pm; <span class="hljs-keyword">int</span> hour = calendar.get(Calendar.HOUR); <span class="hljs-keyword">int</span> minute = calendar.get(Calendar.MINUTE); <span class="hljs-keyword">int</span> second = calendar.get(Calendar.SECOND); <span class="hljs-keyword">if</span>(calendar.get(Calendar.AM_PM) == <span class="hljs-number">0</span>) am_pm = <span class="hljs-string">"AM"</span>; <span class="hljs-keyword">else</span> am_pm = <span class="hljs-string">"PM"</span>; String CT = hour+<span class="hljs-string">":"</span>+ minute +<span class="hljs-string">":"</span>+ second +<span class="hljs-string">" "</span>+ am_pm; System.out.println(CT); resp.setCharacterEncoding(<span class="hljs-string">"UTF-8"</span>); PrintWriter pw=resp.getWriter(); pw.println(<span class="hljs-string">"<br>"</span> + <span class="hljs-string">" <br>"</span> + <span class="hljs-string">" <title>"+" servlet"+"
"
+ "
"
+ "
"
+ "


"

+ " :"+CT+ "
"
+ "
"
+ ""); } @Override public void init() throws ServletException { System.out.println(" servlet"); String a=this.getInitParameter("a"); String b=this.getInitParameter("b"); System.out.println(a); System.out.println(b); } @Override public void init(ServletConfig config) throws ServletException { System.out.println(" servlet"); super.init(config); } @Override public void destroy() { System.out.println(" servlet"); } }

(2)Web.xmlのFilterフィルタマッピング(Filter Mapping)定義フィルタは、サービスレットを定義し、URLモードにマッピングするのとほぼ同じURLまたはサービスレットにマッピングされます.配置記述ファイルweb.xmlでfilterラベルを作成するには、次の手順に従います.
<filter>
    <filter-name>loginfilter-name>
    <filter-class>filter.LoginFilterfilter-class>
    <init-param>
        <param-name>nameparam-name>
        <param-value>topparam-value>
    init-param>
filter>
<filter-mapping>
        <filter-name>loginfilter-name>
        
        <url-pattern>*.dourl-pattern>
filter-mapping>

複数のフィルタおよびフィルタの適用順序の使用
Webアプリケーションは、特定の目的に応じていくつかの異なるフィルタを定義できます.2つのフィルタAuthenFilterとLoginFilterを定義したとします.配置ファイルに異なるマッピングを宣言するだけで、残りの処理は上記の説明とほぼ同じです.
Web.xmlのfilter-mapping要素の順序は、Webコンテナがサーブレットにフィルタを適用する順序を決定します.フィルタの順序を反転するには、web.xmlファイルでfilter-mapping要素を反転するだけです.
Web.xml構成各ノードの説明
            ,          。
      。
     ,    FilterConfig            。
         Filter         。  Filter               :Servlet             
       filter     。                   
   filter         (      URL  )
         Servlet  。
             Servlet        ,   REQUEST,INCLUDE,FORWARD ERROR  ,  REQUEST。                Filter               。
             

REQUEST:          ,Web         。         RequestDispatcher include() forward()     ,            。
INCLUDE:         RequestDispatcher include()     ,          。    ,         。
FORWARD:         RequestDispatcher forward()     ,          ,    ,         。

Filter Lister(推奨:https://www.cnblogs.com/tabchanj/p/5516340.html)