-
過濾器鏈執(zhí)行順序:
用戶請求-->過濾器1-->過濾器2-->servlet service-->過濾器2-->過濾器1-->用戶
查看全部 -
項目啟動時 init,
訪問項目時 doFilter,
項目停止時 destroy
查看全部 -
init--->doFilter--->destroy
查看全部 -
@web.xml <filter> <filter-name>FirstFilter</filter-name> <filter-class>com.imooc.filter.FirstFilter</filter-class> </filter> <filter-mapping> <filter-name>FirstFilter</filter-name> <url-pattern>/index.jsp</url-pattern> </filter-mapping> <filter-mapping> <filter-name>FirstFilter</filter-name> <url-pattern>/main.jsp</url-pattern> <dispatcher>FORWARD</dispatcher> </filter-mapping> @FirstFilter.java public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException{ HttpServletRequest hsreq = (HSReq) req; HttpServletResponse hsres = (HSRes) res; // 重定向:Dispatcher走REQUEST // hsres.sendRedirect(hsreq.getContextPath()+"/main.jsp"); hsres.sendRedirect(hsreq.getContextPath() + "/middle.jsp"); // 轉(zhuǎn)發(fā):Dispatcher走FORWARD // hsreq.getRequestDispatcher("main.jsp").forward(hsreq, hsres); // hsreq.getRequestDispatcher("main.jsp").include(hsreq, hsres);//同理
查看全部 -
Filter可認(rèn)為是Servlet的一種“變種”,它主要用于對用戶請求進行預(yù)處理,也可以對HttpServletResponse進行后處理,是個典型的處理鏈。它與Servlet的區(qū)別在于:它不能直接向用戶生成響應(yīng)。完整的流程是:Filter對用戶請求進行預(yù)處理,接著將請求交給Servlet進行處理并生成響應(yīng),最后Filter再對服務(wù)器響應(yīng)進行后處理。
Filter有如下幾個用處。
在HttpServletRequest到達Servlet之前,攔截客戶的HttpServletRequest。
根據(jù)需要檢查HttpServletRequest,也可以修改HttpServletRequest頭和數(shù)據(jù)。
在HttpServletResponse到達客戶端之前,攔截HttpServletResponse。
根據(jù)需要檢查HttpServletResponse,也可以修改HttpServletResponse頭和數(shù)據(jù)。
Filter可負(fù)責(zé)攔截多個請求或響應(yīng);一個請求或響應(yīng)也可被多個請求攔截。
創(chuàng)建一個Filter只需兩個步驟:
創(chuàng)建Filter處理類(實現(xiàn)Filter接口).
web.xml文件中配置Filter(配置<filter>與<filter-mapping>)每個過濾器都有它對應(yīng)的<url-pattern>地址.即過濾器關(guān)聯(lián)的url地址.<url-pattern>標(biāo)簽是<filter-mapping>下的子標(biāo)簽. 假如多個過濾器相關(guān)聯(lián)的地址都不一樣沒有交集,則它們都是相互獨立的.互不相干. 假如多個過濾器相關(guān)聯(lián)的地址都一樣.則它們便構(gòu)成過濾器鏈.此時用戶請求就會依次通過所有關(guān)聯(lián)這個Web資源地址的過濾器. 過濾器鏈就是針對一個客戶的請求,找到匹配的過濾器有多個.用戶請求就會依次通過所有關(guān)聯(lián)這個Web資源的過濾器.服務(wù)器會按照web.xml文件中過濾器定義的先后順序組裝成一條鏈.執(zhí)行的順序也是沿著這條鏈. 當(dāng)過濾器的doFilter()方法中的chain調(diào)用doFilter(request,response)方法.符合規(guī)則則會把請求傳遞給下一個過濾器,下一個過濾器依次調(diào)用chain.doFilter(),直到傳遞到Web資源.當(dāng)Web資源處理完傳遞過來的請求并返回響應(yīng)后.此時便執(zhí)行doFilter()方法放行后的方法.過濾器把響應(yīng)傳遞給用戶,從最接近Web資源的過濾器開始傳遞響應(yīng)給用戶. 假設(shè)定義過濾器的順序為filter1、filter2、filter3.(都關(guān)聯(lián)同一個web資源或Servlet) 初始化順序(一啟動服務(wù)器時加載,根據(jù)web.xml的定義過濾器的順序初始化):filter1-->filter2-->filter3 過濾器執(zhí)行順序:cilent發(fā)送request-->filter1-->filter2-->filter3-->Web資源-->Web資源發(fā)送響應(yīng)返回-->通過filter3-->filter2-->filter1-->到達client. 其中doFilter()結(jié)束順序filter3-->filter2-->filter1.跟遞歸一樣,因為放行是chain.doFilter(),必須當(dāng)此方法執(zhí)行完,即當(dāng)請求去到Web資源并處理完信息返回響應(yīng)后,doFilter()方法便執(zhí)行放行后的語句.然后就結(jié)束. 摧毀順序(關(guān)閉服務(wù)器):filter1-->filter2-->filter3.
查看全部 -
<filter> ? ? ? ?<filter-name>FirstFilter</filter-name> ? ? ? ?<filter-class>com.imooc.filter.FirstFilter</filter-class> ? ?</filter> ? ?<filter-mapping> ? ? ? ?<filter-name>FirstFilter</filter-name> ? ? ? ?<url-pattern>/*</url-pattern> ? ?</filter-mapping> 注意: /index.jsp:只有index.jsp /index*:帶有index前綴的所有URL /*:所有URL “*”代表任意值。
Ps1:<filter>...</filter>:只能有一個;但是<filter-mapping>...</filter-mapping>可以有多個。 Ps2:<filter>...<filter-name>Filter的名字</filter-name>...</filter>必須和<filter-mapping>...<filter-name>Filter的名字</filter-name>...</filter-mapping>一致。
查看全部 -
過濾器的生命周期. 1.實例化階段-->一啟動服務(wù)器就會從Web容器的web.xml文件中自動去加載實例化過濾器.且只會實例化一次.即生成了過濾器. 2.初始化階段-->生成過濾器之后便是初始化,加載一些初始化信息.調(diào)用init()方法.且只執(zhí)行一次. 3.過濾階段-->執(zhí)行過濾器的doFilter()方法進行過濾.執(zhí)行n次的,凡是過濾器捕獲到用戶的請求,都會執(zhí)行這個過濾方法. 4.銷毀階段-->當(dāng)Web容器關(guān)閉即服務(wù)器關(guān)閉的時候,便執(zhí)行destroy()方法銷毀.
查看全部 -
JAVA過濾機制——過濾簡介 1、過濾器三部分:過濾源(用戶請求)——>過濾規(guī)則——>過濾結(jié)果 2、過濾器不處理結(jié)果,只做輔助性操作 3、定義:過濾器是一個【服務(wù)器端】的組件,它可以【截取用戶端的請求和響應(yīng)信息】,并對這些信息過濾
查看全部 -
同一個URL請求要經(jīng)過多個過濾器時,過濾器的執(zhí)行順序按照過濾器在Web.xml中的定義順序來執(zhí)行。
查看全部 -
查看全部
-
1.一般filter都是一個鏈,web.xml 里面配置了幾個就有幾個。一個一個的連在一起?
request -> filter1 -> filter2 ->filter3 -> …. -> request resource.
2.chain.doFilter將請求轉(zhuǎn)發(fā)給過濾器鏈下一個filter , 如果沒有filter那就是你請求的資源
想當(dāng)于一個放行方法,之前的請求是到 index.jsp 放行后就會到index.jsp頁面 就會執(zhí)行里面的代碼
查看全部 -
在過濾器對象的doFilter()方法中,業(yè)務(wù)邏輯處理完成之后,需要通過FilterChain對象的doFilter()方法將請求傳遞到下一個過濾器或者目標(biāo)資源,否則將出現(xiàn)錯誤。
查看全部 -
查看全部
-
過濾器鏈執(zhí)行過程
查看全部 -
過濾器web.xml的配置
查看全部
舉報