最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Tomcat中Filter過濾器的具體使用

 更新時間:2024年06月20日 09:40:14   作者:花落隨風(fēng)輕飄舞  
Filter?是一種用于攔截請求和過濾響應(yīng)的組件,本文主要介紹了Tomcat中Filter過濾器的具體使用,具有一定的參考價值,感興趣的可以了解一下

1、Filter 介紹

在 Tomcat 中,F(xiàn)ilter 是一種用于攔截請求過濾響應(yīng)的組件,可以在請求到達 Servlet 之前或響應(yīng)離開 Servlet 之后對其進行處理。

Filter 的主要應(yīng)用場景包括:

  • 權(quán)限控制:可以使用 Filter 來檢查請求的用戶是否具有訪問特定資源的權(quán)限
  • 日志記錄:可以使用 Filter 來記錄請求和響應(yīng)的信息,以便進行監(jiān)控和故障排除
  • 性能監(jiān)控:可以使用 Filter 來測量請求的處理時間和響應(yīng)時間,以便進行性能優(yōu)化
  • 數(shù)據(jù)加密和解密:可以使用 Filter 來對請求和響應(yīng)進行加密和解密,以保護敏感信息的安全

2、Filter 的生命周期

Filter 的生命周期由 Tomcat 容器管理,包含以下幾個方法:

  • 構(gòu)造器方法,在 web 工程啟動的時候執(zhí)行
  • init 初始化方法,在 web 工程啟動的時候執(zhí)行
  • doFilter 過濾方法,每次攔截到請求,就會執(zhí)行
  • destroy 銷毀,停止 web 工程的時候,就會銷毀 Filter 過濾器

3、Filter 和 FilterChain

Filter 接口

public interface Filter {
   // 容器創(chuàng)建的時候調(diào)用, 即啟動 Tomcat 的時候調(diào)用
   public void init(FilterConfig filterConfig) throws ServletException;
   // 由 FilterChain 調(diào)用, 并且傳入 FilterChain 本身, 最后回調(diào) FilterChain 的 doFilter() 方法
   public void doFilter(ServletRequest request, ServletResponse response,
       FilterChain chain) throws IOException, ServletException;
   // 容器銷毀的時候調(diào)用, 即關(guān)閉 Tomcat 的時候調(diào)用
   public void destroy();
 }

FilterChain 接口

public interface FilterChain {
   // 由 Filter.doFilter() 中的 chain.doFilter 調(diào)用
   public void doFilter(ServletRequest request, ServletResponse response)
     throws IOException, ServletException;
}

當(dāng) Tomcat 接收到 URL 請求時,它會根據(jù)在 web.xml 文件中配置的過濾器和映射路徑來創(chuàng)建 FilterChain。如果某個請求匹配了一些過濾器的映射路徑,那么這些過濾器將被添加到 FilterChain。創(chuàng)建了 FilterChain 之后,就開始執(zhí)行 doFilter,進行請求的鏈?zhǔn)教幚怼?/p>

過濾器執(zhí)行順序:

  • 通過 web.xml 配置的 Filter 過濾器,執(zhí)行順序由 <filter-mapping> 標(biāo)簽的配置順序決定。<filter-mapping> 靠前,則 Filter 先執(zhí)行,靠后則后執(zhí)行。通過修改 <filter-mapping> 的順序便可以修改 Filter 的執(zhí)行順序
  • 通過 @WebFilter 注解配置的 Filter 過濾器,無法進行排序,若需要對 Filter 過濾器進行排序,建議使用 web.xml 進行配置

4、Filter 攔截過程

如圖是 Filter 攔截過程示意圖。所有 Filter 和 Web 資源都默認(rèn)執(zhí)行在同一個線程中(因為Filter 和 Web 資源通常是在 HttpServlet 容器中運行的,而 HttpServlet 容器是基于單線程模型的)。對于 FilterChain 中的 Filter,它們都使用同一 Request 對象。

