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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

Filter基金会

發(fā)布時(shí)間:2023/12/19 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Filter基金会 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一個(gè)、總結(jié)

  簡(jiǎn)單的說(shuō),Filter的作用就是攔截(Tomcat的)service(Request,Response)方法。拿到Request、Response對(duì)象進(jìn)行處理。然后釋放控制。繼續(xù)自己主動(dòng)流轉(zhuǎn)。其運(yùn)用的還是“分層”的思想。

  至于為什么要增加這一層,為什么要對(duì)Request、Response對(duì)象進(jìn)行攔截。個(gè)人感覺(jué)根本原因是為了對(duì)多個(gè)server資源(Servlet、JSP等)的請(qǐng)求、對(duì)應(yīng)進(jìn)行一些公共的設(shè)置。這里強(qiáng)調(diào)的是“多個(gè)”。

假設(shè)是一個(gè)資源,就沒(méi)有設(shè)置Filter的必要,由于僅僅須要在這個(gè)資源須要的地方(之前)設(shè)置Request、Response就可以。也就是“設(shè)置”放到哪里都能夠,由于非常多請(qǐng)求、響應(yīng)有非常多共同的設(shè)置,所以將共同之處抽出來(lái)作為一層。就是所謂的Filter。

作用例如以下圖:

?

傳統(tǒng)調(diào)用:

?

?

?

加上Filter:

?

?

?

二、FilterChain

  當(dāng)幾個(gè)Servlet有一些同樣的設(shè)置(過(guò)濾),而另幾個(gè)Servlet有其他同樣的設(shè)置……,這樣一個(gè)Filter是不能完畢全部的過(guò)濾,所以就須要多個(gè)Filter協(xié)作來(lái)共同完畢這項(xiàng)任務(wù)。

于是著名的FilterChain就出來(lái)了。那么這個(gè)FilterChain中的多個(gè)Filter是怎樣協(xié)作的呢?

  每一個(gè)Filter的職能不同,當(dāng)一個(gè)Servlet的請(qǐng)求到達(dá)后,這個(gè)請(qǐng)求就會(huì)沿著這條Filter鏈,一個(gè)一個(gè)走過(guò),走到它須要的Filter時(shí)。這個(gè)Filter就會(huì)進(jìn)行對(duì)它的Request、Response進(jìn)行操作。完成后自己主動(dòng)向下流轉(zhuǎn)。這就是所謂的職責(zé)鏈模式。

  每一個(gè)Filter有3個(gè)方法:

  ?? init(FilterConfig filterConfig)

  ?? doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

  ?? destroy()

  三個(gè)方法(以下進(jìn)行具體介紹)依次運(yùn)行,一個(gè)Filter鏈中的多個(gè)Filter的運(yùn)行順序例如以下圖:

  

?

  即:運(yùn)行第一個(gè)過(guò)濾器的chain.doFilter()之前的代碼---->第二個(gè)過(guò)濾器的chain.doFilter()之前的代碼---->……---->第n個(gè)過(guò)濾器的chain.doFilter()之前的代碼---->所請(qǐng)求servlet的service()方法中的代碼——>所請(qǐng)求servlet的doGet()或doPost()方法中的代碼---->第n個(gè)過(guò)濾器的chain.doFilter()之后的代碼---->……---->第二個(gè)過(guò)濾器的chain.doFilter()之后的代碼---->第一個(gè)過(guò)濾器的chain.doFilter()之后的代碼。

?

三、主要接口與方法

  首先Servlet過(guò)濾器API包括了3個(gè)接口,它們都在javax.servlet包中,各自是Filter接口、FilterChain接口和FilterConfig接口。

使用

  ?? 全部的過(guò)濾器都必須實(shí)現(xiàn)Filter接口。

