過濾器java,過濾器濾芯

本文目錄一覽:

java web 過濾器跟攔截器的區別和使用

過濾器(filter):就是對請求起到過濾的作用,它在監聽器之後,作用在servlet之前,對請求進行過濾。

攔截器(interceptor):就是對請求和返回進行攔截,它作用在servlet的內部,具體來說有三個地方:servlet_1和servlet_2之間,即請求還沒有到controller層。servlet_2和servlet_3之間,即請求走出controller層次,還沒有到渲染時圖層。servlet_3和servlet_4之間,即結束視圖渲染,但是還沒有到servlet的結束。

它們之間的關係,可以用一張圖來表示:

Java Web,是用Java技術來解決相關web互聯網領域的技術總和。

web包括:web服務器和web客戶端兩部分。Java在客戶端的應用有java applet不過現在使用的很少,Java在服務器端的應用非常的豐富,比如Servlet,JSP和第三方框架等等。

Java技術對Web領域的發展注入了強大的動力。

什麼是java過濾器! 它的功能和作用是什麼啊?

Servlet API 很久以前就已成為企業應用開發的基石,而 Servlet 過濾器則是對 J2EE 家族的相對較新的補充。在 J2EE 探索者 系列文章的最後一篇中,作者 Kyle Gabhart 將向您介紹 Servlet 過濾器體系結構,定義過濾器的許多應用,並指導您完成典型過濾器實現的三個步驟。他還會透露 bean 的一些激動人心的變化,預計剛發布的 Java Servlet 2.4 規範會引入這些變化。

Servlet 過濾器是可插入的 Web 組件,它允許我們實現 Web 應用程序中的預處理和後期處理邏輯。過濾器支持 servlet 和 JSP 頁面的基本請求處理功能,比如日誌記錄、性能、安全、會話處理、XSLT 轉換,等等。 過濾器最初是隨 Java Servlet 2.3 規範發布的,最近定稿的 2.4 規範對它進行了重大升級。在這 J2EE 探索者 系列文章的最後一篇中,我將向您介紹 Servlet 過濾器的基礎知識 —— 比如總體的體系結構設計、實現細節,以及在 J2EE Web 應用程序中的典型應用,還會涉及一些預計最新的 Servlet 規範將會提供的擴展功能。

Servlet 過濾器是什麼?

Servlet 過濾器是小型的 Web 組件,它們攔截請求和響應,以便查看、提取或以某種方式操作正在客戶機和服務器之間交換的數據。過濾器是通常封裝了一些功能的 Web 組件,這些功能雖然很重要,但是對於處理客戶機請求或發送響應來說不是決定性的。典型的例子包括記錄關於請求和響應的數據、處理安全協議、管理會話屬性, 等等。過濾器提供一種面向對象的模塊化機制,用以將公共任務封裝到可插入的組件中,這些組件通過一個配置文件來聲明,並動態地處理。

Servlet 過濾器中結合了許多元素,從而使得過濾器成為獨特、強大和模塊化的 Web 組件。也就是說,Servlet 過濾器是:

聲明式的:過濾器通過 Web 部署描述符(web.xml)中的 XML 標籤來聲明。這樣允許添加和刪除過濾器,而無需改動任何應用程序代碼或 JSP 頁面。

動態的:過濾器在運行時由 Servlet 容器調用來攔截和處理請求和響應。

靈活的:過濾器在 Web 處理環境中的應用很廣泛,涵蓋諸如日誌記錄和安全等許多最公共的輔助任務。過濾器還是靈活的,因為它們可用於對來自客戶機的直接調用執行預處理和後期處 理,以及處理在防火牆之後的 Web 組件之間調度的請求。最後,可以將過濾器鏈接起來以提供必需的功能。

模塊化的:通過把應用程序處理邏輯封裝到單個類文件中,過濾器從而定義了可容易地從請求/響應鏈中添加或刪除的模塊化單元。

可移植的:與 Java 平台的其他許多方面一樣,Servlet 過濾器是跨平台和跨容器可移植的,從而進一步支持了 Servler 過濾器的模塊化和可重用本質。

可重用的:歸功於過濾器實現類的模塊化設計,以及聲明式的過濾器配置方式,過濾器可以容易地跨越不同的項目和應用程序使用。