以下是 Filter 攔截過程的一般步驟:

  • 客戶端發(fā)送請求到給 Web 服務(wù)器
  • Web 服務(wù)器接收到請求后,將請求傳遞給 HttpServlet 容器
  • HttpServlet 容器根據(jù)請求的 URL 路徑和配置的映射信息,確定應(yīng)該調(diào)用哪些 Filter
  • Filter 的 doFilter() 方法被調(diào)用,該方法將接收請求和響應(yīng)對象作為參數(shù)
  • 在 doFilter() 方法中,F(xiàn)ilter 可以執(zhí)行各種操作,例如檢查請求頭、修改請求參數(shù)、處理權(quán)限驗證等
  • 如果 Filter 決定繼續(xù)處理請求,它可以通過調(diào)用 filterChain.doFilter() 方法將請求傳遞給下一個 Filter(如果有下一個 Filter)或 Web 資源(沒有下一個 Filter)
  • 下一個 Filter 的 doFilter() 方法被調(diào)用,直到請求到達最終的目標(biāo)資源
  • 目標(biāo)資源處理請求并生成響應(yīng),響應(yīng)通過 Filter 鏈反向傳遞,每個 Filter 都可以在響應(yīng)離開之前對其進行修改或處理
  • 最終,響應(yīng)被發(fā)送回客戶端,客戶端接收到處理后的結(jié)果

5、FilterConfig

FilterConfig 是 Filter 過濾器的配置文件類。Tomcat 每次創(chuàng)建 Filter 的時候,也會同時創(chuàng)建一個 FilterConfig 類,它包含了 Filter 配置文件的配置信息。

FilterConfig 類的作用是獲取 filter 過濾器的配置內(nèi)容

  • 獲取 Filter 的名稱 filter-name 的內(nèi)容
  • 獲取在 Filter 中配置的 init-param 初始化參數(shù)
  • 獲取 ServletContext 對象
@Override
public void init(FilterConfig filterConfig) throws ServletException {
    // 1、獲取 Filter 的名稱 filter-name 的內(nèi)容
    System.out.println("filter-name 的值是:" + filterConfig.getFilterName());
    // 2、獲取在 web.xml 中配置的 init-param 初始化參數(shù)
    System.out.println("初始化參數(shù) username 的值是:" + filterConfig.getInitParameter("username"));
    System.out.println("初始化參數(shù) url 的值是:" + filterConfig.getInitParameter("url"));
    // 3、獲取 ServletContext 對象
    System.out.println(filterConfig.getServletContext());
}

6、Filter 使用

