サーブレットフィルタ、リスナー
FilterフィルタFilterはフィルタとも呼ばれ、WEB開発者はFilter技術を通じて、Jsp、サーブレット、静的ピクチャファイル、静的htmlファイルなど、webサーバが管理するすべてのwebリソースをブロックし、いくつかの特殊な機能を実現します.例えば、URLレベルのアクセス制御、機密語彙のフィルタリング、応答情報の圧縮などの機能を実現する.サーブレットAPIにはFilterインタフェースが提供されており,webアプリケーションを開発する際に作成されたJavaクラスがこのインタフェースを実現した場合,このjavaクラスをフィルタFilterと呼ぶ.Filterにより以下の目的を達成できます.
主にシーンを適用/仕様に従って推奨される様々なタイプのフィルタ:
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オブジェクトを使用してパラメータを取得します.
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メソッドでは、フィルタで使用されるリソースを解放できます.
FilterフィルタインスタンスFilter開発は2つのステップに分かれています.*javaクラス実装Filterインタフェースを記述し、doFilterメソッドを実装します.*Web.xmlファイルで作成したfilterクラスを和要素で登録し、ブロックできるリソースを設定します.
(1)作成フィルタ
(2)Web.xmlのFilterフィルタマッピング(Filter Mapping)定義フィルタは、サービスレットを定義し、URLモードにマッピングするのとほぼ同じURLまたはサービスレットにマッピングされます.配置記述ファイルweb.xmlでfilterラベルを作成するには、次の手順に従います.
複数のフィルタおよびフィルタの適用順序の使用
Webアプリケーションは、特定の目的に応じていくつかの異なるフィルタを定義できます.2つのフィルタAuthenFilterとLoginFilterを定義したとします.配置ファイルに異なるマッピングを宣言するだけで、残りの処理は上記の説明とほぼ同じです.
Web.xmlのfilter-mapping要素の順序は、Webコンテナがサーブレットにフィルタを適用する順序を決定します.フィルタの順序を反転するには、web.xmlファイルでfilter-mapping要素を反転するだけです.
Web.xml構成各ノードの説明
Filter Lister(推奨:https://www.cnblogs.com/tabchanj/p/5516340.html)
, 。
, 。
主にシーンを適用/仕様に従って推奨される様々なタイプのフィルタ:
(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)