透明的:在請求/響應鏈中包括過濾器,這種設計是為了補充(而不是以任何方式替代)servlet 或 JSP 頁面提供的核心處理。因而,過濾器可以根據需要添加或刪除,而不會破壞 servlet 或 JSP 頁面。

所以 Servlet 過濾器是通過一個配置文件來靈活聲明的模塊化可重用組件。過濾器動態地處理傳入的請求和傳出的響應,並且無需修改應用程序代碼就可以透明地添加或刪除它 們。最後,過濾器獨立於任何平台或者 Servlet 容器,從而允許將它們容易地部署到任何相容的 J2EE 環境中。

在接下來的幾小節中,我們將進一步考察 Servlet 過濾器機制的總體設計,以及實現、配置和部署過濾器所涉及的步驟。我們還將探討 Servlet 過濾器的一些實際應用,最後簡要考察一下模型-視圖-控制器(MVC)體系結構中包含的 Servlet 過濾器,從而結束本文的討論。

Servlet 過濾器體系結構

正如其名稱所暗示的,Servlet 過濾器 用於攔截傳入的請求和/或傳出的響應,並監視、修改或以某種方式處理正在通過的數據流。過濾器是自包含、模塊化的組件,可以將它們添加到請求/響應鏈中, 或者在無需影響應用程序中其他 Web 組件的情況下刪除它們。過濾器僅只是改動請求和響應的運行時處理,因而不應該將它們直接嵌入 Web 應用程序框架,除非是通過 Servlet API 中良好定義的標準接口來實現。

Web 資源可以配置為沒有過濾器與之關聯(這是默認情況)、與單個過濾器關聯(這是典型情況),甚至是與一個過濾器鏈相關聯。那麼過濾器究竟做什麼呢? 像 servlet 一樣,它接受請求並響應對象。然後過濾器會檢查請求對象,並決定將該請求轉發給鏈中的下一個組件,或者中止該請求並直接向客戶機發回一個響應。如果請求被 轉發了,它將被傳遞給鏈中的下一個資源(另一個過濾器、servlet 或 JSP 頁面)。在這個請求設法通過過濾器鏈並被服務器處理之後,一個響應將以相反的順序通過該鏈發送回去。這樣就給每個過濾器都提供了根據需要處理響應對象的機 會。

當過濾器在 Servlet 2.3 規範中首次引入時,它們只能過濾 Web 客戶機和客戶機所訪問的指定 Web 資源之間的內容。如果該資源然後將請求調度給其他 Web 資源,那就不能向幕後委託的任何請求應用過濾器。2.4 規範消除了這個限制。Servlet 過濾器現在可以應用於 J2EE Web 環境中存在請求和響應對象的任何地方。因此,Servlet 過濾器可以應用在客戶機和 servlet 之間、servlet 和 servlet 或 JSP 頁面之間,以及所包括的每個 JSP 頁面之間。這才是我所稱的強大能力和靈活性!

實現一個 Servlet 過濾器

他們說“好事多磨”。我不知道“他們”指的是誰,或者這句古老的諺語究竟有多真實,但是實現一個 Servlet 過濾器的確要經歷三個步驟。首先要編寫過濾器實現類的程序,然後要把該過濾器添加到 Web 應用程序中(通過在 Web 部署描述符 /web.xml 中聲明它),最後要把過濾器與應用程序一起打包並部署它。我們將詳細研究這其中的每個步驟。

1. 編寫實現類的程序

過濾器 API 包含 3 個簡單的接口(又是數字 3!),它們整潔地嵌套在 javax.servlet 包中。那 3 個接口分別是 Filter、FilterChain 和 FilterConfig。從編程的角度看,過濾器類將實現 Filter 接口,然後使用這個過濾器類中的 FilterChain 和 FilterConfig 接口。該過濾器類的一個引用將傳遞給 FilterChain 對象,以允許過濾器把控制權傳遞給鏈中的下一個資源。FilterConfig 對象將由容器提供給過濾器,以允許訪問該過濾器的初始化數據。

為了與我們的三步模式保持一致,過濾器必須運用三個方法,以便完全實現 Filter 接口:

init():這個方法在容器實例化過濾器時被調用,它主要設計用於使過濾器為處理做準備。該方法接受一個 FilterConfig 類型的對象作為輸入。