工程目錄

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">

    <!-- <display-name> 元素常用于配置 servlet、過濾器或其他 Web 組件的顯示名稱。
    這個顯示名稱主要用于在管理界面或日志中標(biāo)識該組件,以方便識別和管理。 -->
    <!-- 標(biāo)識項目名 -->
    <display-name>ServletTest</display-name>

    <!-- 定義首頁文件,也就是用戶直接輸入域名時跳轉(zhuǎn)的頁面(如http://localhost:8080/)-->
    <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
    </welcome-file-list>


    <!--filter 標(biāo)簽用于配置一個 Filter 過濾器-->
    <filter>
        <!--給 filter 起一個別名-->
        <filter-name>AdminFilter1</filter-name>
        <!--配置 filter 的全類名-->
        <filter-class>com.test.AdminFilter1</filter-class>
        <!-- 設(shè)置 Servlet 初始化參數(shù)
        可以通過 FilterConfig.getInitParamenter(String name) 方法訪問初始化參數(shù) -->
        <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>
    <!-- 設(shè)置 filter 映射 -->
    <filter-mapping>
        <!-- 和 filter 標(biāo)簽中的 filter-name 對應(yīng) -->
        <filter-name>AdminFilter1</filter-name>
        <!-- 設(shè)置匹配的路徑,這里設(shè)置為 /img/* 表示訪問 img 目錄下的圖片都會調(diào)用該 filter(AdminFilter) -->
        <url-pattern>/img/*</url-pattern>
    </filter-mapping>
    <filter>
        <filter-name>AdminFilter2</filter-name>
        <filter-class>com.test.AdminFilter2</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>AdminFilter2</filter-name>
        <url-pattern>/img/*</url-pattern>
    </filter-mapping>
</web-app>

login.jsp 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>登錄</title>
    </head>
    <body>
    <form action="http://localhost:8080/servlettest/loginServlet" method="get">
        用戶名: <input type="text" name="username"/> <br>
        密 碼: <input type="password" name="password"/> <br>
        <input type="submit" />
    </form>
    </body>
</html>

LoginServlet 類

package com.test;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
            IOException {
        resp.setContentType("text/html; charset=UTF-8");
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        if ("root".equals(username) && "123456".equals(password)) {
            System.out.println("設(shè)置 Seesion: {user : " + username + " }");
            req.getSession().setAttribute("user",username);
            System.out.println("登錄成功!");
            resp.getWriter().write("登錄 成功!?。?);
        } else {
            System.out.println("登錄失?。?);
            req.getRequestDispatcher("/login.jsp").forward(req,resp);
        }
    }
}

AdminFilter1 類

package com.test;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class AdminFilter1 implements Filter {

    // doFilter 方法,專門用于攔截請求??梢宰鰴?quán)限檢查
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain
            filterChain) throws IOException, ServletException {
        System.out.println("過濾器 AdminFilter1");
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        HttpSession session = httpServletRequest.getSession();
        Object user = session.getAttribute("user");
        // System.out.println("登錄用戶: " + user);
        // 如果等于 null,說明還沒有登錄
        if (user == null) {
            System.out.println("未登錄,跳轉(zhuǎn)到登錄頁面");
            servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
            return;
        } else {
            // 讓程序繼續(xù)往下訪問用戶的目標(biāo)資源
            System.out.println("AdminFilter1 調(diào)用 doFilter 方法");
            filterChain.doFilter(servletRequest,servletResponse);
            System.out.println("AdminFilter1 結(jié)束了 doFilter 方法的調(diào)用");
        }
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 1、獲取 Filter 的名稱 filter-name 的內(nèi)容
        System.out.println("filter-name 的值是:" + filterConfig.getFilterName());
        // 2、獲取在 web.xml 中配置的 init-param 初始化參數(shù)
        System.out.println("初始化參數(shù) username 的值是:" + filterConfig.getInitParameter("username"));
        System.out.println("初始化參數(shù) url 的值是:" + filterConfig.getInitParameter("url"));
        // 3、獲取 ServletContext 對象
        System.out.println(filterConfig.getServletContext());
    }
}

AdminFilter2 類

package com.test;

import javax.servlet.*;
import java.io.IOException;

public class AdminFilter2 implements Filter {

    // doFilter 方法,專門用于攔截請求。可以做權(quán)限檢查
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain
            filterChain) throws IOException, ServletException {
        System.out.println("過濾器 AdminFilter2");
        System.out.println("AdminFilter2 調(diào)用 doFilter 方法");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("AdminFilter2 結(jié)束了 doFilter 方法的調(diào)用");
    }
}

運行演示圖

運行流程:

  • 啟動服務(wù)器 Tomcat,創(chuàng)建 AdminFilter1 和 AdminFilter2 對象,獲取 FilterConfig 配置并初始化,創(chuàng)建 LoginServlet 對象,獲取 ServletConfig 配置并初始化,進入首頁文件 login.jsp
  • 客戶端嘗試請求訪問 http://localhost:8080/servlettest/img/2.jpg,由過濾器 AdminFilter1 處理,輸出“過濾器 AdminFilter1”和“未登錄,跳轉(zhuǎn)到登錄頁面”,之后跳轉(zhuǎn)到 login.jsp 進行登錄
  • 輸入賬號:root,密碼:123456,由 LoginServlet 的 doGet() 方法處理,設(shè)置 Seesion: {user : root },輸出“登錄成功!”
  • 客戶端再次請求訪問 http://localhost:8080/servlettest/img/2.jpg,由過濾器 AdminFilter1 和 AdminFilter2 依次處理(調(diào)用 filterChain.doFilter 方法后可以對響應(yīng)結(jié)果進行處理),之后返回響應(yīng)結(jié)果給客戶端
  • 客戶端得到響應(yīng)結(jié)果,顯示圖片

到此這篇關(guān)于Tomcat中Filter過濾器的具體使用的文章就介紹到這了,更多相關(guān)Tomcat Filter過濾器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • Tomcat里catalina.sh的使用小結(jié)

    Tomcat里catalina.sh的使用小結(jié)

    在Tomcat中,catalina.sh或 catalina.bat是用于控制 Tomcat服務(wù)器的運行,負(fù)責(zé)設(shè)置環(huán)境變量、啟動/關(guān)閉 JVM 進程,并傳遞參數(shù)給 Tomcat 的核心組件,下面就來介紹一下如何使用
    2026-02-02
  • Tomcat端口僅允許本地訪問設(shè)置的兩種實現(xiàn)方法

    Tomcat端口僅允許本地訪問設(shè)置的兩種實現(xiàn)方法

    要設(shè)置Tomcat端口僅允許本地訪問,可以通過兩種主要方式實現(xiàn),下面通過配置文件結(jié)合相關(guān)實例給大家詳細講解,感興趣的朋友跟隨小編一起看看吧
    2025-05-05
  • 關(guān)于CVE-2020-1983:Tomcat?文件包含漏洞的問題

    關(guān)于CVE-2020-1983:Tomcat?文件包含漏洞的問題

    這篇文章主要介紹了CVE-2020-1983:Tomcat?文件包含漏洞,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • Tomcat+Mysql高并發(fā)配置優(yōu)化講解

    Tomcat+Mysql高并發(fā)配置優(yōu)化講解

    今天小編就為大家分享一篇關(guān)于Tomcat+Mysql高并發(fā)配置優(yōu)化講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • 修改Tomcat端口號的常見方法

    修改Tomcat端口號的常見方法

    這篇文章主要介紹了如何修改Tomcat端口號的方法,文中通過圖文結(jié)合介紹的非常詳細,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考,一起跟隨小編過來看看吧
    2023-10-10
  • tomcat如何去掉項目名稱直接訪問項目

    tomcat如何去掉項目名稱直接訪問項目

    這篇文章主要介紹了tomcat如何去掉項目名稱直接訪問項目問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Tomcat服務(wù)器的啟動及啟動失敗可能的原因分析

    Tomcat服務(wù)器的啟動及啟動失敗可能的原因分析

    這篇文章主要介紹了Tomcat服務(wù)器的啟動及啟動失敗可能的原因分析,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • tomcat加載jar異常問題的分析與解決

    tomcat加載jar異常問題的分析與解決

    這篇文章主要給大家介紹了關(guān)于tomcat加載jar異常問題的分析與解決方法,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用tomcat具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • tomcat7的配置文件server.xml解析

    tomcat7的配置文件server.xml解析

    本篇文章主要介紹了tomcat7的server.xml解析,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • GZIP壓縮Tomcat并提升web性能過程圖解

    GZIP壓縮Tomcat并提升web性能過程圖解

    這篇文章主要介紹了GZIP壓縮Tomcat并提升web性能過程圖解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04

最新評論

榆中县| 西吉县| 深泽县| 和静县| 仁布县| 新营市| 阿鲁科尔沁旗| 平阳县| 彝良县| 武川县| 江口县| 蕉岭县| 铜梁县| 陆丰市| 习水县| 望江县| 扬中市| 尚义县| 英德市| 鄂托克旗| 兰考县| 涿鹿县| 乐业县| 绍兴县| 高淳县| 黄梅县| 龙川县| 江永县| 朔州市| 河南省| 长治市| 集贤县| 偃师市| 磴口县| 京山县| 高安市| 景泰县| 常山县| 新兴县| 金乡县| 上高县|