Interstage Application Server J2EE ユーザーズガイド
目次 索引 前ページ次ページ

第2部 Servlet/JSP編> 第7章 Webアプリケーションの開発> 7.5 Webアプリケーション環境定義ファイル(deployment descriptor)> 7.5.3 Webアプリケーション環境定義ファイル(deployment descriptor)のタグの詳細

7.5.3.5 フィルタクラスを適用する対象

 フィルタ機能を利用するには、“フィルタクラスの定義”と“フィルタクラスを適用する対象の定義”をします。ここでは、フィルタクラスを適用する対象の定義について説明します。

 フィルタクラスを適用する対象は、filter-mappingタグで定義します。
 filter-mappingタグでは、リクエストに対して、どのフィルタをどの順番で使えばよいかをかWebコンテナに指示します。
 filter-mappingタグは複数定義することができます。フィルタを実行する順番は、以下のように決まります。

  1. <url-pattern>要素が定義されている<filter-mapping>の設定が有効になります。
    web.xmlに<url-pattern>要素が定義されている<filter-mapping>の設定が複数存在する場合には、定義されている順番でフィルタを実行する順番が決まります。
  2. <servlet-name>要素が定義されている<filter-mapping>の設定が有効になります。
    web.xmlに<servlet-name>要素が定義されている<filter-mapping>の設定が複数存在する場合には、定義されている順番でフィルタを実行する順番が決まります。

■記述形式

------------------------------------------------------------------------------------
    <filter-mapping>
      <filter-name>value</filter-name>
      <servlet-name>name</servlet-name>
    </filter-mapping>
    <filter-mapping>
      <filter-name>value</filter-name>
      <url-pattern>pattern</url-pattern>
    </filter-mapping>
------------------------------------------------------------------------------------

■タグの内容

タグ名

説明

タグの
省略

複数の
指定

filter-name

フィルタ名を指定します。
この名前がfilterタグ内のfilter-nameタグの値としてマッチしている必要があります。

×

×

url-pattern

フィルタとマッピングするURLパターンを指定します。
servlet-nameタグと同時に指定することはできません。
URLは以下のように記述します。

  • 単独のURLの場合
    URLで呼び出す場合の名前を記述します。
    <例> /servlet/servlet1
  • 特定のプレフィックス(パス、識別子)で始まるURLの場合
    最後に"/*"を付加し、記述します。
    <例> /prefix/*
  • 特定の拡張子をもつURLの場合
    "*.xxx"を用いて記述します。
    <例> *.do
    "*.xxx"を用いて特定の拡張子をもつファイルを指定する場合には、プレフィックスと一緒に指定することはできません。
      <例> /path/*.do は指定できません。
    特定の拡張子をもつファイルを指定した場合は、Webアプリケーション全体のファイルが対象となります。

×

×

servlet-name

フィルタとマッピングするサーブレット名を指定します。
url-patternタグと同時に指定することはできません。
サーブレット名には、servletタグのservlet-nameタグで指定した名前を記述します。指定していないサーブレット名を記述した場合、または、サーブレット名を省略した場合は、エラーとなり、そのfilter-mappingタグの定義内容は無効となります。

×

×

■記述例

 特定のサーブレットに対するフィルタの定義を以下に示します。

------------------------------------------------------------------------------------
  <web-app>
    <filter>
      <filter-name>helloWorld</filter-name>            ← フィルタクラスの別名です。
      <filter-class>MyHelloWorldFilter</filter-class>  ← フィルタクラス名です。
    </filter>
    <filter-mapping>
      <filter-name>helloWorld</filter-name>            ← フィルタクラスの別名です。
      <servlet-name>MyHelloWorld</servlet-name>        ← サーブレット名です。
    </filter-mapping>
  </web-app>
------------------------------------------------------------------------------------

 単独のURL(以下の例ではJSPファイルのURL)に対するフィルタの定義を以下に示します。

------------------------------------------------------------------------------------
  <web-app>
    <filter>
      <filter-name>helloWorld</filter-name>            ← フィルタクラスの別名です。
      <filter-class>MyHelloWorldFilter</filter-class>  ← フィルタクラス名です。
    </filter>
    <filter-mapping>
      <filter-name>helloWorld</filter-name>            ← フィルタクラスの別名です。
      <url-pattern>/filter.jsp</url-pattern>
                                        ← フィルタとマッピングするURIパターンです。
    </filter-mapping>
  </web-app>
------------------------------------------------------------------------------------

 URIパターンに対するフィルタの定義を以下に示します。
 以下の例では、ワイルドカードを使って"/"以下のリソースのすべてがフィルタ機能の対象になることを示しています。

------------------------------------------------------------------------------------
  <web-app>
    <filter>
      <filter-name>helloWorld</filter-name>            ← フィルタクラスの別名です。
      <filter-class>MyHelloWorldFilter</filter-class>  ← フィルタクラス名です。
    </filter>
    <filter-mapping>
      <filter-name>helloWorld</filter-name>            ← フィルタクラスの別名です。
      <url-pattern>/*</url-pattern>     ← フィルタとマッピングするURIパターンです。
    </filter-mapping>
  </web-app>
------------------------------------------------------------------------------------

 Webアプリケーションの記述例

------------------------------------------------------------------------------------
  import java.io.*;
  import javax.servlet.*;
  import javax.servlet.http.*;

  public class MyHelloWorldFilter implements Filter {
    String company;
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
                        throws IOException, ServletException {
      HttpServletResponseWrapper wrapper = new MyResponseWrapper(
                                           (HttpServletResponse)res);
      chain.doFilter(req, wrapper);
      CharArrayWriter writer = new CharArrayWriter();
      writer.write(wrapper.toString().substring(0,
                   wrapper.toString().indexOf("</body>")-1));
      writer.write("<hr>\n");
      writer.write("Copyrights &copy; " + company + "\n");
      writer.write("</body>\n</html>\n");
      
      PrintWriter out = res.getWriter();
      res.setContentLength(writer.toString().length());
      out.write(writer.toString());
      out.close();
    }
    public void init(FilterConfig config) throws ServletException {
      company = config.getInitParameter("company");
    }
    
    public void destroy(){}
    
    class MyResponseWrapper extends HttpServletResponseWrapper {
      private CharArrayWriter output;
      public String toString() {
        return output.toString();
      }
      public MyResponseWrapper(HttpServletResponse response){
        super(response);
        output = new CharArrayWriter();
      }
      public PrintWriter getWriter(){
        return new PrintWriter(output);
      }
    }
  }
------------------------------------------------------------------------------------

目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2005