1. 程式人生 > >JAVA中的使用Filter過濾器設定字符集

JAVA中的使用Filter過濾器設定字符集

Filter是什麼?

        Filter不是一個Servlet,它可以叫做Servlet鏈,它可以用來改變一個request,修改一個response。它雖然不能產生一個response,但可以在一個request到大Servlet之前預處理request,也可以在response離開Servlet時處理response。

具體的呼叫關係如下圖所示。


       也可以說,Filter是對Request和Response請求進行了攔截。

注意:

      只對post請求有效。

新建一個TestFilter類,繼承Filter類後,我們可以看到主要的幾個方法。

package com.bjpowermode.drp.util.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class TestFilter implements Filter {

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		
	}

}


1)init()

用來設定filter的配置物件,只調用一次。

2)doFilter()

是最重要最核心的方法,執行Filter的工作。每一個filter從doFilter()方法中得到當前的request及response

3)destory()

返回配置物件。

Filter的生命週期

      在應用啟動的時候就進行裝載Filter類。容器建立好Filter物件例項後,呼叫init()方法。接著儲存進集合容器中去了等待著,使用者訪問資源。當用戶訪問的資源正好被Filter的url-pattern攔截時,容器會取出Filter類呼叫doFilter方法,下次或多次訪問被攔截的資源時,Web容器會直接取出指定Filter物件例項呼叫doFilter方法(Filter物件常駐留Web容器了)。當應用服務被停止或重新裝載了,則會執行Filter的destroy方法,Filter物件銷燬。

注意:init方法與destroy方法只會直接一次。

在例項中,我們用Filter主要是來設定字符集,防止jsp出現中文亂碼現象。

如果不使用Filter,我們需要在每個jsp頁面中新增如下語句:

<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>

那麼,使用Filter之後呢?
package com.bjpowermode.drp.util.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/*
 * 
 * 採用Filter統一處理字符集
 */
public class CharSetEncodingFilter implements Filter {

	private String encoding;

	@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain chain) throws IOException, ServletException {
		
		//System.out.println("CharsetEncoding--->>>begin");
		//設定字符集
		arg0.setCharacterEncoding("GB18030");
		
		//繼續執行
		//如果還有filter,繼續調,如果沒有,就調jsp
		chain.doFilter(arg0,arg1);
		//System.out.println("CharsetEncoding--->>>end");
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		
		//System.out.println("CharsetEncoding--->>>init");
		this.encoding=arg0.getInitParameter("encoding");
		//System.out.println("CharsetEncoding--->>>init"+encoding);
	}

}

在配置檔案中進行配置。

注意:

CharSetEncodingFilter方法名和與配置檔案中要一致,

類的路徑com.bjpowermode.drp.util.filter.CharSetEncodingFilter。

 <filter>
  	<filter-name>CharSetEncodingFilter</filter-name>
  	<filter-class>com.bjpowermode.drp.util.filter.CharSetEncodingFilter</filter-class>
  	<init-param>
  		<param-name>encoding</param-name>
  		<param-value>GBK</param-value>
  	</init-param>
  </filter>
  <!--對什麼模式起作用  -->
  <filter-mapping>
  	<filter-name>CharSetEncodingFilter</filter-name>
  	<!--可加目錄  -->
  	<url-pattern>*.jsp</url-pattern>
  </filter-mapping>

總結:

        Filter提高了程式碼的靈活性,將變動移到了配置檔案中而不是在頁面上。

        Filter除了可以設定字符集,解決亂碼問題外,還可以用在驗證使用者許可權,對網站進行壓縮等方面。