詳解JavaWeb中的過(guò)濾器Filter
一、什么是過(guò)濾器
1.Filter過(guò)濾器的作用:攔截請(qǐng)求
2.攔截請(qǐng)求常見(jiàn)場(chǎng)景:
(1)權(quán)限檢查
(2)日記操作
(3)事務(wù)管理
1.1 使用步驟
Filter 過(guò)濾器的使用步驟:
1、編寫(xiě)一個(gè)類去實(shí)現(xiàn)Filter 接口
2、實(shí)現(xiàn)過(guò)濾方法doFilter()
3、到web.xml 中去配置Filter 的攔截路徑
二、初體驗(yàn)
web工程下新建一個(gè)admin目錄,作為需要權(quán)限才能訪問(wèn)的目錄,其中有兩個(gè)文件
2.1 mynav.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>導(dǎo)航</title> </head> <body> <table> <tr> <td> 百度<input type="text"> </td> </tr> <tr> <td> Google<input type="text"> </td> </tr> <tr> <td> 必應(yīng)<input type="text"> </td> </tr> </table> </body> </html>
2.2 FilterServlet程序
package com.filter.filter; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.io.IOException; /** * @author ningqian * @create -05-16 20:17 */ //注意導(dǎo)包是javax public class FilterServlet implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("來(lái)到Filter過(guò)濾器"); HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest; HttpSession session = httpServletRequest.getSession(); //如果session的屬性u(píng)ser為空,轉(zhuǎn)發(fā)到首頁(yè) if(session.getAttribute("user")==null){ servletRequest.getRequestDispatcher("/index.jsp").forward(servletRequest,servletResponse); } else{//如果session的屬性u(píng)ser不為空,則放行 filterChain.doFilter(servletRequest,servletResponse); } } @Override public void destroy() { } }
2.3 HelloServlet程序
package com.filter.filter; import java.io.*; import javax.servlet.http.*; import javax.servlet.annotation.*; @WebServlet(name = "helloServlet", value = "/hello-servlet") public class HelloServlet extends HttpServlet { private String message; public void init() { message = "Hello World!"; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html"); // Hello PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("<h1>" + message + "</h1>"); out.println("</body></html>"); HttpSession session = request.getSession(); session.setAttribute("user","ningqian"); } public void destroy() { } }
2.4 web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <filter> <filter-name>FilterServlet</filter-name> <filter-class>com.filter.filter.FilterServlet</filter-class> </filter> <filter-mapping> <filter-name>FilterServlet</filter-name> <!--表示受限的文件--> <url-pattern>/admin/*</url-pattern> </filter-mapping> <servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.filter.filter.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>
2.5 index.jsp
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <filter> <filter-name>FilterServlet</filter-name> <filter-class>com.filter.filter.FilterServlet</filter-class> </filter> <filter-mapping> <filter-name>FilterServlet</filter-name> <!--表示受限的文件--> <url-pattern>/admin/*</url-pattern> </filter-mapping> <servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.filter.filter.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>
三、測(cè)試
1.啟動(dòng)服務(wù)器
2.在瀏覽器地址欄輸入:http:localhost:8080/filter/admin/1.jpg
表示直接訪問(wèn)admin目錄下的圖片
由于此目錄下的文件在web.xml中配置為受限,所以此時(shí)請(qǐng)求被FilterServlet收到,使用doFilter方法進(jìn)行請(qǐng)求過(guò)濾檢查,發(fā)現(xiàn)會(huì)話session中沒(méi)有user屬性,所以將該請(qǐng)求轉(zhuǎn)發(fā)到index.jsp
3.在瀏覽器地址欄輸入:http:localhost:8080/filter/
首頁(yè)不在受限的目錄下,所以可以直接訪問(wèn),點(diǎn)擊頁(yè)面上的鏈接Hello Servlet,此時(shí),將請(qǐng)求發(fā)到服務(wù)器,HelloServlet程序接收,通過(guò)doGet()方法,給會(huì)話session的user賦值
4.再次在瀏覽器輸入:http:localhost:8080/filter/admin/1.jpg,此時(shí)就可以正常訪問(wèn)。
四、Filter的生命周期
Filter 的生命周期包含幾個(gè)方法
1、構(gòu)造器方法
2、init 初始化方法
第1,2 步,在web 工程啟動(dòng)的時(shí)候執(zhí)行(Filter 已經(jīng)創(chuàng)建)
3、doFilter 過(guò)濾方法
第3 步,每次攔截到請(qǐng)求,就會(huì)執(zhí)行
4、destroy 銷毀
第4 步,停止web 工程的時(shí)候,就會(huì)執(zhí)行(停止web 工程,也會(huì)銷毀Filter 過(guò)濾器)
五、FilterConfig類
FilterConfig 類見(jiàn)名知義,它是Filter 過(guò)濾器的配置文件類。
Tomcat 每次創(chuàng)建Filter 的時(shí)候,也會(huì)同時(shí)創(chuàng)建一個(gè)FilterConfig 類,這里包含了Filter 配置文件的配置信息。
FilterConfig 類的作用是獲取filter 過(guò)濾器的配置內(nèi)容
1、獲取Filter 的名稱filter-name 的內(nèi)容:filterConfig.getFilterName()
2、獲取在Filter 中配置的init-param 初始化參數(shù)(在web.xml中配置):filterConfig.getInitParameter(“username”)
3、獲取ServletContext 對(duì)象:filterConfig.getServletContext()
<!--filter 標(biāo)簽用于配置一個(gè)Filter 過(guò)濾器--> <filter> <!--給filter 起一個(gè)別名--> <filter-name>AdminFilter</filter-name> <!--配置filter 的全類名--> <filter-class>com.atguigu.filter.AdminFilter</filter-class> <init-param> <param-name>username</param-name> <param-value>root</param-value> </init-param> <init-param> <param-name>url</param-name> <param-value>jdbc:mysql://localhost3306/test</param-value> </init-param> </filter>
六、FilterChain過(guò)濾器鏈
多個(gè)過(guò)濾器
七、Filter 的攔截路徑
Filter 過(guò)濾器它只關(guān)心請(qǐng)求的地址是否匹配,不關(guān)心請(qǐng)求的資源是否存在?。?!
八、精確匹配
8.1 目錄匹配
<url-pattern>/admin/*</url-pattern>
8.2 后綴名匹配
<url-pattern>*.html</url-pattern>
到此這篇關(guān)于詳解JavaWeb中的過(guò)濾器Filter的文章就介紹到這了,更多相關(guān)JavaWeb Filter內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解析springboot整合谷歌開(kāi)源緩存框架Guava Cache原理
本文主要為大家解析了springboot整合谷歌開(kāi)源緩存框架Guava Cache的原理以及在實(shí)際開(kāi)發(fā)過(guò)程中的使用,附含源碼,有需要的朋友可以參考下2021-08-08SpringBoot詳細(xì)講解多個(gè)配置文件的配置流程
SpringBoot項(xiàng)目是一個(gè)標(biāo)準(zhǔn)的Maven項(xiàng)目,它的配置文件需要放在src/main/resources/下,其文件名必須為application,其存在兩種文件形式,分別是properties和yaml(或者yml)文件2022-06-06Java代碼里如何拼接SQL語(yǔ)句到mybatis的xml
這篇文章主要介紹了Java代碼里拼接SQL語(yǔ)句到mybatis的xml操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Java實(shí)現(xiàn)Promise.all()的示例代碼
這篇文章主要介紹了Java實(shí)現(xiàn)Promise.all()的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08通過(guò)spring注解開(kāi)發(fā),簡(jiǎn)單測(cè)試單例和多例區(qū)別
這篇文章主要介紹了通過(guò)spring注解開(kāi)發(fā),簡(jiǎn)單測(cè)試單例和多例區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08在SpringBoot中使用YourKit進(jìn)行性能調(diào)優(yōu)的教程詳解
在應(yīng)用程序的開(kāi)發(fā)過(guò)程中,性能調(diào)優(yōu)是一個(gè)重要的環(huán)節(jié),在SpringBoot應(yīng)用程序中,我們可以使用YourKit來(lái)進(jìn)行性能調(diào)優(yōu),YourKit是一款非常強(qiáng)大的Java性能調(diào)優(yōu)工具,在本文中,我們將介紹如何在 SpringBoot應(yīng)用程序中使用YourKit進(jìn)行性能調(diào)優(yōu)2023-06-06Java8實(shí)現(xiàn)FTP及SFTP文件上傳下載
這篇文章主要介紹了Java8實(shí)現(xiàn)FTP及SFTP文件上傳下載,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09springboot 無(wú)法掃描到父類模塊中Bean的原因及解決
這篇文章主要介紹了springboot 無(wú)法掃描到父類模塊中Bean的原因及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08