Latest web development tutorials

JSPフィルタ

すべてのJavaクラスでのJSPとサーブレットフィルタ。

フィルタは動的に変換または要求または応答に含まれる情報を利用するためには、要求と応答をインターセプトすることができます。

一つ以上のフィルタは、サーブレットまたはサーブレットに付着させることができます。 フィルタはまた、JavaServer Pages(JSP)ファイルとHTMLページに添付することができます。

フィルタでは、次の目的を達成することができ、Javaサーブレットプログラミングクラスのために用意されています。

  • リソースバックエンドへのアクセスを要求する前に、これらの要求インターセプトクライアント。
  • サーバーの前にこれらの応答に対処するために戻ってクライアントに応答を送信します。

各種フィルタが推奨する仕様によると:

  • 認証フィルタ(認証フィルタ)。
  • データ圧縮フィルタ(データ圧縮フィルタ)。
  • 暗号化フィルタ(暗号化フィルタ)。
  • リソース・アクセス・トリガ・イベントフィルタ。
  • 画像変換フィルタ(画像変換フィルタ)。
  • ロギングおよび監査フィルタ(ログと監査フィルタ)。
  • MIME-TYPEチェーンフィルター(MIME-TYPEチェーンフィルタ)。
  • 標識されたフィルタ(フィルタをトークン化)。
  • XSL / Tフィルタ(XSL / Tフィルタ)、XMLコンテンツを変換します。

