Javaweb11-Filter過濾器

Filter過濾器

1.Filter的基本概念:

在Java Servlet中,Filter接口是用來處理HttpServletRequest和HttpServletResponse的對象的過濾器。主要用途是在請求到達Servlet之前或者響應離開Servlet之前對請求或響應進行預處理或后處理。

image-20240711150656881

2.Filter常見的API

  • Filter接口
方法聲明功能描述
void init(FilterConfig config)init( )方法是 Filter 的初始化方法,創建 Filter 實例后將調用 init( )方法。該方法的參數filterConfig 用于讀取 Filter 的初始化參數(只執行一次)
void doFilter (ServletRequest req,ServletResponse resp,FilterChain cahin)doFilter()方法用于完成實際的過濾操作,當客戶的請求滿足過濾規則時,Servlet容器將調用過濾器的 doFiter()方法完成實際的過濾操作。doFilter( )方法有多個參數,其中,參數request和response為Web 服務器或 Filter 鏈中的上一個 Filter 傳遞過來的請求和響應對象;參數 chain 代表當前 Filter 鏈的對象
void destroy()該方法用于釋放被 Filter 對象打開的資源,例如關閉數據庫和IO 流。destroy( )方法在Web 服務器釋放 Filter 對象之前被調
  • FilterConfig接口

用于封裝Filter的配置信息

image-20240711151637969

  • FilterChain接口
FilterChain接口中的doFilter(ServletRequest req,ServletResponse resp)方法用來調用Filter鏈中下一個過濾器,如果沒有過濾器調用下一個處理程序

3.Filter生命周期

init():在服務器啟動之后,會創建Filter對象,調用init方法,加載配置
doFilter():每一次請求被攔截資源時會執行,執行多次
destroy():在服務器關閉后,Filter對象會被銷毀,通過調用一次destroy銷毀

4.Filter的配置

實現過濾器

  • @WebFilter注解

image-20240711154056819

注意:urlPatterns和value中是要過濾的url

攔截路徑