doFilter():與 servlet 擁有一個 service() 方法(這個方法又調用 doPost() 或者 doGet())來處理請求一樣,過濾器擁有單個用於處理請求和響應的方法——doFilter()。這個方法接受三個輸入參數:一個 ServletRequest、response 和一個 FilterChain 對象。

destroy():正如您想像的那樣,這個方法執行任何清理操作,這些操作可能需要在自動垃圾收集之前進行。展示了一個非常簡單的過濾器,它跟蹤滿足一個客戶機的 Web 請求所花的大致時間。

一個過濾器類實現

import javax.servlet.*;

import java.util.*;

import java.io.*;

public class TimeTrackFilter implements Filter {

private FilterConfig filterConfig = null;

public void init(FilterConfig filterConfig)

throws ServletException {

this.filterConfig = filterConfig;

}

public void destroy() {

this.filterConfig = null;

}

public void doFilter( ServletRequest request,

ServletResponse response, FilterChain chain )

throws IOException, ServletException {

Date startTime, endTime;

double totalTime;

startTime = new Date();

// Forward the request to the next resource in the chain

chain.doFilter(request, wrapper);

// — Process the response — \\

// Calculate the difference between the start time and end time

endTime = new Date();

totalTime = endTime.getTime() – startTime.getTime();

totalTime = totalTime / 1000; //Convert from milliseconds to seconds

StringWriter sw = new StringWriter();

PrintWriter writer = new PrintWriter(sw);

writer.println();

writer.println(“===============”);

writer.println(“Total elapsed time is: ” + totalTime + ” seconds.” );

writer.println(“===============”);

// Log the resulting string

writer.flush();

filterConfig.getServletContext().

log(sw.getBuffer().toString());

}

}

複製代碼

這個過濾器的生命周期很簡單,不管怎樣,我們還是研究一下它吧:

初始化

當容器第一次加載該過濾器時,init() 方法將被調用。該類在這個方法中包含了一個指向 FilterConfig 對象的引用。我們的過濾器實際上並不需要這樣做,因為其中沒有使用初始化信息,這裡只是出於演示的目的。

過濾

過濾器的大多數時間都消耗在這裡。doFilter() 方法被容器調用,同時傳入分別指向這個請求/響應鏈中的 ServletRequest、ServletResponse 和 FilterChain 對象的引用。然後過濾器就有機會處理請求,將處理任務傳遞給鏈中的下一個資源(通過調用 FilterChain 對象引用上的 doFilter()方法),之後在處理控制權返回該過濾器時處理響應。

析構

容器緊跟在垃圾收集之前調用 destroy() 方法,以便能夠執行任何必需的清理代碼。

2. 配置 Servlet 過濾器

過濾器通過 web.xml 文件中的兩個 XML 標籤來聲明。filter 標籤定義過濾器的名稱,並且聲明實現類和 init() 參數。filter-mapping 標籤將過濾器與 servlet 或 URL 模式相關聯。

摘自一個 web.xml 文件,它展示了如何聲明過濾器的包含關係:

在 web.xml 中聲明一個過濾器

filter

filter-namePage Request Timer/filter-name

filter-classTimeTrackFilter/filter-class

/filter

filter-mapping

filter-namePage Request Timer/filter-name

servlet-nameMain Servlet/servlet-name

/filter-mapping

servlet

servlet-nameMain Servlet/servlet-name

servlet-classMainServlet/servlet-class

/servlet

servlet-mapping

servlet-nameMain Servlet/servlet-name

