JAvaブロッキング、フィルタ
8888 ワード
フィルタとブロッキング:両者には大きな類似性があります.しかし、Struts 2のブロッキングはサーブレットのフィルタほど機能的ではないようです.理由は以下の2点である:1 interceptorはaction(servletに相当)のみをブロックし、jspページに対して無効である2 interceptorはフォームを提出した後にしか機能せず、アドレスバーに直接入力したurlに対しては無力である.これにより、完全な認証ができなくなります.一、Struts 2ブロックの理解Struts 2ブロッキングは、あるアクションまたはアクションにアクセスする方法である、フィールドの前後にブロッキングを実施し、Struts 2ブロッキングは挿抜可能であり、ブロッキングはAOPの実現である. インターセプタスタック(Interceptor Stack).Struts 2ブロッキングスタックは、ブロッキングを一定の順序でチェーンに結合することである.ブロックされたメソッドまたはフィールドにアクセスすると、Struts 2ブロックチェーン内のブロックは、以前に定義された順序で呼び出されます.二、Struts 2ブロッキングを実現する原理Struts 2ブロッキングの実現原理は比較的簡単であり、struts 2のactionを要求すると、Struts 2はプロファイルを検索し、その構成に基づいて相対的なブロッキングオブジェクトをインスタンス化し、リストに列挙し、最後に列表のブロッキング3を呼び出し、Struts 2ブロッキングを定義する.Struts 2は、ユーザカスタムブロッカーがcom.opensymphony.xwork 2.interceptor.Interceptorインタフェースを実装する必要があることを規定している.このインタフェースは3つのメソッドを宣言している ここで、initメソッドとdestroyメソッドは、ブロックが使用されているかどうかにかかわらず、struts.xmlにStruts 2ブロックが宣言されている限り、プログラムの開始と終了時に1回ずつ実行されます.interceptメソッドはブロックの主体であり,ブロックが有効になるたびにその論理を実行する.しかし、strutsでは、このステップを簡略化するためにいくつかの抽象クラスが提供されています.
いずれもテンプレートメソッドで実現されています.AbstractInterceptorはinit()とdestroy()の空の実装を提供し、intercept()メソッドを上書きするだけで使用できます.一方、MethodFilterInterceptorは、includeMethodsとexcludeMethodsの2つのプロパティを提供し、このブロッキングを実行するactionをブロックする方法を提供します.ブロックする必要がある方法はparamによって追加または排除することができる.一般的に、ブロッキングの書き方はあまり悪くありません.次の例を示します.
四、Struts 2ブロッカーStruts 2ブロッカーを構成するにはstruts.xmlで次のように宣言する必要がありますstruts.xmlプロファイル
=フィルタ=====================================================================================================================================次にservletまたはstrutsのactionに転送してビジネスロジックを行います.例えば、不正url(login.doのアドレス要求ではありません.ユーザーがログインしていない場合はフィルタリングします)をフィルタリングしたり、servletまたはstrutsのactionに転送する前に文字セットを統一的に設定したり、不正な文字ブロックを削除したりします.フェース向けにプログラミングするのは、あなたのserviceまたは方法です.前にメソッドを呼び出したり、メソッドの後にメソッドを呼び出したりします.例えば、動的エージェントはブロックの簡単な実装です.メソッドを呼び出す前に文字列を印刷したり(または他のビジネスロジックの操作をしたり)、メソッドを呼び出した後に文字列を印刷したり、異常を投げ出したりするときにビジネスロジックの操作をしたりすることができます.ブロッカーとフィルタの違い:
ブロッキングはjavaの反射機構に基づいており,フィルタは関数コールバックに基づいている.ブロッカーはservletコンテナに依存せず、フィルタはservletコンテナに依存します.ブロッキングはactionリクエストにのみ機能し、フィルタはほとんどのリクエストに機能します.ブロッキングはactionコンテキスト、値スタック内のオブジェクトにアクセスできますが、フィルタはアクセスできません.Actionのライフサイクルでは、ブロッキングは複数回呼び出されますが、フィルタはコンテナの初期化時に1回しか呼び出されません.
実行順序:フィルタ前-ブロック前-Action処理-ブロック後-フィルタ後.個人的にはフィルタリングは横方向のプロセスであり、まずクライアントが提出した内容をフィルタリングする(例えば、ログインしていないユーザーが内部ページにアクセスできない処理).フィルタリングが通過すると、ブロッカーはユーザーが提出したデータの検証を検査し、前期のデータ処理を行い、処理後のデータを対応するActionに送る.Action処理が完了して戻った後、ブロッキングは他のプロセス(まだ何をするか考えていない)を行い、フィルタの後続操作に戻ることができます.1つのFilterは、複数の要求または応答をブロックする責任を負うことができる.1つの要求または応答は、複数のFilterによってブロックされることもできる.Filterを作成するには、(1)Filter処理クラスの作成:(2)Web.xmlファイルでFilterを構成する2つのステップしか必要ありません.Filterを作成するにはjavax.servlet.Filterインタフェースを実装する必要があります.このインタフェースには3つの方法が定義されています.•void init(FilterConfig config):Filterの初期化を完了します.•void destroy():Filterが破棄される前に、一部のリソースの回収を完了します.•void doFilter(サーブレットRequest request,サーブレットResponse response,FilterChain chain):各リクエストおよびレスポンスの追加処理を行うフィルタ機能を実現します.フィルタFilterには、配置ファイルのfilter要素によって駆動されるinit()->doFilter()->destroy()というライフサイクルもあります.servlet 2.4では、フィルタは同様にディスペンサを要求するために使用できますが、INCLUDEまたはFOrWARDまたはREQUESTまたはERROR 要素がfilter-mappingにあることをweb.xmlで宣言する必要があります.Filterでよく使われるシーン:例1、ログの記録、リクエストが到着したときに、このフィルタでログの記録を行う.処理が完了すると、後続のFilterまたは処理に進む.手順1:Filterクラスの作成
上記のリクエストFilterでは、リクエストのURLのみをログに記録し、すべてのリクエストに対してchain.doFilter(request,reponse)メソッドを実行し、Filterがリクエストをフィルタリングした後もリクエストを宛先アドレスに送信する.手順2:Web.xmlでFilterを構成する
フィルタの一般的な適用:1、ユーザー要求を統一的に検証する2、request.setCharacterEncoding(符号化フォーマット)とfilterのfilterconfig.getInitParameter(符号化フォーマット名)を組み合わせてfilterのparamに構成された符号化方式を取得して要求を符号化変換する.3、ユーザから送信されたデータをフィルタ置換する4、画像フォーマットを変換する5、対応するコンテンツを圧縮する
void init(); void destroy(); String intercept(ActionInvocation invocation) throws Exception;
public abstract class AbstractInterceptor implements Interceptor;
public abstract class MethodFilterInterceptor extends AbstractInterceptor;
いずれもテンプレートメソッドで実現されています.AbstractInterceptorはinit()とdestroy()の空の実装を提供し、intercept()メソッドを上書きするだけで使用できます.一方、MethodFilterInterceptorは、includeMethodsとexcludeMethodsの2つのプロパティを提供し、このブロッキングを実行するactionをブロックする方法を提供します.ブロックする必要がある方法はparamによって追加または排除することができる.一般的に、ブロッキングの書き方はあまり悪くありません.次の例を示します.
package interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class MyInterceptor implements Interceptor {
public void destroy() {
// TODO Auto-generated method stub
}
public void init() {
// TODO Auto-generated method stub
}
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("Action ");
// ( , Action)
final String res = invocation.invoke();
System.out.println("Action ");
return res;
}
}
四、Struts 2ブロッカーStruts 2ブロッカーを構成するにはstruts.xmlで次のように宣言する必要がありますstruts.xmlプロファイル
/index.jsp /success.jsp
Alias Interceptor
alias
,
Chaining Interceptor
chain
Action Action , chain result() 。
Checkbox Interceptor
checkbox
checkbox , checkbox false, HTML checkbox。
Cookies Interceptor
cookies
name,value cookies
Conversion Error Interceptor
conversionError
ActionContext Action 。
Create Session Interceptor
createSession
HttpSession, HttpSession 。
Debugging Interceptor
debugging
。
Execute and Wait Interceptor
execAndWait
Action, 。
Exception Interceptor
exception
File Upload Interceptor
fileUpload
I18n Interceptor
i18n
locale
Logger Interceptor
logger
Action
Message Store Interceptor
store
ValidationAware Action , , 。
Model Driven Interceptor
model-driven
ModelDriven, getModel Value Stack 。
Scoped Model Driven
scoped-model-driven
Action ScopedModelDriven, Scope model Action setModel Action 。
Parameters Interceptor
params
Action 。
Prepare Interceptor
prepare
Acton Preparable, Action prepare 。
Scope Interceptor
scope
Action session application 。
Servlet Config Interceptor
servletConfig
HttpServletRequest HttpServletResponse , Map 。
Static Parameters Interceptor
staticParams
struts.xml Action 。
Roles Interceptor
roles
JAAS Role, 。
Timer Interceptor
timer
Action
Token Interceptor
token
Token
Token Session Interceptor
tokenSession
Token Interceptor , Session
Validation Interceptor
validation
action-validation.xml 。
Workflow Interceptor
workflow
Action validate , , INPUT
Parameter Filter Interceptor
N/A
Profiling Interceptor
profiling
profile
=フィルタ=====================================================================================================================================次にservletまたはstrutsのactionに転送してビジネスロジックを行います.例えば、不正url(login.doのアドレス要求ではありません.ユーザーがログインしていない場合はフィルタリングします)をフィルタリングしたり、servletまたはstrutsのactionに転送する前に文字セットを統一的に設定したり、不正な文字ブロックを削除したりします.フェース向けにプログラミングするのは、あなたのserviceまたは方法です.前にメソッドを呼び出したり、メソッドの後にメソッドを呼び出したりします.例えば、動的エージェントはブロックの簡単な実装です.メソッドを呼び出す前に文字列を印刷したり(または他のビジネスロジックの操作をしたり)、メソッドを呼び出した後に文字列を印刷したり、異常を投げ出したりするときにビジネスロジックの操作をしたりすることができます.ブロッカーとフィルタの違い:
ブロッキングはjavaの反射機構に基づいており,フィルタは関数コールバックに基づいている.ブロッカーはservletコンテナに依存せず、フィルタはservletコンテナに依存します.ブロッキングはactionリクエストにのみ機能し、フィルタはほとんどのリクエストに機能します.ブロッキングはactionコンテキスト、値スタック内のオブジェクトにアクセスできますが、フィルタはアクセスできません.Actionのライフサイクルでは、ブロッキングは複数回呼び出されますが、フィルタはコンテナの初期化時に1回しか呼び出されません.
実行順序:フィルタ前-ブロック前-Action処理-ブロック後-フィルタ後.個人的にはフィルタリングは横方向のプロセスであり、まずクライアントが提出した内容をフィルタリングする(例えば、ログインしていないユーザーが内部ページにアクセスできない処理).フィルタリングが通過すると、ブロッカーはユーザーが提出したデータの検証を検査し、前期のデータ処理を行い、処理後のデータを対応するActionに送る.Action処理が完了して戻った後、ブロッキングは他のプロセス(まだ何をするか考えていない)を行い、フィルタの後続操作に戻ることができます.1つのFilterは、複数の要求または応答をブロックする責任を負うことができる.1つの要求または応答は、複数のFilterによってブロックされることもできる.Filterを作成するには、(1)Filter処理クラスの作成:(2)Web.xmlファイルでFilterを構成する2つのステップしか必要ありません.Filterを作成するにはjavax.servlet.Filterインタフェースを実装する必要があります.このインタフェースには3つの方法が定義されています.•void init(FilterConfig config):Filterの初期化を完了します.•void destroy():Filterが破棄される前に、一部のリソースの回収を完了します.•void doFilter(サーブレットRequest request,サーブレットResponse response,FilterChain chain):各リクエストおよびレスポンスの追加処理を行うフィルタ機能を実現します.フィルタFilterには、配置ファイルのfilter要素によって駆動されるinit()->doFilter()->destroy()というライフサイクルもあります.servlet 2.4では、フィルタは同様にディスペンサを要求するために使用できますが、
package test.filter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
public class LogFilter implements Filter {
private FilterConfig config;
//
public void init(FilterConfig config) {
this.config = config;
}
//
public void destroy() {
this.config = null;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) {
// ServletContext ,
ServletContext context = this.config.getServletContext();
long before = System.currentTimeMillis();
System.out.println(" ... ");
// HttpServletRequest
HttpServletRequest hrequest = (HttpServletRequest) request;
//
context.log("Filter : " + hrequest.getServletPath());
try {
// Filter , 。
chain.doFilter(request, response);
} catch (Exception e) {
e.printStackTrace();
}
long after = System.currentTimeMillis();
//
context.log(" ");
//
context.log(" " + ((HttpServletRequest) request).getRequestURI()
+ " : " + (after - before));
}
}
上記のリクエストFilterでは、リクエストのURLのみをログに記録し、すべてのリクエストに対してchain.doFilter(request,reponse)メソッドを実行し、Filterがリクエストをフィルタリングした後もリクエストを宛先アドレスに送信する.手順2:Web.xmlでFilterを構成する
log
test.filter.LogFilter
log
/filter/*
フィルタの一般的な適用:1、ユーザー要求を統一的に検証する2、request.setCharacterEncoding(符号化フォーマット)とfilterのfilterconfig.getInitParameter(符号化フォーマット名)を組み合わせてfilterのparamに構成された符号化方式を取得して要求を符号化変換する.3、ユーザから送信されたデータをフィルタ置換する4、画像フォーマットを変換する5、対応するコンテンツを圧縮する