- Home ›
- サーブレット/JSP入門 ›
- フィルタ
フィルタを多重に設定する
フィルタは1つだけではなく、複数のフィルタを設定することができます。これによって目的に応じた小さなフィルタを作成し、汎用的なフィルタを作成することが可能になります。
複数のフィルタを1つのサーブレットに対して設定するには単に2つのフィルタを定義するだけです。フィルターはweb.xml内で定義した順番に実行されます。
例として次のような同じURLパターンを対象とするフィルタが2つ定義されていたとします。この場合<filter-mapping>が先に定義されている「filtertest」フィルタがまず実行され、次に「filtertest2」フィルタが実行されます。
<web-app> <filter> <filter-name>filtertest</filter-name> <filter-class>FilterTest</filter-class> </filter> <filter> <filter-name>filtertest2</filter-name> <filter-class>FilterTest2</filter-class> </filter> <filter-mapping> <filter-name>filtertest</filter-name> <url-pattern>/hello/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>filtertest2</filter-name> <url-pattern>/hello/*</url-pattern> </filter-mapping> </web-app>
次に<filter-mapping>の定義の順番を変更してみます。
<web-app> <filter> <filter-name>filtertest</filter-name> <filter-class>FilterTest</filter-class> </filter> <filter> <filter-name>filtertest2</filter-name> <filter-class>FilterTest2</filter-class> </filter> <filter-mapping> <filter-name>filtertest2</filter-name> <url-pattern>/hello/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>filtertest</filter-name> <url-pattern>/hello/*</url-pattern> </filter-mapping> </web-app>
この場合は「filtertest2」フィルタが実行されてから「filtertest」フィルタが実行されます。
同じサーブレットが対象になっている場合、<filter>要素が定義された順番ではなく、<filter-mapping>が定義された順番にフィルタは実行されることに注意して下さい。
サンプルプログラム
では簡単なサンプルプログラムでフィルタを試してみましょう。
web.xmlファイルは下記のようにしました。
<?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <filter> <filter-name>filtertest</filter-name> <filter-class>FilterTest</filter-class> </filter> <filter> <filter-name>filtertest2</filter-name> <filter-class>FilterTest2</filter-class> </filter> <filter-mapping> <filter-name>filtertest</filter-name> <url-pattern>/helloworld</url-pattern> </filter-mapping> <filter-mapping> <filter-name>filtertest2</filter-name> <url-pattern>/helloworld</url-pattern> </filter-mapping> <servlet> <servlet-name>helloworld</servlet-name> <servlet-class>HelloWorld</servlet-class> </servlet> <servlet-mapping> <servlet-name>helloworld</servlet-name> <url-pattern>/helloworld</url-pattern> </servlet-mapping> </web-app>
プログラムは下記の通りです。
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorld extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ response.setContentType("text/html; charset=Shift_JIS"); PrintWriter out = response.getWriter(); System.out.println("HelloWorld"); out.println("<html>"); out.println("<head>"); out.println("<title>フィルタテスト</title>"); out.println("</head>"); out.println("<body>"); out.println("<p>Hello World!</p>"); out.println("</body>"); out.println("</html>"); } }
import java.io.*; import javax.servlet.*; import javax.servlet.Filter; import javax.servlet.FilterChain; public class FilterTest implements Filter{ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain){ try{ System.out.println("フィルタ実行"); chain.doFilter(request, response); }catch (ServletException se){ }catch (IOException e){ } } public void init(FilterConfig filterConfig) throws ServletException{ } public void destroy(){ } }
import java.io.*; import javax.servlet.*; import javax.servlet.Filter; import javax.servlet.FilterChain; public class FilterTest2 implements Filter{ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain){ try{ System.out.println("フィルタ2実行"); chain.doFilter(request, response); }catch (ServletException se){ }catch (IOException e){ } } public void init(FilterConfig filterConfig) throws ServletException{ } public void destroy(){ } }
上記をコンパイル後に「d:\servlet-sample\filter\WEB-INF\classes\」ディレクトリにクラスファイルを移動した後で、ブラウザで「http://localhost:8080/filter/helloworld」へアクセスしてみます。
まず呼び出したサーブレットは普通に実行されています。次にフィルタとして設定したサーブレットが実行されているか確認します。
呼び出したサーブレットが実際に実行される前に、フィルタとフィルタ2が順に実行されていることが確認できます。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。