ウェブ文によって、XMLタグでデプロイメント・ディスクリプタ(web.xml)をフィルタして、[アプリケーションのデプロイメント・ディスクリプタのサーブレット名またはURLパターンにマッピングされました。

Webコンテナは、Webアプリケーションを起動するときは、インスタンスを作成するには、各フィルタのデプロイメント記述子の宣言であなたのためになります。

フィルタの実行順序は、すべてのサーブレット前web.xml構成ファイル、通常のフィルタ構成の配置の順番と一致しています。

サーブレットフィルタ方式

フィルタは、は、javax.servlet.Filterインタフェースを実装するJavaクラスです。 javax.servlet.Filterインタフェースは、3つのメソッドを定義しています。

序号方法 & 描述
1public void doFilter (ServletRequest, ServletResponse, FilterChain)
该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain用户访问后续过滤器。
2public void init(FilterConfig filterConfig)
web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。
3public void destroy()
Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。

FilterConfig使用

フィルタのinitメソッドは、に、FilterConfigオブジェクトを提供します。

web.xmlファイル構成を次のように

<filter>
	<filter-name>LoginFilter</filter-name>
	<filter-class>com.w3big.test.LogFilter</filter-class>
	<init-param>
		<param-name>Site</param-name>
		<param-value>本教程</param-value>
	</init-param>
	</filter>

initメソッドのパラメータを取得するために、FilterConfigオブジェクトを使用します。

public void  init(FilterConfig config) throws ServletException {
	// 获取初始化参数
	String site = config.getInitParameter("Site"); 
	// 输出初始化参数
	System.out.println("网站名称: " + site); 
}

JSPのフィルタインスタンス

次のサーブレットフィルタ、出力名およびウェブサイトのアドレスの例です。 サーブレットの例はあなたのフィルタの基本的な理解を与えるために、あなたは、より複雑なフィルタ・アプリケーションを書くために同じ概念を使用することができます。

//导入必需的 java 库
import javax.servlet.*;
import java.util.*;

//实现 Filter 类
public class LogFilter implements Filter  {
	public void  init(FilterConfig config) throws ServletException {
		// 获取初始化参数
		String site = config.getInitParameter("Site"); 

		// 输出初始化参数
		System.out.println("网站名称: " + site); 
	}
	public void  doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException {

		// 输出站点名称
		System.out.println("站点网址:http://www.w3big.com");

		// 把请求传回过滤链
		chain.doFilter(request,response);
	}
	public void destroy( ){
		/* 在 Filter 实例被 Web 容器从服务移除之前调用 */
	}
}

DisplayHeader.javaファイルのコードは次のとおりです。

//导入必需的 java 库
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/DisplayHeader")

//扩展 HttpServlet 类
public class DisplayHeader extends HttpServlet {

	// 处理 GET 方法请求的方法
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		// 设置响应内容类型
		response.setContentType("text/html;charset=UTF-8");

		PrintWriter out = response.getWriter();
		String title = "HTTP Header 请求实例 - 本教程实例";
		String docType =
			"<!DOCTYPE html> \n";
			out.println(docType +
			"<html>\n" +
			"<head><meta charset=\"utf-8\"><title>" + title + "</title></head>\n"+
			"<body bgcolor=\"#f0f0f0\">\n" +
			"<h1 align=\"center\">" + title + "</h1>\n" +
			"<table width=\"100%\" border=\"1\" align=\"center\">\n" +
			"<tr bgcolor=\"#949494\">\n" +
			"<th>Header 名称</th><th>Header 值</th>\n"+
			"</tr>\n");

		Enumeration headerNames = request.getHeaderNames();

		while(headerNames.hasMoreElements()) {
			String paramName = (String)headerNames.nextElement();
			out.print("<tr><td>" + paramName + "</td>\n");
			String paramValue = request.getHeader(paramName);
			out.println("<td> " + paramValue + "</td></tr>\n");
		}
		out.println("</table>\n</body></html>");
	}
	// 处理 POST 方法请求的方法
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

サーブレットフィルタマッピングをweb.xmlファイル(サーブレットフィルタマッピング)

フィルタを定義し、URLまたはサーブレットにマッピングされ、サーブレットを定義する、その後、URLパターンにほぼ同じ方法をマッピングしました。 デプロイメント記述子ファイルweb.xml内のフィルタタグの次のエントリを作成します

<?xml version="1.0" encoding="UTF-8"?>  
<web-app>  
<filter>
  <filter-name>LogFilter</filter-name>
  <filter-class>com.w3big.test.LogFilter</filter-class>
  <init-param>
    <param-name>Site</param-name>
    <param-value>本教程</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>LogFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>  
  <!-- 类名 -->  
  <servlet-name>DisplayHeader</servlet-name>  
  <!-- 所在的包 -->  
  <servlet-class>com.w3big.test.DisplayHeader</servlet-class>  
</servlet>  
<servlet-mapping>  
  <servlet-name>DisplayHeader</servlet-name>  
  <!-- 访问的网址 -->  
  <url-pattern>/TomcatTest/DisplayHeader</url-pattern>  
</servlet-mapping>  
</web-app>  

我々が設定/ *で指定されているため、フィルタは、すべてのサーブレットに適用されます あなたはサーブレットの小さな数にフィルタを適用したい場合は、特定のサーブレットのパスを指定することができます。

今、あなたが生成されたWebサーバーのログが表示され、任意のサーブレットを呼び出すために、通常の方法を試してみてください。 また、別のファイルに上記のLog4Jのログにレコーダーを使用することができます。

次に私たちは、このインスタンスのアドレスhttp:// localhost:8080にアクセス/ TomcatTest / DisplayHeader、次のように、コンソールの出力を見てみましょう。

複数のフィルタを使用して

Webアプリケーションは、定義された特定の目的に基づいていくつかの異なるフィルタすることができます。 あなたは二つのフィルタAuthenFilterLogFilterを定義たとします。 あなたは、以下に説明する別のマッピングを作成する必要があり、プロセスの残りの上、実質的に同じ説明です:

<フィルター>
   <フィルタ名> LogFilter </フィルタ名>
   <フィルタークラス> com.w3big.test.LogFilter </フィルタクラス>
   <初期化-param>の
	  <param-name>のテストのparam </ PARAM名>
	  <param-value>の初期化PARAMTER </ PARAM値>
   </ INIT-param>の
</フィルター>

<フィルター>
   <フィルタ名> AuthenFilter </フィルタ名>
   <フィルタークラス> com.w3big.test.AuthenFilter </フィルタクラス>
   <初期化-param>の
	  <param-name>のテストのparam </ PARAM名>
	  <param-value>の初期化PARAMTER </ PARAM値>
   </ INIT-param>の
</フィルター>

<フィルターマッピング>
   <フィルタ名> LogFilter </フィルタ名>
   <url-pattern> / * </ URLパターン>
</フィルターマッピング>

<フィルターマッピング>
   <フィルタ名> AuthenFilter </フィルタ名>
   <url-pattern> / * </ URLパターン>
</フィルターマッピング>

フィルタを順次適用されます

web.xmlファイルのfilter-mapping要素内の順序は、サーブレットの順にフィルタを適用するためのWebコンテナを決定します。 フィルタの順序を逆にするには、あなただけのweb.xmlファイル内のfilter-mapping要素を逆にする必要があります。

例えば、上記の例では、次にAuthenFilterを適用し、最初のアプリケーションLogFilterになりますが、以下の例では、この順序が逆になります。

<filter-mapping>
   <filter-name>AuthenFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

<filter-mapping>
   <filter-name>LogFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

各ノードのweb.xmlの設定手順

  • <filter>フィルタを指定します。
    • <filter-name>フィルタの名前を指定するために使用され、要素の内容は空にすることはできません。
    • <filter-class>要素は、フィルタの完全修飾クラス名を指定するために使用されます。
    • <init-param>要素は、その子要素、フィルタの初期化パラメータを指定するために使用され<param-name> 、パラメータの名前、指定<param-value>値指定されたパラメータを。
    • フィルタでは、使用することができますFilterConfig初期化パラメータにアクセスするためのインタフェースオブジェクトを。
  • <filter-mapping>要素は、傍受責任フィルタのリソースを設定するために使用されます。 要求パスのサーブレット名およびリソースへのアクセス:リソースインターセプトフィルタは、2つの方法で指定することができます
    • <filter-name>子要素は、フィルタの登録名を設定するために使用されます。 値がでなければなりません<filter>フィルタの名前を通じで要素宣言
    • <url-pattern>設定されたフィルタは、リクエストパス(フィルタ関連URLスタイル)を傍受しました
  • <servlet-name>フィルタがサーブレット名をブロック指定します。
  • <dispatcher>フィルタを指定傍受資源がすることができますサーブレットコンテナと呼ばれREQUESTINCLUDEFORWARDERROR 1をデフォルトREQUEST 。 ユーザーは複数を設定することができます<dispatcher>サブエレメントは、呼び出しをインターセプトするためのリソースフィルター複数の方法を指定するために使用されます。
  • <dispatcher>設定可能な値とサブ要素の重要性
    • REQUEST :ページへのユーザーの直接アクセスは、Webコンテナはフィルタを呼び出します。 ターゲットがリソースにアクセスするためのメソッドである場合、フィルタはするRequestDispatcherのことで呼び出されません)((含む)または転送します。
    • INCLUDE :ターゲット・リソースがするRequestDispatcherの(含む介してアクセスされている場合)、フィルタが呼び出されます。 また、フィルタが呼び出されません。
    • FORWARD :ターゲットリソースが前進するRequestDispatcherを介してアクセスされている場合は()メソッドは、フィルタが呼び出されます、加えて、フィルタは呼び出されません。
    • ERROR :ターゲットリソースと呼ばれる宣言型例外処理メカニズムを介している場合は、フィルタと呼ばれます。 また、フィルタは呼び出されません。