JavaWeb-Filter過濾器

目錄

Filter過濾器

1. Filter的生命周期

2.Filter的配置

3.攔截路徑

4.攔截具體的使用

?5.攔截方式配置(資源被訪問方式)

6.FilterChain攔截鏈


Filter過濾器

????? filter是過濾器,相比于Servlet的發送請求,filter是用于攔截請求。比如在登陸系統中,正常登陸的用戶可以訪問服務器的相關資源,而如果登陸信息錯誤,則攔截想要訪問資源的請求。以下將具體介紹filter

1. Filter的生命周期

Filter的生命周期分為三部分,分別是init()初始化;doFilter()執行攔截;destroy()銷毀;

具體如下代碼

package com.company.Filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
//注解配置實現所有請求訪問都進行攔截
@WebFilter("/*")
public class filterDemo1 implements Filter {
//    初始化@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("加載的時候自動執行,并且只執行一次");}
//    執行攔截@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("實現攔截的時候執行函數,可以多次執行");}
//    銷毀@Overridepublic void destroy() {System.out.println("在服務器關閉的時候,執行銷毀函數");}
}

2.Filter的配置

Filter的配置分為兩種,一種是xml配置,一種是通過注解類配置

  • 通過xml配置(打開web.xml):
    <filter>
<!--        隨便創建想要的名稱--><filter-name>filterDemo1</filter-name>
<!--        filter對應的具體類--><filter-class>com.company.Filter.filterDemo1</filter-class></filter>
<!--    創建filter對應的映射--><filter-mapping>
<!--        filter對應的名稱--><filter-name>filterDemo1</filter-name>
<!--        攔截路徑,/*表示所有訪問都會進行攔截--><url-pattern>/*</url-pattern></filter-mapping>
  • 通過注解類進行配置:

@WebFilter(value=url-pattern)

如果只需要寫攔截規路徑可以省略掉value = ;

直接輸入@WebFilter("/*")實現對數據所有訪問時候進行攔截


3.攔截路徑

剛才介紹了/*是所有請求的攔截,但是對于具體訪問的請求的攔截還無法做到,下面介紹其他攔截路徑

  1. 具體路徑訪問的攔截:/index.jsp (當訪問index.jsp文件時候實現攔截)
  2. 某一個目錄的訪問的攔截:/user (當訪問user目錄以下的所有文件時候進行攔截)
  3. 后綴名訪問的攔截:*.jsp (實現對所有文件以.jsp后綴結尾訪問的攔截)
  4. 攔截所有相關路徑:/*???? (訪問所有服務器的資源時候都實現攔截)

4.攔截具體的使用

1.創建類實現Filter接口(注意Filter接口是包javax.servlet中的)

2.覆寫生命周期函數

3.通過doFilter函數實現攔截。當通過后實現放行

案例代碼:

攔截類

package com.company.Filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;//通過注解類實現攔截路徑
@WebFilter("/*")
//實現接口
public class filterDemo2 implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("過濾器已被加載");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("發現請求,實施攔截");進行驗證,如果通過則實現放行
//        System.out.println("驗證成功,放行");
//        filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {System.out.println("服務器關閉時候執行銷毀函數");}
}

模擬資源類

package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/FilterDemo3")
public class FilterDemo3 extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("訪問到資源啦");}
//    方法統一@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}
}

當通過url訪問資源類時候 可以看到請求被攔截了,無法執行資源類中輸出"訪問資源類啦"

再加上驗證功能后如果允許通過則需要放行,執行FilterChain filterChain中filterChain對象的doFilter(servletRequest對象, servletResponse對象)即代碼中的

//        攔截結束后如果通過則實現放行System.out.println("驗證成功,放行");filterChain.doFilter(servletRequest, servletResponse);

?此時再通過url訪問后,查看控制臺的信息可以看到:


?5.攔截方式配置(資源被訪問方式)

當然除了路徑訪問可以攔截以外,還可以設置攔截的方式,有些請求可以直接輸入url直接訪問類。有些通過一些網頁實現跳轉的方式獲取類的資源。還有就是通過請求轉發的形式獲取類。所以基于如此可以對這些方法做一些限制。

攔截方法描述
REQUEST(請求攔截)攔截直接通過 URL 訪問的請求。
FOWARD(轉發攔截)攔截通過請求轉發方式獲取資源的請求。
INCLUDE(包含攔截)攔截通過網頁跳轉方式獲取資源的請求。
ERROR(錯誤攔截)攔截發生錯誤或異常情況的請求。
ASYNC(異步攔截)攔截異步請求,即延遲加載的請求,可以防止對響應進行預先緩存和使用。

默認情況下是通過REQUEST實現攔截

具體使用還需要看開始時候使用的配置

  • 通過xml配置
   <filter><filter-name>filterDemo1</filter-name><filter-class>com.company.Filter.filterDemo1</filter-class></filter><filter-mapping><filter-name>filterDemo1</filter-name><url-pattern>/*</url-pattern>
<!--        配置請求攔截方法--><dispatcher>REQUEST</dispatcher></filter-mapping>
  • 通過注解類配置


6.FilterChain攔截鏈

攔截鏈,顧名思義就是由多個過濾器組成,就像是一條路設置了多個收費站一樣。只有滿足所有的攔截規則后才能通過。

設置多個攔截器(其中一個的代碼)

package com.company.Filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;@WebFilter("/*")
public class filterDemo3 implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("攔截器1進行攔截");System.out.println("攔截器1放行");
//        攔截器放行filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {}
}

通過url訪問時候結果如下

?攔截器的順序

一.注解配置

是通過攔截器名字的排序比如01、02、03,先比較第一個數字大小,如果相同就比較第二個數字大小以此類推

二.xml配置

只需要配置xml時候由上往下即可


?

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

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

相關文章

2023-08-14 linux 串口終端輸入長命令不換行,覆蓋前面內容,stty命令設置串口終端行列數

一、linux 串口終端輸入長命令不換行&#xff0c;覆蓋前面內容&#xff0c;現象如下圖&#xff1a; 二、解決方法&#xff1a;用stty 命令設置行列數 stty columns 200 stty rows 10三、參考文章 https://www.cnblogs.com/goloving/p/15170537.html 常用Linux串口設備操作命…

【Servlet】(Servlet API HttpServlet 處理請求 HttpServletRequest 打印請求信息 前端給后端傳參)

文章目錄 Servlet APIHttpServlet處理請求 HttpServletRequest打印請求信息前端給后端傳參 Servlet API Servlet中常用的API HttpServlet 實際開發的時候主要重寫 doXXX 方法, 很少會重寫 init / destory / service destory 服務器終止的時候會調用. //下面的注解把當前類和…

gin的占位符:和通配符*

1、用法 在 Gin 路由中&#xff0c;可以使用一個通配符&#xff08;*&#xff09;或一個占位符&#xff08;:&#xff09;來捕獲 URL 的一部分。 r.GET("/royal/:id", func(c *gin.Context) {id : c.Param("id")//fmt.Println("into :id")c.Str…

成都到長沙自駕游路線推薦-成都至長沙自駕游攻略

請問成都到長沙自駕怎么走&#xff0c;中途在哪里休息比較合適&#xff0c;沿途有哪些景點&#xff1f; 在湖南湘西的吉首落腳是首選 一&#xff0c;成都到吉首 約在800公里。全程高速估計就是 9個小時左右。如果上午出發&#xff0c;差不多可以到吉首吃晚餐&#xff0c;再住酒…

ef core 分頁

在使用 Entity Framework Core&#xff08;EF Core&#xff09;進行分頁查詢時&#xff0c;你可以借助以下方法來實現&#xff1a; 使用 Skip 和 Take 方法&#xff1a;Skip 方法用于跳過指定數量的記錄&#xff0c;而 Take 方法用于選擇指定數量的記錄。結合使用這兩個方法&am…

HBase API

我們之后的實際開發中不可能在服務器那邊直接使用shell命令一直敲的&#xff0c;一般都是通過API進行操作的。 環境準備 新建Maven項目&#xff0c;導入Maven依賴 <dependencies><dependency><groupId>org.apache.hbase</groupId><artifactId>…

命令執行漏洞

1、命令執行漏洞 1.1、簡介 Django是用Python開發的一個免費開源的Web結構&#xff0c;幾乎包括了Web使用方方面面&#xff0c;能夠用于快速建立高性能、文雅的網站&#xff0c;Diango提供了許多網站后臺開發常常用到的模塊&#xff0c;使開發者可以專注于業務部分。 1.2、漏…

【Terraform學習】管理顯式依賴關系-depends_on(Terraform配置語言學習)

背景&#xff1a; 關于如何在機器上拉terraform代碼&#xff0c;初始化就不重復了&#xff0c;需要的可以查看前面的文章&#xff1a; 【Terraform學習】Terraform-AWS部署快速入門&#xff08;快速入門&#xff09;_向往風的男子的博客-CSDN博客 管理顯式依賴關系 隱式依賴…

【刪除vlan的方法】

提示錯誤 [SW1]undo vlan 10 Error: The VLAN has a L3 interface. Please delete it first. 解決辦法 undo interface Vlanif10 #刪除vlan 10下的接口 [SW1-GigabitEthernet0/0/1]dis this #刪除下列的IP

接口自動化必備技能——jmeter提取token方式以及設置成全局變量(跨線程組傳token值)方式

前言 今天Darren洋教大家如何使用jmeter中的插件來進行token值的提取與調用&#xff0c;今天Darren洋介紹兩種jmeter提取token值的方式&#xff0c;一種是在當前線程組中直接提取token值&#xff0c;一種是跨線程組的方式進行token值的提取并調用給不同線程組里的HTTP接口使用。…

如何讀取文件夾內的諸多文件,并選擇性的保留部分文件

目錄 問題描述: 問題解決: 問題描述: 當前有一個二級文件夾,第一層是文件夾名稱是“Papers(LNAI14302-14304)",第二級文件夾目錄名稱如下圖藍色部分所示。第三層為存放的文件,如下下圖所示,每一個文件中,均存放三個文件,分別為copyright.pdf, submission.pdf, s…

【PYTHON】WebSocket服務端與客戶端通信實現

目錄 1 簡介 2 WebSocket優點 3 前后端交互的方式 4 心跳機制和重連機制 5 后端代碼 6 測試

重磅發布!曙光存儲“3+N”,綠色存力新選擇

8月9-10日&#xff0c;2023年數據中心市場年會在京舉辦。會上&#xff0c;中科曙光存儲產品事業部總監石靜發表《綠色存力 打通綠色數據中心最后一站》主題演講。“在今天&#xff0c;數據中心正在成為‘高能耗’產業&#xff0c;綠色節能從可選項走向必選項。曙光存儲跨越綠色…

管理 IBM Spectrum LSF

管理 IBM Spectrum LSF 了解如何管理 IBM Spectrum LSF 集群&#xff0c;控制守護程序&#xff0c;更改集群配置以及使用主機和隊列。 管理 LSF 作業和作業調度策略。 查看作業信息和控制作業。 了解如何配置資源并將其分配給 LSF 作業。 了解如何在 LSF 集群中提交&#xff0…

開發測試框架一 - 創建springboot工程及基礎操作

一、創建及運行方式 1. 從官網導入&#xff1a; 注意&#xff1a;由于我的java版本是1.8&#xff1b;所以選中了spring2.7.14&#xff1b;如果你的java版本是9及以上&#xff0c;選中spring3相關的同時Java 版本也要對應起來 2. 創建第一個get請求 創建Controller package及…

mysql滑動窗口案例

獲取學科最高分 SELECT DISTINCT name,subject,MAX(score) OVER (PARTITION by subject) as 此學科最高分數 from scores;獲取學科的報名人數 select DISTINCT subject,count(name) over (partition by subject) as 報名此學科的人數 from scores; 求學科總分 SELECT DISTI…

JavaScript高級:常見設計模式

設計模式是在軟件開發中重復出現的問題的解決方案&#xff0c;它們是經過驗證的、被廣泛接受的最佳實踐。設計模式可以讓我們避免重復造輪子&#xff0c;提高代碼質量和可維護性。在本文中&#xff0c;我們將介紹幾種常見的設計模式&#xff0c;以及它們的實現和應用。 1. 單例…

Conda(Python管理工具)

1.簡介 Conda是一個開源的包管理器和環境管理器&#xff0c;主要用于管理Python&#xff0c;但也可以用于其他語言。它主要用于安裝、管理和更新軟件包及其依賴項&#xff0c;以及創建、保存、加載和切換不同的開發環境。Conda可以在Windows、MacOS和Linux系統上使用&#xff…

Spring Boot + Vue3前后端分離實戰wiki知識庫系統十二--用戶管理單點登錄開發一...

目標&#xff1a; 在上一次https://www.cnblogs.com/webor2006/p/17533745.html我們已經完成了文檔管理的功能模塊開發&#xff0c;接下來則開啟新模塊的學習---用戶登錄&#xff0c;這塊還是有不少知識點值得學習的&#xff0c;先來看一下整體的效果&#xff0c;關于效果官網有…

2023全國大學生數學建模競賽C提思路模型代碼

目錄 1.C題思路模型&#xff1a;比賽開始后&#xff0c;第一時間更新&#xff0c;獲取見文末名片 2.比賽時間&#xff1a;2023年9月7日18點到2023年9月10日20點 3 全國大學生數學建模競賽常見數模問題 3.1 分類問題 3.2 優化問題 詳細思路見此名片&#xff0c;開賽第一時間…