Servlet和Filter之間的區(qū)別與聯(lián)系
filter是一個可以復(fù)用的代碼片段,可以用來轉(zhuǎn)換HTTP請求、響應(yīng)和頭信息。Filter不像Servlet,它不能產(chǎn)生一個請求或者響應(yīng),它只是修改對某一資源的請求,或者修改從某一的響應(yīng)。
最近使用插裝的時候,改用cookie對計(jì)算機(jī)進(jìn)行識別,加入了過濾,仔細(xì)研究了一下servlet和filter,區(qū)別主要是:
過濾器的生命周期一般都要經(jīng)過下面三個階段:
servlet的特點(diǎn)是:
初始化
當(dāng)容器第一次加載該過濾器時,init() 方法將被調(diào)用。該類在這個方法中包含了一個指向 Filter Config 對象的引用。我們的過濾器實(shí)際上并不需要這樣做,因?yàn)槠渲袥]有使用初始化信息,這里只是出于演示的目的。
過濾
過濾器的大多數(shù)時間都消耗在這里。doFilter方法被容器調(diào)用, 同時傳入分別指向這個請求/響應(yīng)鏈中的 Servlet Request、Servlet Response 和 Filter Chain 對象的引用。然后過濾器就有機(jī)會處理請求,將處理任務(wù)傳遞給鏈中的下一個資源(通過調(diào)用 Filter Chain 對象引用上的 doFilter方法),之后在處理控制權(quán)返回該過濾器時處理響應(yīng)。
析構(gòu)
容器緊跟在垃圾收集之前調(diào)用 destroy()方法,以便能夠執(zhí)行任何必需的清理代碼。
關(guān)于chain.doFilter(request,response)他的作用是將請求轉(zhuǎn)發(fā)給過濾器鏈上下一個對象。這里的下一個指的是下一個filter,如果沒有filter那就是你請求的資源。 一般filter都是一個鏈,web.xml 里面配置了幾個就有幾個。一個一個的連在一起
request -> filter1 -> filter2 ->filter3 -> .... -> request resource.
filter是鏈?zhǔn)讲僮鳎敲丛谔幚韱蝹€filter時必須最后跳轉(zhuǎn)到servlet對請求進(jìn)行響應(yīng)。
如果走chain的話,通過chain.doFilter(request,response)這個方法會立即跳轉(zhuǎn)到被攔截的servlet并且執(zhí)行完還要再返回filter.chain相當(dāng)于一扇門,從這扇門出去再從這扇門回來.調(diào)用filter的方法就是在web.xml中配置,需要配置一個與你需要攔截的servlet相同的url-pattern.
<!-- 配置一個過濾器 --> <filter> <filter-name>suibianxie</filter-name> <filter-class>com.etoak.filter.MyEncoding</filter-class> <!-- 配置一個私有參數(shù) --> <init-param> <param-name>mycode</param-name> <param-value>gbk</param-value> </init-param> </filter> <!-- 攔截的先后順序和mapping的順序有關(guān) --> <filter-mapping> <filter-name>suibianxie</filter-name> <!-- 注意這里和要攔截的servlet的url-pattern必須一致,等于是過濾器 搶在servlet之前攔截住了 --> <url-pattern>/servlet/Test</url-pattern> </filter-mapping> <!-- 配置第二個過濾器 --> <filter> <filter-name>suibianxie2</filter-name> <filter-class>com.etoak.filter.Naming</filter-class> </filter> <filter-mapping> <filter-name>suibianxie2</filter-name> <url-pattern>/servlet/Test</url-pattern> </filter-mapping> <servlet> <servlet-name>Test</servlet-name> <servlet-class>com.etoak.servlet.Test</servlet-class> </servlet> <servlet-mapping> <servlet-name>Test</servlet-name> <url-pattern>/servlet/Test</url-pattern> </servlet-mapping>
以上所述是小編給大家介紹的Servlet和Filter之間的區(qū)別與聯(lián)系,希望對大家有所幫助!
- springboot掃描自定義的servlet和filter代碼詳解
- servlet過濾器(Filter)詳解(九)
- SpringBoot初始教程之Servlet、Filter、Listener配置詳解
- 詳談Servlet和Filter的區(qū)別以及兩者在Struts2和Springmvc中的應(yīng)用
- web.xml中servlet, bean, filter, listenr 加載順序_動力節(jié)點(diǎn)Java學(xué)院整理
- Filter、Servlet、Listener的學(xué)習(xí)_動力節(jié)點(diǎn)Java學(xué)院整理
- Spring Boot 編寫Servlet、Filter、Listener、Interceptor的方法
- 詳解Servlet之過濾器(Filter)
- Java servlet、filter、listener、interceptor之間的區(qū)別和聯(lián)系
- 解決cannot be cast to javax.servlet.Filter 報錯的問題
- JavaWeb Servlet中Filter過濾器的詳解
相關(guān)文章
mybatis-plus QueryWrapper自定義查詢條件的實(shí)現(xiàn)
這篇文章主要介紹了mybatis-plus QueryWrapper自定義查詢條件的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
全網(wǎng)最全SpringBoot集成swagger的詳細(xì)教程
swagger是當(dāng)下比較流行的實(shí)時接口文文檔生成工具,swagger分為swagger2?和swagger3兩個常用版本,二者區(qū)別不是很大,主要對于依賴和注解進(jìn)行了優(yōu)化,swagger2需要引入2個jar包,swagger3只需要一個,用起來沒有什么大的區(qū)別,本文給大家詳細(xì)介紹,感興趣的朋友一起看看吧2022-08-08
編寫Java代碼對HDFS進(jìn)行增刪改查操作代碼實(shí)例
這篇文章主要介紹了Java代碼對HDFS進(jìn)行增刪改查操作,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
Elasticsearch倒排索引詳解及實(shí)際應(yīng)用中的優(yōu)化
Elasticsearch(ES)使用倒排索引來加速文本的搜索速度,倒排索引之所以高效,主要是因?yàn)樗淖兞藬?shù)據(jù)的組織方式,使得查詢操作可以快速完成,這篇文章主要給大家介紹了關(guān)于Elasticsearch倒排索引詳解及實(shí)際應(yīng)用中優(yōu)化的相關(guān)資料,需要的朋友可以參考下2024-08-08
MyBatis注解實(shí)現(xiàn)動態(tài)SQL問題
這篇文章主要介紹了MyBatis注解實(shí)現(xiàn)動態(tài)SQL問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02
java實(shí)戰(zhàn)小技巧之優(yōu)雅的實(shí)現(xiàn)字符串拼接
字符串拼接是我們在Java代碼中比較經(jīng)常要做的事情,就是把多個字符串拼接到一起,這篇文章主要給大家介紹了關(guān)于java實(shí)戰(zhàn)小技巧之優(yōu)雅的實(shí)現(xiàn)字符串拼接的相關(guān)資料,需要的朋友可以參考下2021-08-08

