Java過(guò)濾器doFilter里chain.doFilter()函數(shù)的理解
對(duì)過(guò)濾器doFilter里chain.doFilter()函數(shù)的理解
關(guān)于chain.doFilter()函數(shù)在最近的使用中不是很理解,但是考慮到他是過(guò)濾器。過(guò)濾器顧名思義就是在執(zhí)行某件事情的時(shí)候開(kāi)始之前。
開(kāi)始進(jìn)行處理的叫做過(guò)濾處理。一個(gè)方法,一個(gè)類就是充當(dāng)過(guò)濾器的角色。它是在一個(gè)容器(類似于Tomcat)啟動(dòng)之后,打開(kāi)一網(wǎng)站,他就會(huì)根據(jù)配置就行過(guò)濾處理。
doFilter()方法就是過(guò)濾器的主要方法,init()方法就是在容器啟動(dòng)的時(shí)候執(zhí)行的。doFilter()方法中的chain.doFilter(request,response)方法剛開(kāi)始還有些不怎么理解?,F(xiàn)在有一點(diǎn)明白了。
doFilter(request,response)的方法就是在你打開(kāi)一個(gè)頁(yè)面當(dāng)滿足過(guò)濾器的條件的時(shí)候,他就會(huì)繼續(xù)執(zhí)行你打開(kāi)頁(yè)面時(shí)候的操作。同時(shí)如果你使用了httpservletrequest和httpservletResponse的話,獲取servletPath的值就是你要打開(kāi)的文件的地址。
例子如下:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest)request;
HttpServletResponse resp=(HttpServletResponse)response;
String servletPath= req.getServletPath();
HttpSession session=req.getSession();
String flag=(String)session.getAttribute("flag");
if(servletPath!=null&&(servletPath.equals("/03/index.jsp")||servletPath.equals("/03/login.jsp")||servletPath.equals("/loginServlet17"))){
chain.doFilter(request, response);
}else{
if(flag!=null&&flag.equals("login_success")){
chain.doFilter(request, response);
}else if(flag!=null&&flag.equals("login_error")){
req.setAttribute("msg", "登錄失敗,請(qǐng)重新登錄");
req.setAttribute("return_uri", servletPath);
RequestDispatcher rd=req.getRequestDispatcher("/03/login.jsp");
rd.forward(req, resp);
}else{
req.setAttribute("msg","你尚未登錄");
req.setAttribute("return_uri", servletPath);
RequestDispatcher rd=request.getRequestDispatcher("/03/login.jsp");
rd.forward(req, resp);
}
}
System.out.println(servletPath);
}
過(guò)濾器Filter&&chain.doFilter()
容器在加載的時(shí)候,會(huì)讀取web.xml中的<filter></filter>,根據(jù)指定的類路徑來(lái)實(shí)例化過(guò)濾器。
那么過(guò)濾器究竟是用來(lái)做什么的呢?
顧名思義,過(guò)濾器肯定是過(guò)濾我們不想要的東西。所以說(shuō)執(zhí)行肯定是在我們?cè)L問(wèn)某個(gè)頁(yè)面之前。所以發(fā)散開(kāi)來(lái),它也可以執(zhí)行一些我們?cè)谠L問(wèn)某個(gè)頁(yè)面,或者某些頁(yè)面之前想要的操作。
那么:
a.什么是過(guò)濾器?過(guò)濾器和普通類有什么區(qū)別?

b.過(guò)濾器中的chain.doFilter()起什么作用?

所以說(shuō)chain.doFilter(request,response)是過(guò)濾器的必要操作,目的是如果有多個(gè)過(guò)濾器需要處理同一個(gè)url時(shí)把請(qǐng)求傳給下一個(gè)過(guò)濾器。
c.過(guò)濾器的處理的先后順序?
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/foo*</url-pattern>
</servlet-mapping>
<filter-mapping>
<filter-name>servletFilter</filter-name>
<url-pattern>myServlet</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/foo*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>anotherFilter</filter-name>
<url-pattern>/foo/bar</url-pattern>
</filter-mapping>
如果一個(gè)普通的請(qǐng)求訪問(wèn)的URL是/foo/bar,那么它將匹配所有這3個(gè)過(guò)濾器。過(guò)濾器鏈將由3個(gè)過(guò)濾器組成,依次為myFilter、anotherFilter,然后是servletFilter。myFilter將在anotherFilter之前執(zhí)行,因?yàn)檫@是它們出現(xiàn)在部署描述符中的順序。它們都將在servletFilter之前執(zhí)行,因?yàn)閁RL映射總是在Servlet名稱映射之前執(zhí)行。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
實(shí)戰(zhàn)干貨之基于SpringBoot的RabbitMQ多種模式隊(duì)列
RabbitMQ 是一個(gè)由Erlang語(yǔ)言開(kāi)發(fā)的AMQP的開(kāi)源實(shí)現(xiàn),支持多種客戶端。用于在分布式系統(tǒng)中存儲(chǔ)轉(zhuǎn)發(fā)消息,在易用性、擴(kuò)展性、高可用性等方面表現(xiàn)不俗,下文將帶你深入了解 RabbitMQ 多種模式隊(duì)列2021-09-09
Spring Boot打jar包后配置文件的外部?jī)?yōu)化配置方法
這篇文章主要介紹了Spring Boot打jar包后配置文件的外部?jī)?yōu)化配置方法,需要的朋友可以參考下2018-02-02
在Mybatis @Select注解中實(shí)現(xiàn)拼寫(xiě)動(dòng)態(tài)sql
這篇文章主要介紹了在Mybatis @Select注解中實(shí)現(xiàn)拼寫(xiě)動(dòng)態(tài)sql,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11
聊聊Spring?Boot如何配置多個(gè)Kafka數(shù)據(jù)源
這篇文章主要介紹了Spring?Boot配置多個(gè)Kafka數(shù)據(jù)源的相關(guān)知識(shí),包括生產(chǎn)者、消費(fèi)者配置,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-10-10
Java面向?qū)ο蠡A(chǔ)知識(shí)之?dāng)?shù)組和鏈表
這篇文章主要介紹了Java面向?qū)ο蟮闹當(dāng)?shù)組和鏈表,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下2021-11-11
JAVA正則表達(dá)式校驗(yàn)qq號(hào)碼的方法
Java作為一種開(kāi)發(fā)語(yǔ)言,有許多值得推薦的地方,但是它一直以來(lái)沒(méi)有自帶對(duì)正則表達(dá)式的支持。下面小編給大家?guī)?lái)了JAVA正則表達(dá)式校驗(yàn)qq號(hào)碼的方法,需要的朋友參考下吧2018-04-04
Java實(shí)現(xiàn)手寫(xiě)線程池的示例代碼
在我們的日常的編程當(dāng)中,并發(fā)是始終離不開(kāi)的主題,而在并發(fā)多線程當(dāng)中,線程池又是一個(gè)不可規(guī)避的問(wèn)題。本文就來(lái)分享一下如何自己手寫(xiě)一個(gè)線程池,需要的可以參考一下2022-08-08
Spring Boot利用JSR303實(shí)現(xiàn)參數(shù)驗(yàn)證的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于Spring Boot利用JSR303實(shí)現(xiàn)參數(shù)驗(yàn)證的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
Java實(shí)現(xiàn)聯(lián)系人管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)聯(lián)系人管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02