1.具體資源路徑:/index.jsp
2.攔截目錄:/book/*
3.后綴名攔截:*.jsp
4.攔截所有資源:/*

攔截不同方式的請求

@WebFiler 注解有一個特殊的屬性 dispatcherTypes,它可以指定過濾器的轉發模式。dispatcherTypes屬性有4個常用值,具體如下

(1)REQUEST
過濾器設置 dispatcherTypes 屬性值為 REQUEST 時,如果用戶通過 RequestDispatcher 對象的 include()方法或forward()方法訪問目標資源,那么過濾器不會被調用。除此之外,該過濾器會被調用。
(2)INCLUDE
過濾器設置 dispatcherTypes 屬性值為 INCLUDE 時,如果用戶通過 RequestDispatcher 對象的 include()方法訪問目標資源,那么過濾器將被調用。除此之外,該過濾器不會被調用。
(3)FORWARD
過濾器設置 dispatcherTypes 屬性值為 FORWARD,如果通過 RequestDispatcher 對象的 forward()方法訪問目標資源,那么過濾器將被調用。除此之外,該過濾器不會被調用。
(4)ERROR
過濾器設置 dispatcherTypes 屬性值為 ERROR 時,如果通過聲明式異常處理機制調用目標資源,那么過濾器將被調用。除此之外,過濾器不會被調用。
  • 在web.xml中配置
<filter><filter-name>filter01</filter-name><filter-class>com.tyut.controller.FilterText01</filter-class>
</filter><filter-mapping><filter-name>filter01</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

5.過濾器鏈

  • 執行順序

如果有兩個過濾器:過濾器1和過濾器2,執行順序應為

過濾器1 -> 過濾器2 -> 資源執行 -> 過濾器2 -> 過濾器1
  • 過濾器先后順序
1.注解配置:按照過濾器名字(filterName)的字符串比較規則比較,值小的先執行(ps:filter01比filter02先執行)
2.web.xml配置:<filter-mapping></filter-mapping>誰定義在上邊,誰先執行

6.案例一:實現登錄驗證

實現了一個簡單的登錄過濾器,用于攔截所有請求并檢查用戶是否已登錄。如果用戶未登錄,則會將請求重定向到登錄頁面;如果用戶已登錄,則允許訪問其他頁面或資源。這種過濾器在Web應用中常用于確保特定頁面或功能只能被授權的用戶訪問,提高系統的安全性和用戶體驗。

package com.tyut;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;@WebFilter({"/*"})
public class LoginFilter implements Filter {public void init(FilterConfig config) throws ServletException {}public void destroy() {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {//1.將request轉換HttpServletRequestHttpServletRequest req = (HttpServletRequest) request;HttpServletResponse resp = (HttpServletResponse) response;//2.判斷是否是有關登錄的信息String requestURI = req.getRequestURI();//如果是有關登錄的頁面,可以訪問if (requestURI.contains("/login.jsp") || requestURI.contains("/LoginServlet") || requestURI.contains("/login.css")) {chain.doFilter(req, resp);} else {//必須登錄以后才可以訪問到其他頁面//3.判斷用戶是否存在HttpSession session = req.getSession();if (session.getAttribute("user") != null) {//用戶存在chain.doFilter(request, response);//放行} else {req.getRequestDispatcher("/login.jsp").forward(req, resp);}}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/44222.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/44222.shtml
英文地址,請注明出處:http://en.pswp.cn/web/44222.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

探展2024世界人工智能大會之合合信息掃描黑科技~

文章目錄 ?? 前言?? AIGC古籍修復文化遺產煥新?? 高效的文檔圖像處理解決方案?? AIGC掃描黑科技一鍵全搞定?? 行業級的大模型加速器?? 結語 ?? 前言 大家好&#xff0c;我是 哈哥&#xff08;哈哥撩編程&#xff09; &#xff0c;這次非常榮幸受邀作為專業觀眾參…

【常用知識點-Java】讀取Properties文件

Author&#xff1a;趙志乾 Date&#xff1a;2024-07-11 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 簡介 .properties文件是一種簡單的文本文件&#xff0c;用于存儲鍵值對&#xff0c;其每個鍵值對占一行&#xff0c;且鍵和值之間用…

力扣題解( 最長遞增子序列的個數)

673. 最長遞增子序列的個數 給定一個未排序的整數數組 nums &#xff0c; 返回最長遞增子序列的個數 。 注意 這個數列必須是 嚴格 遞增的。 思路&#xff1a; 用一個maxlen表示當前最長遞增數組的長度&#xff0c;maxcount表示最大長度。當進下標為i的元素時&#xff0c;將…

重磅!新公司法正式實施,這些變化你必須知道! ?

新公司法來了&#xff01;企業設立和經營必知的關鍵變動 &#x1f3db;?&#x1f680; 大家好&#xff0c;我是貓頭虎&#xff0c;科技自媒體博主。今天我們來聊聊一件大事——新公司法的實施&#xff0c;這對企業設立和經營帶來了哪些重大影響&#xff1f;跟著我&#xff0c…

【DDIM】DENOISING DIFFUSION IMPLICIT MODELS【論文精讀】【視頻講解】【公式推導】

論文&#xff1a;DENOISING DIFFUSION IMPLICIT MODELS&#xff08;https://arxiv.org/abs/2010.02502&#xff09; B站視頻鏈接 DDIM論文精講視頻 去噪擴散隱模型的論文精讀&#xff0c;涉及本文的大部分公式逐步推導。總計3小時的詳細論文講解。 講解詳細對應文檔 DDIM視頻…

聊聊mysql

記錄那些坑 本文會持續更新&#xff0c;陸續更新有關mysql技術內幕、實戰優化、面試技巧。 文章目錄 前言索引BTree之聚集索引BTree之輔助索引BTree之聯合索引BTree之覆蓋索引 使用到的工具1、py_innodb_page_info工具2、hexdump工具 總結 前言 重中之重的MySql數據庫 mysql…

模擬人機猜數游戲

設計目的 1、加深學生對該課程基礎知識和基本理論的理解和掌握&#xff0c;培養學生綜合運用所學知識獨立 分析和解決問題的能力; 2、培養學生在計算機軟硬件開發、理論計算、查閱資料等方面的能力&#xff0c;使學生逐步樹立正 確的設計思想; 3、加強理論聯系實際&#xff0c…

邦芒支招:職場高效溝通的6個秘訣

??俗話說得好“良言一句三冬暖&#xff0c;惡語傷人六月寒。”無論在什么單位&#xff0c;社會上竟是形形色色的人等&#xff0c;人過一百&#xff0c;形形色色。每個人都想得到他人賞識、揮灑才華、爭得提升。但是&#xff0c;要和陌生的人融洽相處、溝通合作&#xff0c;是…

Android 藍牙語音通話調試

首先要清楚藍牙語音通話屬于藍牙得哪一個協議 1、HEADSET 耳機和免提模式,用于藍牙耳機 2、A2DP (advanced audio distribution profile)高級音頻及立體聲規范,包括A2DP SINK和A2DP SOURCE 3、HEALTH 健康設備規范,和一些健康設備進行通信 4、OPP (object push profi…

概率論期末速成(知識點+例題)

考試范圍 一&#xff1a; 事件關系運算性質全概率公式、貝葉斯公式古典概型 二&#xff1a; 離散分布律連續密度函數性質 -> 解決三個問題&#xff08;求待定系數、求概率、求密度函數&#xff09;分布函數 -> 解決三個問題常用分布&#xff08;最后一節課的那幾個分…

手電筒的光能飛到宇宙盡頭嗎

如果我們打開手電筒向夜空照一秒再關掉&#xff0c;我們將會看到&#xff0c;在關掉手電筒的一瞬間&#xff0c;手電筒發出的光束也會消失&#xff0c;那么&#xff0c;它發出的光哪去了呢&#xff1f;下面我們就來聊一下這個話題。實際上&#xff0c;我們看到的光束&#xff0…

Spark SQL 概述

Spark SQL 概述 Spark SQL 是 Apache Spark 的一個模塊&#xff0c;專門用于處理結構化數據。它集成了 SQL 查詢和 Spark 編程的強大功能&#xff0c;使得處理大數據變得更加高效和簡便。通過 Spark SQL&#xff0c;用戶可以直接在 Spark 中使用 SQL 查詢&#xff0c;或者使用 …

ubuntu16.04安裝低版本cmake(安裝cmake安裝)

文章目錄 ubuntu16.04安裝低版本cmake&#xff08;安裝cmake安裝&#xff09;1. **下載并解壓CMake壓縮文件**&#xff1a;- 首先&#xff0c;你需要從CMake的官方網站或其他可靠來源下載cmake-2.8.9-Linux-i386.tar.gz文件。- 然后在終端中使用以下命令解壓文件&#xff1a; 2…

BFS:多源BFS問題

一、多源BFS簡介 超級源點&#xff1a;其實就是把相應的原點一次性都丟到隊列中 二、01矩陣 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:const int dx[4]{1,-1,0,0};const int dy[4]{0,0,1,-1};vector<vector<int>> updateMatrix(vector…

Makefile--自動識別編譯環境(x86還是arm)進行編譯

在日常工作中&#xff0c;我們會在虛擬機下的x86系統進行架叉編譯&#xff0c;有時需要在arm上直接進行編譯。但工程都是一樣的&#xff0c;只是Makefile不一樣&#xff0c;這時就涉及到Makefile的靈活運用了。以下是一個自動識別編譯環境的通用Makefile&#xff1a; TARGET_A…

headerpwn:一款針對服務器響應與HTTP Header的模糊測試工具

關于headerpwn headerpwn是一款針對服務器響應與HTTP Header的模糊測試工具&#xff0c;廣大研究人員可以利用該工具查找網絡異常并分析服務器是如何響應不同HTTP Header的。 功能介紹 當前版本的headerpwn支持下列功能&#xff1a; 1、服務器安全與異常檢測&#xff1b; 2、…

PyTorch 1-深度學習

深度學習-PyTorch 一: Pytorch1> pytorch簡介2> PyTorch 特點&優勢3> pytorch簡史4> pytorch 庫5> PyTorch執行流程6> PyTorch 層次結構二: PyTorch常用的高級API和函數1> 自動求導(Autograd)2> 模型容器(Module)3> 優化器(Optimizer)4&g…

Java Stream API詳解:高效處理集合數據的利器

引言 Java 8引入了許多新特性&#xff0c;其中最為顯著的莫過于Lambda表達式和Stream API。Stream API提供了一種高效、簡潔的方法來處理集合數據&#xff0c;使代碼更加簡潔明了&#xff0c;且具有較高的可讀性和可維護性。本文將深入探討Java Stream API的使用&#xff0c;包…

QFileDialog的簡單了解

ps&#xff1a;寫了點垃圾&#xff08;哈哈哈&#xff09; 它繼承自QDialog 這是Windows自己的文件夾 這是兩者的對比圖&#xff1a; 通過看QFileDialog的源碼&#xff0c;來分析它是怎么實現這樣的效果的。 源碼組成&#xff1a; qfiledialog.h qfiledialog_p.h&#xff…

Python面試寶典第11題:最長連續序列

題目 給定一個未排序的整數數組 nums &#xff0c;找出數字連續的最長序列&#xff08;不要求序列元素在原數組中連續&#xff09;的長度。請你設計并實現時間復雜度為 O(n) 的算法解決此問題。 示例 1&#xff1a; 輸入&#xff1a;nums [100,4,200,1,3,2] 輸出&#xff1a;…