Java EE8を使用したインターセプトフィルターパターンの実装
Java EE 8のベストプラクティスでこのパターンを実装するには、サーブレットフィルタ
を使用してjavaee8のベストプラクティスでこのパターンを実装します
。Javaサーブレット仕様のサーブレットフィルタを使用します。サーブレットフィルタを使用して、次のように作成できます。注文されたリクエスト
は、Javaservlet仕様からのものです。サーブレットフィルタを使用して
、リクエストとレスポンスを処理するための整然としたリクエストインターセプターを作成できます。これらのインターセプターは、リクエストとレスポンス
を処理するためにURLインターセプターによってマップされます。これらのインターセプターは、URL
パターンまたはサーブレット名によってマップされます。サーブレットフィルターは、XML(web.xml上)または
パターンまたはサーブレット名で構成できます。サーブレットフィルタは、XML(onweb.xmlファイル)または
アノテーションとして構成できます。この場合、
アノテーションを付けたすべてのリクエストのログを作成するとします。この例では、すべてのリクエストを記録するログを作成すると想定しています。
はサーバーに送信されます。また、アクセス時間をログに記録するフィルターとサーバーに送信されるフィルターの2つのフィルター
があります。また、2つのフィルターがあり、1つ
はアクセス時間をログに記録し、もう1つはクライアントが使用しているブラウザーに関する情報をログに記録します。アクセス時間をログに記録するには、クライアントが使用しているブラウザーに関する情報をログに記録します
。アクセス時間を記録するために、
LogAccessFilterというフィルターを作成し、ブラウザー情報をログに記録
する
ために、LogAccessFilterというフィルターを作成します。LogBrowserFilterというフィルターを作成します。LogBrowserFilterというフィルターを
作成して、ブラウザー情報をフィルターします。
LogAccessFilterの実装
Here, we have the implementation of LogAccessFilter:
package com.gary.book.chapter01;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Date;
@WebFilter(filterName = "LogAccess", urlPatterns = "/*")
public class LogAccessFilter implements javax.servlet.Filter {
private static Logger logger =
LogManager.getLogger(LogAccess.class);
public void destroy() {
}
public void doFilter(javax.servlet.ServletRequest req,
javax.servlet.ServletResponse resp, javax.servlet.FilterChain
chain) throws javax.servlet.ServletException, IOException {
//Gets the initial date of request.
Date dateInitRequest = new Date();
//Get IP of Client that sent a resquest.
String ip = ((HttpServletRequest) req).getRemoteAddr();
//Following to next filter. If none next filter exist, follows
//for main logic.
chain.doFilter(req, resp);
//Gets the end date of request.
Date dateEndRequest = new Date();
//Logging the informations of IP and access time.
logger.info("IP: " + ip + " Access time : "
+ Long.toString(dateEndRequest.getTime()
- dateInitRequest.getTime())
+ " ms");
}
public void init(javax.servlet.FilterConfig config) throws
javax.servlet.ServletException {
}
}
コードに示されているように、1つのサーブレットフィルターを作成するには、クラスを作成する必要があります。
コードに示されているように、サーブレットフィルターを作成するに
は、javax.servlet.Filterを拡張してputsするクラスを作成する必要があります。 FILTERNAMEと@WebFilter注釈
継承は、javax.servlet.FilterとFILTERNAMEとプット@WebFilter注釈を
フィルタするフィルタ名とURLを定義し、urlPatternsパラメータは、前に
URLフィルタリングされ、フィルタ名と要件定義とurlPatternsパラメータ、
クラスの定義以下は、その
クラス定義を行う方法を示すコードのスニペットです。以下は、これを行う方法を示すコードです。
@WebFilter(filterName = "LogAccess", urlPatterns = "/*")
public class LogAccessFilter implements javax.servlet.Filter{
...
}
サーブレットフィルターは、責任の連鎖パターンを使用して
サーブレットフィルター
(サーブレットフィルターであるオブジェクト)全体をウォークスルーすることに注意してください。以下は、
フィルターのチェーン(サーブレットフィルターオブジェクト)を使用するコードのスニペットです。
責任パターンの使用法は次のとおりです。
責任モード:
chain.doFilter(req, resp);
前のコード行では、フィルター名をLogAccess throughとして設定しました。前のコード行では、filterNameパラメーターを使用し
てフィルター名をLogAccessとして設定しました
。これにより、filterNameパラメーターが原因ですべてのリクエストがフィルター処理され
ます。
urlPatternsパラメータには「/ 」値
があるため、これによりすべてのリクエストがフィルタリングされます。サーブレット名に従ってフィルタリングする場合、weurlPatternsパラメータには「/」値があります。サーブレット名に基づいてフィルタリングする場合は
、次のアノテーションを使用する必要があります
。
//Servlet1 and Servlet2 are the servlets to filter.
@WebFilter(filterName = "LogAccess", servletNames =
{
"servlet1","servlet2"})
事前事後処理と処理とののdoFilterれるメソッドの責任
doFilterメソッドは、事前および事後処理とを担当している
場合に、要求追従するように確立。次のフィルタまたはサーブレット(メインロジック)を追従する
際に決定しますフィルタまたはサーブレット(メインロジック)へのリクエストの追跡。
次のフィルタまたはサーブレットへの要求に続いて、次のコードを実行する必要があります。次のフィルタまたはサーブレット
を要求する場合、次のコードを実行する必要があります。
//Following to next filter or servlet.
chain.doFilter(req, resp);
前のコードが実行されると、現在のフィルターは
前のコードが実行されたときに次の行のみを実行し、現在のフィルターは次の行のみを実行
します。
他のフィルターとサーブレットは処理を終了します。他のフィルターとサーブレットは処理を終了します。
LogBrowserFilterの実装
The implementation of LogBrowserFilter is as follows:
package com.gary.book.chapter01;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@WebFilter(filterName = "LogBrowser", urlPatterns = "/*")
public class LogBrowserFilter implements Filter {
private static Logger logger = LogManager.getLogger(LogBrowser.class);
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws ServletException, IOException {
//Get userAgent that contain browse informations.
String userAgent = ((HttpServletRequest) req).getHeader("UserAgent");
//Get IP of Client that sent a resquest.
String ip = ((HttpServletRequest) req).getRemoteAddr();
//Logging the informations of IP and Browser.
logger.info("IP: " + ip + " Browser info: " + userAgent);
//Following to the next filter. If none next filter exist, follow to main logic.
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
}
}
上記のフィルターでは、クライアントのIPとブラウザーの情報を取得してログに記録します。上記のフィルターでは、クライアントのIPとブラウザーの情報を取得してログに記録します
。この
LogBrowserFilter操作は、LogAccessFilterの操作と似ています。LogBrowserFilterの操作は、LogAccessFilterの操作と似てい
ます。
フィルタの実行順序を定義するには、web.xmlを構成し、フィルタの実行順序を定義するフィルタ
を追加する必要があります。web.xmlファイルとフィルタ
マッピング情報を構成する必要があります。ここで、を確認できます。 web。xmlとその構成:
マッピング情報。ここで、web.xmlファイルの構成を確認できます。
<web-app version="3.1"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<filter>
<filter-name>LogBrowser</filter-name>
<filter-class>com.rhuan.filter.LogBrowserFilter</filter-class>
</filter>
<filter>
<filter-name>LogAccess</filter-name>
<filter-class>com.rhuan.filter.LogAccessFilter</filter-class>
</filter>
</web-app>
web.xmlで定義された構成が注釈構成をオーバーライドするため、web.xmlファイルで定義された構成が注釈構成をオーバーライドする場合
。我々があればそのため、
web.xmlの上URLPATTERN設定を入れ、その後みなさ構成は
URLPATTERN設定のweb.xmlファイルを有効にして、コンフィギュレーションが考える
のweb.xmlの設定である。我々は、web.xmlにフィルタマッピング情報を入れていない
ですweb。xmlファイルの構成。
これはすでにコードの注釈構成にあるため、フィルターマッピング情報をweb.xmlファイルに入れません。これはコードの注釈構成にすでにある
ためです。
web.xml構成は順序を
定義します-LogBrowserFilterが最初に呼び出され、構成定義ファイルweb.xml LogBrowserFilterが最初の呼び出しシーケンス、
続いてLogAccessFilter、次にメインロジック(サーブレット)
が呼び出されます。次はLogAccessFilter、次にメインロジック(サーブレット)。
フィルタマッピングの決定
フィルター定義のマッピング
マッピング方法を定義することは、インターセプトフィルターパターンを実装するために重要です。
定義されたマッピング方法は、フィルターモードをインターセプトするための鍵です。
これは、マッピングの不適切な方法がプロジェクトに直接影響を与えて原因となる可能性があるためです。これは、マッピングの不適切な方法
がプロジェクトに直接影響を与えて
やり直しを引き起こす可能性があるためです。UrlPatternとサーブレット名の2つのフィルタマッピングタイプがあります
。UrlPatternとサーブレット名の2つのフィルターマッピングタイプがあります。
非特定のリソースまたはファイルへのHTTPリクエストをフィルタリングするが、さまざまな未知のリソースもフィルタリングする場合は、UrlPatternsの使用が示されます。非特定のリソースまたはファイルへのHTTPリクエストをフィルタリングする場合、
UrlPatternsは次のとおりです。指示がありますが、さまざまな未知のリソースもフィルタリングしたいと思います。
これのいくつかの例を挙げてください:これの
いくつかの例は次のとおりです:
.jsp:。これは、JSPページとISがJSPの1つのページに追加された場合のすべてのリクエストをフィルタリングします
.jsp:jspページへのすべてのリクエストをフィルタリングします。JSPページが
サーバーに追加された場合、フィルターは
サーバーを作成せずに新しいJSPページをフィルター処理し、新しいフィルターは
変更なしでJSPページをフィルター処理します
。
/:これは、1つのリソースサーバーですべてのファイルリソースまたはもしONにすべての要求をフィルタリングしますか。
/:これは、リソースまたはサーバー上のすべてのファイルに対するすべての要求をフィルタリングします。リソースまたは
ファイルがサーバーに追加された場合、フィルターはこの新しいリソースまたは
ファイルがサーバーに追加されたことをフィルター処理し、フィルターは
変更を実行せずにこの新しいリソースまたはファイルをフィルター処理します
。
/ユーザー/:これはAを持つすべてのリソースファイルまたはサーバーですべてのリクエストをオンにフィルタリング
します/ユーザー/:これは
/ユーザーで始まるサーバーURIでスクリーニングされますURI1つのリソース場合
/ userで始まるURI。リソースまたはファイルが
/ userで始まるURIによってアクセスされる場合、サーブレットに/ userで始まるフィルターが
追加され、この新しい
リソースまたはファイルがフィルターによってフィルタリングされ、変更を実行せずにこの新しいリソースまたはファイルがフィルターされます。 。
変更されたリソースまたはファイルを実行しないでください。
フィルタのマッピングに使用されるサーブレット名は、特定のサーブレットをフィルタリングするタイミングを示し、フィルタが特定のサーブレットを示す場合
のサーブレット名マッピングフィルタは、
ITS urlPatternに依存しません。android.permissionを変更するためのこのマッピング方法1つの
独立したurlPattern 。このマッピング方法を使用する
と、フィルターを変更せずに、マップされたサーブレットのurlPatternを変更できます。フィルターを変更せずに、マップされたサーブレットのurlPatternを変更できます
。
次にいくつかの例を示します。
次にいくつかの例を示します。
{} servlet1:このマップ唯一のIfサーブレットサーブレット1は名前付きASです。
{servlet1}:これはservlet1という名前のサーブレットのみをマップします。場合
にservlet1のurlPatternsが変更され、その後、フィルタをする必要はありません
にservlet1のurlPatternsが変更され、その後、フィルタをする必要はありません
修正します
。
servlet1 {、}サーブレット2:これはservlet1と
{servlet1、servlet2}という名前の2つのサーブレットをマップします:このマップとservlet1サーブレット2という名前の2つのマップ
その動作は前の例と同様ですが、
サービス2のみです。その動作は、
1つのサーブレットのみがマップされた前の例と同様です
。1つのサーブレットがマップされました。