url-pattern/*/url-pattern

/servlet-mapping

複製代碼

上 面的代碼示例聲明了一個過濾器(”Page Request Timer”),並把它映射到一個 servlet(”Main Servlet”)。然後為該 servlet 定義了一個映射,以便把每個請求(由通配符指定)都發送到該 servlet。這是控制器組件的典型映射聲明。您應該注意這些聲明的順序,因為千萬不能背離這些元素的順序。

3. 部署 Servlet 過濾器

事實上,與 Web 應用程序一起部署過濾器絕對不涉及任何複雜性。只需把過濾器類和其他 Web 組件類包括在一起,並像您通常所做的那樣把 web.xml 文件(連同過濾器定義和過濾器映射聲明)放進 Web 應用程序結構中,servlet 容器將處理之後的其他所有事情。

過濾器的許多應用

您在 J2EE Web 應用程序中利用過濾器的能力,僅受到您自己的創造性和應用程序設計本領的限制。在適合使用裝飾過濾器模式或者攔截器模式的任何地方,您都可以使用過濾器。過濾器的一些最普遍的應用如下:

加載:對於到達系統的所有請求,過濾器收集諸如瀏覽器類型、一天中的時間、轉發 URL 等相關信息,並對它們進行日誌記錄。

性能:過濾器在內容通過線路傳來並在到達 servlet 和 JSP 頁面之前解壓縮該內容,然後再取得響應內容,並在將響應內容發送到客戶機機器之前將它轉換為壓縮格式。

安全:過濾器處理身份驗證令牌的管理,並適當地限制安全資源的訪問,提示用戶進行身份驗證和/或將他們指引到第三方進行身份驗證。過濾器甚至能夠管理訪問 控制列表(Access Control List,ACL),以便除了身份驗證之外還提供授權機制。將安全邏輯放在過濾器中,而不是放在 servlet 或者 JSP 頁面中,這樣提供了巨大的靈活性。在開發期間,過濾器可以關閉(在 web.xml 文件中注釋掉)。在生產應用中,過濾器又可以再次啟用。此外還可以添加多個過濾器,以便根據需要提高安全、加密和不可拒絕的服務的等級。

會話處理:將 servlet 和 JSP 頁面與會話處理代碼混雜在一起可能會帶來相當大的麻煩。使用過濾器來管理會話可以讓 Web 頁面集中精力考慮內容顯示和委託處理,而不必擔心會話管理的細節。

XSLT 轉換:不管是使用移動客戶端還是使用基於 XML 的 Web 服務,無需把邏輯嵌入應用程序就在 XML 語法之間執行轉換的能力都絕對是無價的。

使過濾器適應 MVC 體系結構

模型-視圖-控制器(Model-View-Controller,MVC)體系結構是一個有效的設計,它現在已作為最重要的設計方法學,整合到了諸如 Jakarta Struts 和 Turbine 等大多數流行的 Web 應用框架中。過濾器旨在擴充 MVC 體系結構的請求/響應處理流。不管請求/響應發生在客戶機和服務器之間,還是發生在服務器上的其他組件之間,過濾器在處理流中的應用都是相同的。從 MVC 的觀點看,調度器組件(它或者包括在控制器組件中,或者配合控制器組件工作)把請求轉發給適當的應用程序組件以進行處理。這使得控制器層成為包括 Servlet 過濾器的最佳位置。通過把過濾器放在控制器組件本身的前面,過濾器可以應用於所有請求,或者通過將它放在控制器/調度器與模型和控制器之間,它可以應用於 單獨的 Web 組件。

MVC 體系結構廣為傳播,並具有良好的文檔。請通過 參考資料 中的鏈接了解關於 MVC 和 MVC 體系結構中的 Servlet 實現的更多信息。

結束語

雖然過濾器才出現幾年時間,但它們本身已作為一個關鍵組件嵌入到了所有敏捷的、面向對象的 J2EE Web 應用程序中。本文向您介紹了 Servlet 過濾器的使用。本文討論了過濾器的高級設計,比較了當前規範(2.4)和以前(2.3)的模型,講述了實現過濾器所涉及的精確步驟,以及如何在 Web 應用程序中聲明過濾器,然後與應用程序一起部署它。本文還闡述了 Servlet 過濾器的一些最普遍應用,並提到了過濾器如何適應傳統的 MVC 體系結構。

這是 J2EE 探索者 系列的最後一篇文章。我們在年初通過粗略研究 Enterprise JavaBean 組件來開始我們的旅程,並提到了何時使用這些組件才真正有意義,以及何時這些組件才會變得大材小用的問題。然後我們將目光轉向了 Web 層,繪製了一條通過 Servlet、JSP 頁面、JavaBean 技術以及 Java Servlet API 中的無數選擇和功能的路徑。在這個系列文章中與您一起艱苦跋涉真是一件快樂的事情。我享受着編寫這個系列文章的樂趣,並且我從大家的反饋中知道,這對您也 是一個很有價值的過程。

Java 過濾器的作用

jsp\java 如何編寫過濾器過濾特殊字符?

package com.jingdu.common;\x0d\x0aimport java.io.IOException;\x0d\x0aimport java.io.PrintWriter;\x0d\x0aimport javax.servlet.Filter;\x0d\x0aimport javax.servlet.FilterChain;\x0d\x0aimport javax.servlet.FilterConfig;\x0d\x0aimport javax.servlet.ServletException;\x0d\x0aimport javax.servlet.ServletRequest;\x0d\x0aimport javax.servlet.ServletResponse;\x0d\x0aimport javax.servlet.http.HttpServletRequest;\x0d\x0aimport javax.servlet.http.HttpServletResponse;\x0d\x0a\x0d\x0apublic class IllegalCharacterFilter implements Filter {\x0d\x0a private String[] characterParams = null;\x0d\x0a private boolean OK=true;\x0d\x0a \x0d\x0a public void init(FilterConfig config) throws ServletException {\x0d\x0a \x0d\x0a// if(config.getInitParameter(“characterParams”).length()

回答於 2022-11-16

Java面試題:過濾器有哪些作用和用法

Servlet 過濾器可以動態地攔截請求和響應,以變換或使用包含在請求或響應中的信息。

可以將一個或多個 Servlet 過濾器附加到一個 Servlet 或一組 Servlet。Servlet 過濾器也可以附加到 JavaServer Pages (JSP) 文件和 HTML 頁面。調用 Servlet 前調用所有附加的 Servlet 過濾器。

Servlet 過濾器是可用於 Servlet 編程的 Java 類,可以實現以下目的:

在客戶端的請求訪問後端資源之前,攔截這些請求。

在服務器的響應發送回客戶端之前,處理這些響應。

java過濾器使用的多嗎?

過濾器使用情況大致只有兩種:

1.編碼過濾

request.setCharacterEncoding(“GBK”);

request對象傳遞時解決亂碼問題

2.登錄驗證

HttpServletRequest

req

=

(HttpServletRequest)request;

HttpSession

ses

=

req.getSession();

即可取得session對象,操作session達到驗證目的。

寫在過濾器里減少大量重複代碼,還有方便維護

java語言中攔截器、過濾器、監聽器都是什麼意思?

過濾器,是在java web中,你傳入的request,response提前過濾掉一些信息,或者提前設置一些參數,然後再傳入servlet或者struts2的

action進行業務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),或者在傳入servlet或者

struts2的action前統一設置字符集,或者去除掉一些非法字符

攔截器,是在面向切面編程的就是在你的service或者一個方法,前調用一個方法,或者在方法後調用一個方法比如動態代理就是攔截器的簡單實現,在你調用方法前打印出字符串(或者做其它業務邏輯的操作),也可以在你調用方法後打印出字符串,甚至在你拋出異常的時候做業務邏輯的操作。

攔截器與過濾器的區別 :

攔截器是基於java的反射機制的,而過濾器是基於函數回調。

攔截器不依賴與servlet容器,過濾器依賴與servlet容器。

攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。

攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。

在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次

執行順序 :過濾前 – 攔截前 – Action處理 – 攔截後 –

過濾後。個人認為過濾是一個橫向的過程,首先把客戶端提交的內容進行過濾(例如未登錄用戶不能訪問內部頁面的處理);過濾通過後,攔截器將檢查用戶提交數

據的驗證,做一些前期的數據處理,接着把處理後的數據發給對應的Action;Action處理完成返回後,攔截器還可以做其他過程,再向上返回到過濾器的後續操作。

監聽器:這個東西在c/s模式裡面經常用到,他會對特定的事件產生產生一個處理。監聽在很多模式下用到。比如說觀察者模式,就是一個監聽來的。又比如struts2可以用監聽來啟動。Servlet監聽器用於監聽一些重要事件的發生,監聽器對象可以在事情發生前、發生後可以做一些必要的處理。

好比如果說Servlet的監聽器Listener,它是實現了javax.servlet.ServletContextListener

接口的服務器端程序,它也是隨web應用的啟動而啟動,只初始化一次,隨web應用的停止而銷毀。主要作用是:

做一些初始化的內容添加工作、設置一些基本的內容、比如一些參數或者是一些固定的對象等等。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/254233.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-14 17:41
下一篇 2024-12-14 17:41

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論