App下載

帶你詳細(xì)了解JavaWeb中的Filter過(guò)濾器

迷糊的小七 2021-08-20 14:44:33 瀏覽數(shù) (3299)
反饋

一、什么是過(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)文章,也希望大家以后多多支持我們!


0 人點(diǎn)贊