過濾器Filter

来源:http://www.cnblogs.com/izhongwei/archive/2016/07/01/5634260.html
-Advertisement-
Play Games

一、過濾器 過濾器就是向web應用程式的請求和和響應添加功能的組件。過濾器能夠實現客戶端和目標資源之間的交互信息進行篩選和過濾,最終保留有效的數據信息。 二、過濾器的生命周期 2.1 實例化。 web容器複製創建過濾器的實例來完成過濾器的實例化,只會實例化一次。 2.2 初始化。 在進行過濾工作前會 ...


一、過濾器

過濾器就是向web應用程式的請求和和響應添加功能的組件。過濾器能夠實現客戶端和目標資源之間的交互信息進行篩選和過濾,最終保留有效的數據信息。

二、過濾器的生命周期

2.1 實例化。

web容器複製創建過濾器的實例來完成過濾器的實例化,只會實例化一次。

2.2 初始化。

在進行過濾工作前會調用init()方法來實現初始化操作,也只初始化一次。

2.3 執行過濾

調用doFilter()方法來實現過濾器的特定功能

4.銷毀

調用destory()方法,釋放過濾器所占用的資源。

三、過濾器的應用

3.1 過濾器開發的四個步驟:

(1).創建實現Filter介面的類

(2).在doFilter()中編寫實現過濾的方法。

(3).調用下一個過濾器或者web資源

(4).在web.xml文件中配置過濾器

3.2 創建Filter過濾器類

package demo.web.servlet;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class CharacterEncodingFilter implements Filter {

	public void destroy() {
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// 設置請求時的編碼方法
		request.setCharacterEncoding("utf-8");
		// 調用web資源,也可以調用其他過濾器
		chain.doFilter(request, response);
		// 設置響應時的編碼方式
		response.setCharacterEncoding("utf-8");
	}

	public void init(FilterConfig arg0) throws ServletException {
	}

}

再創建MyFilter過濾器類

package demo.web.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class MyFilter implements Filter {

	public void destroy() {
		// TODO Auto-generated method stub

	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		request.setCharacterEncoding("utf-8");
		System.out.println("myFilter調用doFilter開始");
		chain.doFilter(request, response);
		response.setCharacterEncoding("utf-8");
		System.out.println("myFilter調用doFilter結束");

	}

	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub

	}

}

3.3 過濾器filter在web.xml中的配置

<filter>
  	<filter-name>CharacterEncodingFilter</filter-name>
  	<filter-class>demo.web.filter.CharacterEncodingFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>CharacterEncodingFilter</filter-name>
  	<url-pattern>/*</url-pattern> <!--  過濾站點的所有信息,配置與servlet類似可以是/xx/*或者/xx -->
  </filter-mapping>
<filter>
  	<display-name>myFilter</display-name>
  	<filter-name>myFilter</filter-name>
  	<filter-class>demo.web.filter.MyFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>myFilter</filter-name>
  	<url-pattern>/*</url-pattern> <!--  過濾站點的所有信息 -->
  	<dispatcher>REQUEST</dispatcher>
  </filter-mapping>

<dispatcher>指定過濾器所攔截的資源被 Servlet 容器調用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,預設REQUEST。用戶可以設置多個

<dispatcher> 子元素用來指定 Filter 對資源的多種調用方式進行攔截。

<dispatcher> 子元素可以設置的值及其意義:

1.REQUEST:當用戶直接訪問頁面時,Web容器將會調用過濾器。如果目標資源是通過RequestDispatcher的include()或forward()方法訪問時,那麼該過濾器就不會被調用。

2.INCLUDE:如果目標資源是通過RequestDispatcher的include()方法訪問時,那麼該過濾器將被調用。除此之外,該過濾器不會被調用。

3.FORWARD:如果目標資源是通過RequestDispatcher的forward()方法訪問時,那麼該過濾器將被調用,除此之外,該過濾器不會被調用。

4.ERROR:如果目標資源是通過聲明式異常處理機制調用時,那麼該過濾器將被調用。除此之外,過濾器不會被調用。

3.4 過濾器鏈

在web應用中可以開發多個Filter過濾器,這些Filter組合起來就是一個Filter鏈。

web伺服器根據Filter在web.xml文件中的註冊順序,決定先調用哪個Filter,當第一個Filter的doFilter方法被調用時,web伺服器會創建一個代表Filter鏈的FilterChain對象傳遞

給該方法。在doFilter方法中,開發人員如果調用了FilterChain對象的doFilter方法,則web伺服器會檢查FilterChain對象中是否還有filter,如果有,則調用第2個filter,如果沒

有,則調用目標資源。

還有創建servlet,已在上一篇servlet文章中創建

在瀏覽器中調用http://localhost:8080/servletDemo/myServlet,在控制台輸出

有運行結果分析可知道:過濾是按照web.xml中配置的順序先調用servlet的初始化,再調用CharacterEncodingFilter的doFilter方法,在程式執行到chain.doFilter(req,resp);

方法時會去調用web.xml中配置的characterEncodingFilter下邊的Filter,也就是調用MyFilter中的doFilter()方法,過濾器這種嵌套執行完後才調用servlet的doGet()方法;

註意:這個過程servlet只會初始化一次,並且servlet初始化後不會再調用Filter的init()方法,Filter位於javax.servlet.filter包下。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 模塊,用一坨代碼實現了某個功能的代碼集合。 類似於函數式編程和麵向過程編程,函數式編程則完成一個功能,其他代碼用來調用即可,提供了代碼的重用性和代碼間的耦合。而對於一個複雜的功能來,可能需要多個函數才能完成(函數又可以在不同的.py文件中),n個 .py 文件組成的代碼集合就稱為模塊。 如:os 是 ...
  • pageContext對象: 1.可以作為入口對象獲取其他八大隱式對象的引用 1.1 getEXception獲取exception隱世對象 1.2 getPage獲取page對象 1.3 getRequest 獲取request對象 1.4 getResponse 獲取response對象 1.5 ...
  • python類及其方法 一、介紹 在 Python 中,面向對象編程主要有兩個主題,就是類和類實例類與實例:類與實例相互關聯著:類是對象的定義,而實例是"真正的實物",它存放了類中所定義的對象的具體信息。 類有這樣一些的優點: 二、類的定義 1.定義類(class)的語法 一第行,語法是class ...
  • ArrayList簡介 ArrayList是基於數組實現的,是一個動態數組,其容量能自動增長,類似於C語言中的動態申請記憶體,動態增長記憶體。 ArrayList不是線程安全的,只能用在單線程環境下,多線程環境下可以考慮用Collections.synchronizedList(List l)函數返回一 ...
  • 1、搭建定時任務quartz 本來是打算把定時任務放入後臺管理中,這樣目前沒問題,但是弱後期加入許可權管理-shiro,那麼肯定有衝突的,原因是最新版的shiro會使用quartz-1.6版本,而最新的quartz已經到了2.3 有人索性把quartz版本降到了1.6,這樣就沒問題,我想這樣不好,2. ...
  • 從c++轉到java,初學struts,竟然碰到一個因寫錯單詞而造成的錯誤,structs --> struts ...
  • 這是個對於讀寫鎖中級剖析文章, 會自己實現讀寫鎖的細節.歡迎用到自己的項目中. ...
  • 在 HttpRequest 對象中,屬性 GET 和 POST 得到的都是 django.http.QueryDict 所創建的實例。這是一個 django 自定義的類似字典的類,用來處理同一個鍵帶多個值的情況。 在 python 原始的字典中,當一個鍵出現多個值的時候會發生衝突,只保留最後一個值。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...