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