フィルタ処理の概要 †
フィルタ処理は、
- 業務処理を行うサーブレットが実行される前後に、
HTTP-REQUESTとRESPONSEに対して共通的な処理を行う
- javax.servlet.Filterクラスを継承したクラスによって行われる
- 複数のフィルタ処理を重ねることができる
- web.xmlでどのURLに適用されるのか定義される
フィルタ処理クラス(javax.servlet.Filter) †
- フィルタ処理クラスは javax.servlet.Filter インタフェースを実装して作成する。
フィルタ処理クラスは以下のメソッドを実装する。
void init(...) | フィルタ処理クラスがインスタンス化されるときに動く |
void doFilter(...) | フィルタリング処理を実装する |
void destroy() | フィルタ処理クラスがアンロードされるときに動く |
- void init(FilterConfig? filterconfig)
- initメソッドは、フィルタ処理クラスがインスタンス化されるときに呼び出される。
- 引数のFilterConfig?は、以下のメソッドを持っている。
String getFilterName?() | web.xmlへの登録名 |
String getInitParameter?(String name) | web.xmlの<filter>要素の<init-param>の値 |
Enumeration getInitParameterNames?() | web.xmlの<filter>要素の<init-param>の値を列挙 |
ServletContext? getServletContext?() | ServletContext?の取得 |
- initメソッドでは、getInitParameter?(String)で初期化パラメータを取得して、フィールドに設定する
- void doFilter(ServletRequest? req,ServletResponse? res,FilterChain? chain)
HTTP | AFilter | BFilter | Servlet |
REQ -> | doFilter(req,req,chain){ | | |
| (前処理) | | |
| chain.doFilter(req,res)-> | doFilter(req,res,chain){ | |
| | (前処理) | |
| | chain.doFilter(req,res)-> | doPost(req,res){ |
| | | (業務処理) |
| | (後処理)<--------------- | return; |
| (後処理)<--------------- | return; | } |
RES <- | return; | } | |
| } | | |
- doFilterメソッドは、Servletが呼び出される毎に呼び出される
- 次のFilterもしくはServletは、引数のchainオブジェクトのchain.doFilter(req,res)を実行する
- 前処理はchain.doFilter(req,res)の前に記述する
- 後処理はchain.doFilter(req,res)の後に記述する
- void destroy()
- destroy()は、フィルタ処理クラスが消去されるときに呼び出される。
- 通常は何もしない
web.xml:
<filter>
<filter-name>XXXFILTER</finter-name>
<filter-class>com.foo.XxxFilter</filter-class>
<init-param> <-- パラメータが無ければ
<param-name>PARAM</param-name> <-- 不要
<param-value>VALUE</param-value> <--
</init-param> <--
</filter>
<filter-mapping>
<filter-name>XXXFILTER</filter-name>
<servlet-name>/FooServlet</<servlet-name> <-- どちらか一方で良い
<url-pattern>/*</url-pattern> <--
</filter-mapping>
※web.xmlの記述順序?を参照
Java#JavaEE