一、什么是過(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)搜索W3Cschool以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,也希望大家以后多多支持我們!