日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

javaweb之Filter详解

發(fā)布時間:2023/12/2 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 javaweb之Filter详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
? ? ?一、概念:

Filter也稱之為過濾器,它是Servlet技術(shù)中比較激動人心的技術(shù),WEB開發(fā)人員通過Filter技術(shù),對web服務(wù)器管理的所有web資源:例如Jsp, Servlet, 靜態(tài)圖片文件或靜態(tài) html 文件等進(jìn)行攔截,從而實現(xiàn)一些特殊的功能。例如實現(xiàn)URL級別的權(quán)限訪問控制、過濾敏感詞匯、壓縮響應(yīng)信息等一些高級功能。

二、Filter簡介

Servlet API中提供了一個Filter接口,開發(fā)web應(yīng)用時,如果編寫的Java類實現(xiàn)了這個接口,則把這個java類稱之為過濾器Filter。通過Filter技術(shù),開發(fā)人員可以實現(xiàn)用戶在訪問某個目標(biāo)資源之前,對訪問的請求和響應(yīng)進(jìn)行攔截。簡單說,就是可以實現(xiàn)web容器對某資源的訪問前截獲進(jìn)行相關(guān)的處理,還可以在某資源向web容器返回響應(yīng)前進(jìn)行截獲進(jìn)行處理。
? ?三、快速入門
1、新建一個類,實現(xiàn)Filter接口
2、實現(xiàn)doFilter()方法,打印一句話,來證明能夠進(jìn)行攔截
3、在web.xml中進(jìn)行配置(參照Servlet配置)
4、訪問一個頁面,看看能不能攔截
1>
[java] view plaincopy
package com.test.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 Demo1Filter implements Filter {?
??? private FilterConfig filterConfig;?
?
??? public void doFilter(ServletRequest request, ServletResponse response,?
??????????? FilterChain chain) throws IOException, ServletException {?
??????? System.out.println("Demo1過濾前");?
??????? System.out.println(filterConfig.getInitParameter("param1"));?
??????? chain.doFilter(request, response);//放行。讓其走到下個鏈或目標(biāo)資源中?
??????? System.out.println("Demo1過濾后");?
??? }?
?
??? public void init(FilterConfig filterConfig) throws ServletException {?
??????? System.out.println("初始化了");?
??????? this.filterConfig = filterConfig;?
??? }?
?
??? public void destroy() {?
??????? System.out.println("銷毀了");?
??? }?
}?
2>在web.xml中進(jìn)行配置
[html] view plaincopy
<filter>?
??? <filter-name>Demo1Filter</filter-name>?
??? <filter-class>com.itheima.filter.Demo1Filter</filter-class>?
??? <init-param>?
??????? <param-name>param1</param-name>?
??????? <param-value>value在這里呢</param-value>?
??? </init-param>?
</filter>?
<filter-mapping>?
??? <filter-name>Demo1Filter</filter-name>?
??? <url-pattern>/*</url-pattern>?
??? <dispatcher>REQUEST</dispatcher> <!-- 沒有配置dispatcher就是默認(rèn)request方式的 -->?
??? <dispatcher>FORWARD</dispatcher>?
??? <dispatcher>ERROR</dispatcher>?
??? <dispatcher>INCLUDE</dispatcher>?
</filter-mapping>?

四、Filter的應(yīng)用場景
通過對filter過濾器的了解,可以得知在以下三種情況下可以做些處理:
1> 通過控制對chain.doFilter的方法的調(diào)用,來決定是否需要訪問目標(biāo)資源。
比如,可以在用戶權(quán)限驗證等等。判斷用戶是否有訪問某些資源的權(quán)限,有權(quán)限放行,沒權(quán)限不執(zhí)行chain.doFilter方法。
2> 通過在調(diào)用chain.doFilter方法之前,做些處理來達(dá)到某些目的。
比如,解決中文亂碼的問題等等。可以在doFilter方法前,執(zhí)行設(shè)置請求編碼與響應(yīng)的編碼。甚至可以對request接口進(jìn)行封裝裝飾來處理get請求方式的中文亂碼問題(重寫相應(yīng)的request.getParameter方法)。
3> 通過在調(diào)用chain.doFilter方法之后,做些處理來達(dá)到某些目的。
比如對整個web網(wǎng)站進(jìn)行壓縮。在調(diào)用chain.doFilter方法之前用類A對response對象進(jìn)行封裝裝飾,重寫getOutputStream和重寫getWriter方法。在類A內(nèi)部中,將輸出內(nèi)容緩存進(jìn)ByteArrayOutputStream流中,然后在chain.doFilter方法執(zhí)行后,獲取類A中ByteArrayOutputStream流緩存數(shù)據(jù),用GZIPOutputStream流進(jìn)行壓縮下。
五、Filter實現(xiàn)攔截的原理
Filter接口中有一個doFilter方法,當(dāng)開發(fā)人員編寫好Filter類實現(xiàn)doFilter方法,并配置對哪個web資源進(jìn)行攔截后,WEB服務(wù)器每次在調(diào)用web資源的service方法之前(服務(wù)器內(nèi)部對資源的訪問機(jī)制決定的),都會先調(diào)用一下filter的doFilter方法。
六、Filter生命周期
和Servlet一樣Filter的創(chuàng)建和銷毀也是由WEB服務(wù)器負(fù)責(zé)。不過與Servlet區(qū)別的是,它是1>在應(yīng)用啟動的時候就進(jìn)行裝載Filter類(與Servlet的load-on-startup配置效果相同)。2>容器創(chuàng)建好Filter對象實例后,調(diào)用init()方法。接著被Web容器保存進(jìn)應(yīng)用級的集合容器中去了等待著,用戶訪問資源。3>當(dāng)用戶訪問的資源正好被Filter的url-pattern攔截時,容器會取出Filter類調(diào)用doFilter方法,下次或多次訪問被攔截的資源時,Web容器會直接取出指定Filter對象實例調(diào)用doFilter方法(Filter對象常駐留Web容器了)。4>當(dāng)應(yīng)用服務(wù)被停止或重新裝載了,則會執(zhí)行Filter的destroy方法,Filter對象銷毀。
注意:init方法與destroy方法只會直接一次。
七、Filter部署應(yīng)用注意事項
1> filter-mapping標(biāo)簽中servlet-name與url-pattern。
Filter不僅可以通過url-pattern來指定攔截哪些url匹配的資源。而且還可以通過servlet-name來指定攔截哪個指定的servlet(專門為某個servlet服務(wù)了,servlet-name對應(yīng)Servlet的相關(guān)配置)。
2> filter-mapping標(biāo)簽中dispatcher。
指定過濾器所攔截的資源被 Servlet 容器調(diào)用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默認(rèn)REQUEST。用戶可以設(shè)置多個<dispatcher> 子元素用來指定 Filter 對資源的多種調(diào)用方式進(jìn)行攔截。
REQUEST:
當(dāng)用戶直接訪問頁面時,Web容器將會調(diào)用過濾器。如果目標(biāo)資源是通過RequestDispatcher的include()或forward()方法訪問或ERROR情況時,那么該過濾器就不會被調(diào)用。
INCLUDE:
如果目標(biāo)資源是通過RequestDispatcher的include()方法訪問時,那么該過濾器將被調(diào)用。除此之外,該過濾器不會被調(diào)用。
FORWARD:
如果目標(biāo)資源是通過RequestDispatcher的forward()方法訪問時,那么該過濾器將被調(diào)用,除此之外,該過濾器不會被調(diào)用。
ERROR:
如若在A.jsp頁面page指令中指定了error屬性=examError.jsp,那么A.jsp中若出現(xiàn)了異常,會跳轉(zhuǎn)到examError.jsp中處理。而在跳轉(zhuǎn)到examError.jsp時,若過濾器配置了ERROR的dispather那么則會攔截,否則不會攔截。

總結(jié)

以上是生活随笔為你收集整理的javaweb之Filter详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。