Java過濾器doFilter里chain.doFilter()函數(shù)的理解
對過濾器doFilter里chain.doFilter()函數(shù)的理解
關(guān)于chain.doFilter()函數(shù)在最近的使用中不是很理解,但是考慮到他是過濾器。過濾器顧名思義就是在執(zhí)行某件事情的時候開始之前。
開始進(jìn)行處理的叫做過濾處理。一個方法,一個類就是充當(dāng)過濾器的角色。它是在一個容器(類似于Tomcat)啟動之后,打開一網(wǎng)站,他就會根據(jù)配置就行過濾處理。
doFilter()方法就是過濾器的主要方法,init()方法就是在容器啟動的時候執(zhí)行的。doFilter()方法中的chain.doFilter(request,response)方法剛開始還有些不怎么理解?,F(xiàn)在有一點(diǎn)明白了。
doFilter(request,response)的方法就是在你打開一個頁面當(dāng)滿足過濾器的條件的時候,他就會繼續(xù)執(zhí)行你打開頁面時候的操作。同時如果你使用了httpservletrequest和httpservletResponse的話,獲取servletPath的值就是你要打開的文件的地址。
例子如下:
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", "登錄失敗,請重新登錄"); 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); }
過濾器Filter&&chain.doFilter()
容器在加載的時候,會讀取web.xml中的<filter></filter>,根據(jù)指定的類路徑來實(shí)例化過濾器。
那么過濾器究竟是用來做什么的呢?
顧名思義,過濾器肯定是過濾我們不想要的東西。所以說執(zhí)行肯定是在我們訪問某個頁面之前。所以發(fā)散開來,它也可以執(zhí)行一些我們在訪問某個頁面,或者某些頁面之前想要的操作。
那么:
a.什么是過濾器?過濾器和普通類有什么區(qū)別?
b.過濾器中的chain.doFilter()起什么作用?
所以說chain.doFilter(request,response)是過濾器的必要操作,目的是如果有多個過濾器需要處理同一個url時把請求傳給下一個過濾器。
c.過濾器的處理的先后順序?
<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>
如果一個普通的請求訪問的URL是/foo/bar,那么它將匹配所有這3個過濾器。過濾器鏈將由3個過濾器組成,依次為myFilter、anotherFilter,然后是servletFilter。myFilter將在anotherFilter之前執(zhí)行,因?yàn)檫@是它們出現(xiàn)在部署描述符中的順序。它們都將在servletFilter之前執(zhí)行,因?yàn)閁RL映射總是在Servlet名稱映射之前執(zhí)行。
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
實(shí)戰(zhàn)干貨之基于SpringBoot的RabbitMQ多種模式隊列
RabbitMQ 是一個由Erlang語言開發(fā)的AMQP的開源實(shí)現(xiàn),支持多種客戶端。用于在分布式系統(tǒng)中存儲轉(zhuǎn)發(fā)消息,在易用性、擴(kuò)展性、高可用性等方面表現(xiàn)不俗,下文將帶你深入了解 RabbitMQ 多種模式隊列2021-09-09Spring Boot打jar包后配置文件的外部優(yōu)化配置方法
這篇文章主要介紹了Spring Boot打jar包后配置文件的外部優(yōu)化配置方法,需要的朋友可以參考下2018-02-02在Mybatis @Select注解中實(shí)現(xiàn)拼寫動態(tài)sql
這篇文章主要介紹了在Mybatis @Select注解中實(shí)現(xiàn)拼寫動態(tài)sql,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11聊聊Spring?Boot如何配置多個Kafka數(shù)據(jù)源
這篇文章主要介紹了Spring?Boot配置多個Kafka數(shù)據(jù)源的相關(guān)知識,包括生產(chǎn)者、消費(fèi)者配置,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-10-10Java面向?qū)ο蠡A(chǔ)知識之?dāng)?shù)組和鏈表
這篇文章主要介紹了Java面向?qū)ο蟮闹當(dāng)?shù)組和鏈表,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下2021-11-11Spring Boot利用JSR303實(shí)現(xiàn)參數(shù)驗(yàn)證的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于Spring Boot利用JSR303實(shí)現(xiàn)參數(shù)驗(yàn)證的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05Java實(shí)現(xiàn)聯(lián)系人管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)聯(lián)系人管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02