天天看點

javaweb —— 過濾器Filter

過濾器Filter

1.filter的簡介

filter是對用戶端通路資源的過濾,符合條件放行,不符合條件不放行,并且可以對目 标資源通路前後進行邏輯處理

2.快速入門

步驟:

1)編寫一個過濾器的類實作Filter接口

2)實作接口中尚未實作的方法(着重實作doFilter方法)

3)在web.xml中進行配置(主要是配置要對哪些資源進行過濾)

  • EncodingFilter 類
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;
	}
	
}

           

3.Filter的API詳解

(1)filter生命周期及其與生命周期相關的方法

Filter接口有三個方法,并且這個三個都是與Filter的生命相關的方法

1.init(Filterconfig):代表filter對象初始化方法 filter對象建立時執行

javaweb —— 過濾器Filter

2.doFilter(ServletRequest,ServletResponse,FilterCha):代表filter執行過濾的核心方法,如果某資源在已經被配置到這個filter進行過濾的話,那麼每次通路這個資源都會執行doFilter方法

3.destory():代表是filter銷毀方法 當filter對象銷毀時執行該方法

Filter對象的生命周期:

Filter何時建立:伺服器啟動時就建立該filter對象

Filter何時銷毀:伺服器關閉時filter銷毀

(2)Filter的AP詳解

1)init(FilterConfig)

其中參數config代表 該Filter對象的配置資訊的對象,内部封裝是該filter的配置資訊。

2)destory()方法

filter對象銷毀時執行

3)doFilter方法

doFilter(ServletRequest,ServletResponse,FilterChain)

其中的參數:

ServletRequest/ServletResponse:每次在執行doFilter方法時 web容器負責建立一個request和一個response對象作為doFilter的參數傳遞進來。該request個該response就是在通路目标資源的service方法時的request和response。

FilterChain:過濾器鍊對象,通過該對象的doFilter方法可以放行該請求

javaweb —— 過濾器Filter

4.Filter的配置

javaweb —— 過濾器Filter

url-pattern配置時

1)完全比對 /sertvle1

2)目錄比對 /aaa/bbb/* ----最多的

/user/:通路前台的資源進入此過濾器

/admin/:通路背景的資源時執行此過濾器

3)擴充名比對 *.abc *.jsp

注意:url-pattern可以使用servlet-name替代,也可以混用

dispatcher:通路的方式(了解)

REQUEST:預設值,代表直接通路某個資源時執行filter

FORWARD:轉發時才執行filter

INCLUDE: 包含資源時執行filter

ERROR:發生錯誤時 進行跳轉是執行filter

總結Filter的作用?

1)公共代碼的提取

2)可以對request和response中的方法進行增強(裝飾者模式/動态代理)

3)進行權限控制