該接口定義了init(),doFilter(),destory()三個(gè)方法。

  ?? FilterChain接口作為了doFilter0方法的參數(shù):?? doFilter(ServletRequest request, ServletResponse response,FilterChain chain)

  ?? FilterConfig接口作為了init()方法的參數(shù): init(FilterConfig filterConfig)

  也就是,過(guò)濾器類將實(shí)現(xiàn)Filter接口,然后使用這個(gè)過(guò)濾器類中的FilterChain和FilterConfig接口。該過(guò)濾器類的—個(gè)引用將傳遞給FilterChain對(duì)象,以同意過(guò)濾器把控制權(quán)傳遞給鏈中的下一個(gè)資源。FilterConfig對(duì)象將由容器提供給過(guò)濾器,以同意訪問(wèn)該過(guò)濾器的初始化數(shù)據(jù)。

以下對(duì)3個(gè)接口與所包括的方法進(jìn)行簡(jiǎn)要介紹:

?

Filter接口

  1)?????? public void init (FilterConfig filterConfig)?throws? ServletException.

  當(dāng)開(kāi)始使用servlet過(guò)濾器服務(wù)時(shí)。Web容器調(diào)用此方法一次。為服務(wù)準(zhǔn)備過(guò)濾器;即通過(guò)FilterConfig對(duì)象拿到過(guò)濾器的初始化參數(shù)。即配置文件里配置的信息。然后在須要使用過(guò)濾器的時(shí)候調(diào)用doFilter()。并傳遞配置信息。

  2)?????? public voiddoFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException

  每一個(gè)過(guò)濾器都接受當(dāng)前的請(qǐng)求和響應(yīng),且FilterChain過(guò)濾器鏈中的過(guò)濾器(應(yīng)該都是符合條件的)都會(huì)被運(yùn)行。doFilter方法中,過(guò)濾器能夠?qū)φ?qǐng)求和響應(yīng)做它想做的一切,通過(guò)調(diào)用他們的方法收集數(shù)據(jù),或者給對(duì)象加入新的行為。

  過(guò)濾器通過(guò)傳送至此方法的FilterChain參數(shù),調(diào)用chain.doFilter()將控制權(quán)傳送給下一個(gè)過(guò)濾器。當(dāng)這個(gè)調(diào)用返回后,過(guò)濾器能夠在它的 Filter方法的最后對(duì)響應(yīng)做些其他的工作。假設(shè)過(guò)濾器想要終止請(qǐng)求的處理或得到對(duì)響應(yīng)的全然控制,則能夠不調(diào)用下一個(gè)過(guò)濾器。而將其重定向至其他一些頁(yè)面。

當(dāng)鏈中的最后一個(gè)過(guò)濾器調(diào)用chain.doFilter()方法時(shí)。將執(zhí)行最初請(qǐng)求的Servlet。

  3)?????? public voiddestroy()

  假設(shè)doFilter()法里的全部線程退出或已超時(shí),容器調(diào)用此方法。

server調(diào)用destory()以指出過(guò)濾器已結(jié)束服務(wù)。用于釋

放過(guò)濾器占用的資源。

?

FilterChain接口

  1)???? public voiddoFilter(ServletRequest requestServletResponse response)???throws java.io.IOException,ServletException

  此方法是由Servlet容器提供給開(kāi)發(fā)人員的,用于對(duì)資源請(qǐng)求過(guò)濾鏈的依次調(diào)用,通過(guò)FilterChain調(diào)用過(guò)濾鏈中的下一個(gè)過(guò)濾?? 器,假設(shè)是最后一個(gè)過(guò)濾器,則下一個(gè)就調(diào)用目標(biāo)資源。

?

FilterConfig接口

?  FilterConfig接口檢索過(guò)濾器名、初始化參數(shù)以及活動(dòng)的Servlet上下文。

  1)?????? public java.lang.String getFilterName()

  2)?????? public ?ServletContext ?getServletContex()

  3)?????? public java.lang.String ?getlnitParameter(java.lang.String name)

  4)?????? public java.util.Enumeration getlnitParameterNames()

