フィルター フィルター
フィルタは、クライアントがアクセスするリソースをフィルタリングするもので、条件を満たしていれば解放し、条件を満たしていない場合は解放しません。また、対象リソースに対して事前に論理的な処理を行うこともできます。それらにアクセスした後。
ステップ:
- Filter インターフェースを実装するフィルター クラスを作成します。
- インターフェイスに実装されていないメソッドを実装します (doFilter メソッドの実装に重点を置きます)。
- web.xmlで設定します(主にどのリソースをフィルタリングするかを設定します)
フィルタ実装クラスの例:
package com.yyb.filter;
import java.io.IOException;
import javax.servlet.*;
/**
* Created by Administrator on 2017/7/28.
*/
public class FilterDemo implements Filter {
@Override
//Filter创建的时候执行init方法
public void init(FilterConfig filterConfig) throws ServletException {
//1、获得web.xml中filter 的名称<filter-name>FilterDemo</filter-name>
System.out.println(filterConfig.getFilterName());
//2、获得当前filter的初始化参数
System.out.println(filterConfig.getInitParameter("aaa"));
//3、获得servletContext
filterConfig.getServletContext();
System.out.println("init ....");
}
@Override
//doFilter是Filter的核心过滤的方法
/*
* request: 内部封装是客户端http请求的内容
* response: 代表是响应
* FilterChain: 过滤器链对象
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("quick1 running....");
//放行请求
chain.doFilter(request, response);
}
@Override
//Filter对象销毁的时候执行destory方法
public void destroy() {
System.out.println("destroy...");
}
}
web.xml
<filter>
<filter-name>FilterDemo</filter-name>
<filter-class>com.yyb.filter.FilterDemo</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
フィルターの詳細API
フィルターのライフサイクルとそのライフサイクル関連のメソッド、フィルター インターフェイスには 3 つのメソッドがあり、これら 3 つはすべてフィルターのライフサイクルに関連するメソッドです。
- init(Filterconfig): フィルター オブジェクトの作成時に実行されるフィルター オブジェクトの初期化メソッドを表します。
- doFilter(ServletRequest,ServletResponse,FilterCha): フィルタリングを実行するフィルタのコア メソッドを表します。リソースがフィルタリング用にこのフィルタに設定されている場合、リソースがアクセスされるたびに doFilter メソッドが実行されます。
- destroy(): フィルタオブジェクトが破棄されるときに実行されるフィルタ破棄メソッドを表します。
Filter オブジェクトのライフサイクル
- フィルターの作成時: サーバーの起動時にフィルター オブジェクトが作成されます。
- フィルタが破棄される場合: サーバーが閉じられるとフィルタが破棄されます。
init(FilterConfig): パラメータ config はフィルタ オブジェクトの構成情報のオブジェクトを表し、内部パッケージはフィルタの構成情報です。
destroy() メソッド: フィルタ オブジェクトが破棄されるときに実行されます。
doFilter メソッド: doFilter(ServletRequest, ServletResponse, FilterChain)、パラメータ ServletRequest/ServletResponse は、doFilter メソッドが実行されるたびに、Web コンテナが doFilter のパラメータとしてリクエストと応答オブジェクトを作成する責任を負います。リクエストとレスポンスは、対象リソースのサービスメソッドにアクセスする際のリクエストとレスポンスです。FilterChain はフィルター チェーン オブジェクトであり、リクエストはオブジェクトの doFilter メソッドを通じて解放できます。チェーン オブジェクトは、設定されたフィルター マッピング順序に従ってフィルターを順番に実行します。
<filter>
<filter-name>FilterDemo</filter-name>
<filter-class>com.yyb.filter.FilterDemo</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
URLパターンの設定
-
/Servlet1と完全に一致し
、Servlet1 にアクセスする場合にのみ実行されます。 -
/aaa/bbb/* に一致するディレクトリ
/user/ : フォアグラウンドのリソースにアクセスする場合はこのフィルターを入力します
/admin/ : バックグラウンドでリソースにアクセスするときにこのフィルターを実行します -
拡張子は *.abc *.jsp と一致します
注: url-pattern は、servlet-name に置き換えることも、混合することもできます。
<filter-mapping>
<filter-name>FilterDemo</filter-name>
<!--<url-pattern>/*</url-pattern>-->
<servlet-name>FilterTest</servlet-name>
<servlet-name>FilterTest1</servlet-name>
</filter-mapping>
ディスパッチャー: アクセス方法
- REQUEST: デフォルト値。リソースに直接アクセスするときにフィルターを実行することを意味します。
- FORWARD: 転送時のみフィルターを実行します。
- INCLUDE: リソースが含まれる場合にフィルターを実行します
- ERROR: エラー発生時のジャンプ時にフィルターを実行
例: web.xml
<filter>
<filter-name>FilterDemo</filter-name>
<filter-class>com.yyb.filter.FilterDemo</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
FilterTest に転送コードを追加しますrequest.getRequestDispatcher("/index.jsp").forward(request, response);
。この時点で、FilterTest にアクセスすると、フィルターは 2 回ではなく順番にのみ実行されます。転送時にはフィルタは実行されません。
ただしリダイレクトは2回実行されるので、FilterTestに転送コードを追加するresponse.sendRedirect(request.getContextPath()+"/index.jsp");
と実行結果が確認できます。
フィルターの役割
- パブリックコードの抽出
- リクエストとレスポンスのメソッドを拡張可能(デコレータモード/ダイナミックプロキシ)
- 権限制御を実行する
フィルタを使用してパラメータの中国語文字化けを解決する
package com.ithiema.web.filter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class EncodingFilter implements Filter{
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//request.setCharacterEncoding("UTF-8");
//在传递request之前对request的getParameter方法进行增强
/*
* 装饰者模式(包装)
*
* 1、增强类与被增强的类要实现统一接口
* 2、在增强类中传入被增强的类
* 3、需要增强的方法重写 不需要增强的方法调用被增强对象的
*
*/
//被增强的对象
HttpServletRequest req = (HttpServletRequest) request;
//增强对象
EnhanceRequest enhanceRequest = new EnhanceRequest(req);
chain.doFilter(enhanceRequest, response);
}
@Override
public void destroy() {
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
}
class EnhanceRequest extends HttpServletRequestWrapper{
private HttpServletRequest request;
public EnhanceRequest(HttpServletRequest request) {
super(request);
this.request = request;
}
//对getParaameter增强
@Override
public String getParameter(String name) {
String parameter = request.getParameter(name);//乱码
try {
parameter = new String(parameter.getBytes("iso8859-1"),"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return parameter;
}
}