1.過濾器Filter簡介:
過濾器顧名思義就是位于中間層起到過濾作用的,用于攔截請求或響應信息祖能。過濾器 (Filter)技術是在Servlet2.3新增的功能,過濾器并不是Servlet华临,而是位于請求與響應中間起過濾作用的程序芯杀。
Servlet API中提供了一個Filter接口,開發(fā)web應用時雅潭,如果編寫的Java類實現(xiàn)了這個接口揭厚,則把這個java類稱之為過濾器Filter。通過Filter技術扶供,開發(fā)人員可以實現(xiàn)用戶在訪問某個目標資源之前筛圆,對訪問的請求和響應進行攔截养叛。簡單說思杯,就是可以實現(xiàn)web容器對某資源的訪問前截獲進行相關的處理,還可以在某資源向web容器返回響應前進行截獲進行處理劫窒。
Filter特點:
- 在服務器上扳碍,F(xiàn)ilter優(yōu)先于與之相關的Servlet或jsp頁面執(zhí)行提岔。
- 一個Filter可以附加到一個或多個Servlet上,一個Servlet也可以同樣附加到一個或多個Filter笋敞。
- 一個Filter必須實現(xiàn)javax.servlet.Filter接口并定義三個對象:
- init():該方法在容器實例化過濾器時被調用碱蒙,容器為該方法傳遞一個FilterConfig對象,其中包含配置信息。
- doFilter():該方法用于處理請求和響應赛惩。它接受3個輸入?yún)?shù):ServletRequest哀墓、ServletResponse、FilterChain 對象喷兼。FilterChain對與正確的過濾操作至關重要篮绰。doFilter()方法必須調用FilterChain的doFilter( )方法,除非該方法用于攔截以后的下游處理季惯。
- destroy():該方法由容器在銷毀過濾器實例市調用吠各。
在JavaWeb中創(chuàng)建一個Filter一般需要一下幾個步驟:
- 創(chuàng)建一個實現(xiàn)Filter接口的類,并定義3個方法:doFilter()勉抓、into()走孽、destroy()。
- 在doFilter()方法中放入過濾行為琳状,它有3個參數(shù):
- 1.ServletRequest對象:此對象為給Filter提供了對進入信息(包括表單數(shù)據(jù)、cookie盒齿、Http請求頭)的完全訪問念逞。
- 2.ServletResponse對象:一般的簡單的過濾器忽略此參數(shù)。
- 3.FilterChain對象:激活下一個相關的Filter边翁,若沒有另一個Filter翎承,則Servlet或tsp頁面被激活.
- 調用FilterChain對象的doFilter()方法,在調用此方法時符匾,激活下一個相關的Filter叨咖,若沒有另一個Filter,則Servlet或tsp頁面被激活.
- 對相應的Servlet或JSP頁面注冊過濾啊胶,部署web.xml中使用filter和filter-mapping元素甸各。
- 禁用激活器Servlet,防止用戶利用默認的ServletURL繞過過濾器設置焰坪。
2.Filter實例--使用Filter實現(xiàn)編碼過濾:
該Java項目在eclipse中的目錄結構:
- 1.實現(xiàn)Filter的類EncodingFilter.java代碼:
package ServletTest;
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 EncodingFilter implements Filter {
String encoding = null;
FilterConfig filterConfig = null;
//初始化方法
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
}
//過濾器設置
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
if (encoding!=null){
//對請求編碼進行設置
request.setCharacterEncoding(encoding);
}
//將處理權交給在一個過濾器趣倾,若沒有,則Servelt或jsp頁面激活
chain.doFilter(request,response);
}
//銷毀方法
public void destroy() {
// TODO Auto-generated method stub
this.encoding = null;
this.filterConfig = null;
}
}
- 2.web.xml配置Filter:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<filter>
<filter-name>EncodeFilter</filter-name>
<filter-class>ServletTest.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
- 3.兩個JSP文件簡單的代碼:
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>使用Filter實現(xiàn)編碼過濾</title>
</head>
<body>
<FORM name="form1" action="show.jsp" method="POST">
請輸入姓名:
<INPUT name="name" type="text">
<INPUT name="submit" value="提交" type="submit">
</FORM>
</body>
</html>
show.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Filter</title>
</head>
<body>
<%=request.getParameter("name")%>,歡迎來到這里D呈巍H辶怠!
</body>
</html>
運行的測試結果:
與不進行編碼過濾時的結果進行對比:
3.Filter使用小結:
通過編碼過濾之后黔漂,處理請求的JSP文件就可以直接獲取正常的中文字符了诫尽,無需進行編碼的硬性轉換了,徹底解決了Java Web應用的中文編碼問題炬守。