Java Web從入門到"改行"(3)--過濾器Filter

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一般需要一下幾個步驟:

  1. 創(chuàng)建一個實現(xiàn)Filter接口的類,并定義3個方法:doFilter()勉抓、into()走孽、destroy()。
  1. 在doFilter()方法中放入過濾行為琳状,它有3個參數(shù):
    • 1.ServletRequest對象:此對象為給Filter提供了對進入信息(包括表單數(shù)據(jù)、cookie盒齿、Http請求頭)的完全訪問念逞。
  • 2.ServletResponse對象:一般的簡單的過濾器忽略此參數(shù)。
  • 3.FilterChain對象:激活下一個相關的Filter边翁,若沒有另一個Filter翎承,則Servlet或tsp頁面被激活.
  1. 調用FilterChain對象的doFilter()方法,在調用此方法時符匾,激活下一個相關的Filter叨咖,若沒有另一個Filter,則Servlet或tsp頁面被激活.
  2. 對相應的Servlet或JSP頁面注冊過濾啊胶,部署web.xml中使用filter和filter-mapping元素甸各。
  3. 禁用激活器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應用的中文編碼問題炬守。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末牧嫉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子劳较,更是在濱河造成了極大的恐慌驹止,老刑警劉巖浩聋,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異臊恋,居然都是意外死亡衣洁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門抖仅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坊夫,“玉大人,你說我怎么就攤上這事撤卢』吩洌” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵放吩,是天一觀的道長智听。 經常有香客問我,道長渡紫,這世上最難降的妖魔是什么到推? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮惕澎,結果婚禮上莉测,老公的妹妹穿的比我還像新娘。我一直安慰自己唧喉,他們只是感情好捣卤,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著八孝,像睡著了一般董朝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上干跛,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天益涧,我揣著相機與錄音,去河邊找鬼驯鳖。 笑死闲询,一個胖子當著我的面吹牛,可吹牛的內容都是我干的浅辙。 我是一名探鬼主播扭弧,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼记舆!你這毒婦竟也來了鸽捻?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎御蒲,沒想到半個月后衣赶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡厚满,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年府瞄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碘箍。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡遵馆,死狀恐怖,靈堂內的尸體忽然破棺而出丰榴,到底是詐尸還是另有隱情货邓,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布四濒,位于F島的核電站换况,受9級特大地震影響,放射性物質發(fā)生泄漏盗蟆。R本人自食惡果不足惜复隆,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望姆涩。 院中可真熱鬧,春花似錦惭每、人聲如沸骨饿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宏赘。三九已至,卻和暖如春黎侈,著一層夾襖步出監(jiān)牢的瞬間察署,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工峻汉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贴汪,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓休吠,卻偏偏與公主長得像扳埂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瘤礁,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內容

  • 本文包括:1阳懂、Filter簡介2、Filter是如何實現(xiàn)攔截的?3岩调、Filter開發(fā)入門4巷燥、Filter的生命周期...
    廖少少閱讀 7,272評論 3 56
  • 監(jiān)聽器(listener) 監(jiān)聽器簡介 :監(jiān)聽器就是一個實現(xiàn)特定接口的普通java程序,這個程序專門用于監(jiān)聽另一個...
    奮斗的老王閱讀 2,507評論 0 53
  • Servlet過濾器是 Servlet 程序的一種特殊用法号枕,主要用來完成一些通用的操作缰揪,如編碼的過濾、判斷用戶的登...
    重山楊閱讀 1,223評論 0 12
  • 1.過濾器簡介 Filter也稱之為過濾器堕澄,它是Servlet技術中最激動人心的技術邀跃,WEB開發(fā)人員通過Filte...
    胖先森閱讀 1,133評論 0 16
  • 在同事的推薦下,觀看了第二步韓國電影《辯護人》蛙紫。講述的是一個高中學歷律師的一段人生歷程拍屑。成家,艱苦奮斗坑傅,窮困潦倒僵驰,...
    福木閱讀 379評論 0 0