?

四、配置使用

  過(guò)濾器通過(guò)Web應(yīng)用程序中的配置描寫(xiě)敘述符web.xml文件里的明。包含部分<filter>、<filter-mapping>:


<filter>。主要包含:

  1)?????? <filter-name>和<f'flter-class>兩個(gè)必須的子元素

  2)?????? <icon>、<init-param>,<display-name>,<description>這4個(gè)可選的子元素。

  <filter-name>子元素定義了—個(gè)過(guò)濾器的名字,<filter-class>指定了由容器加載的實(shí)際類,<init-param>子元素為過(guò)濾器提供初始化參數(shù)。


<filter-mapping>主要由

  1)?????? <filter-name>,<servlet-name>和<url-pattem>子元素組成。

<servlet-name>將過(guò)濾器映射到一個(gè)或多個(gè)Servlet上,<url-pattem>將過(guò)濾器映射到—個(gè)或多個(gè)隨意特征的URL的JSP頁(yè)面。

?

<url-pattem>的4種配置方式: 

<filter><filter-name>CharsetEncodingFilter</filter-name><filter-class>com.bjpowernode.drp.util.filter.CharsetEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>GBK</param-value></init-param></filter><!--精確匹配,不採(cǎi)用不論什么修飾符 --><filter-mapping><filter-name>CharsetEncodingFilter</filter-name><url-pattern>/servlet/TestServlet</url-pattern></filter-mapping><!--擴(kuò)展匹配,由*號(hào)和擴(kuò)展名組成 --><filter-mapping><filter-name>CharsetEncodingFilter</filter-name><url-pattern>*.jsp</url-pattern></filter-mapping><!--路徑前綴匹配。包括一個(gè)文件夾和一個(gè)/* --><filter-mapping><filter-name>CharsetEncodingFilter</filter-name><url-pattern>/servlet/*</url-pattern></filter-mapping><!--全匹配。使用/* --><filter-mapping><filter-name>CharsetEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>


五、代碼演示樣例:


Filter類:

package com.bjpowernode.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;import org.omg.CORBA.Request; /*** 採(cǎi)用Filter允許處理字符集* @author v-wangzhip*/ public class CharsetEncodingFilter implements Filter {private String encoding;@Overridepublic void destroy() {// TODO Auto-generated method stub}@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {//System.out.println("CharsetEncodingFilter---->begin");//設(shè)置字符集request.setCharacterEncoding(encoding);//繼續(xù)向下運(yùn)行chain.doFilter(request, response);//System.out.println("CharsetEncodingFilter---->end");}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {this.encoding=filterConfig.getInitParameter("encoding");System.out.println("encoding---->"+ encoding);} }

?

Web.xml配置:

<filter><filter-name>CharsetEncodingFilter</filter-name><filter-class>com.bjpowernode.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-mapping><filter-name>CharsetEncodingFilter</filter-name><url-pattern>/servlet/*</url-pattern></filter-mapping>

?

六、總結(jié)

  個(gè)人感覺(jué),Filter是將多個(gè)請(qǐng)求-響應(yīng)中公共的須要設(shè)置的東西提出來(lái)插入到請(qǐng)求-響應(yīng)之間的一個(gè)中間層。

多個(gè)Filter組成一個(gè)FilterChain。每一個(gè)Filter有自己的職能。能依照一定規(guī)則來(lái)處理到達(dá)的請(qǐng)求和響應(yīng),體現(xiàn)了職責(zé)鏈模式。

Filter僅僅對(duì)post請(qǐng)求起作用,它提供了一種聲明式服務(wù)。具有可插拔能力,即能夠任意開(kāi)啟和關(guān)閉。

?

版權(quán)聲明:本文博客原創(chuàng)文章,博客,未經(jīng)同意,不得轉(zhuǎn)載。

總結(jié)

以上是生活随笔為你收集整理的Filter基金会的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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