Filter

来源:http://www.cnblogs.com/CComma/archive/2017/07/20/7203330.html
-Advertisement-
Play Games

一、簡介 作用:對Servlet容器調用Servlet的過程進行攔截,從而在Servlet進行響應處理的前後實現一些特殊的功能。 過濾器 API:Filter,FilterChain,FilterConfig。 Filter 程式:實現了 Filter 介面的 Java 類,由Servlet容器進行 ...


一、簡介

作用:對Servlet容器調用Servlet的過程進行攔截,從而在Servlet進行響應處理的前後實現一些特殊的功能。

過濾器 API:Filter,FilterChain,FilterConfig。

Filter 程式:實現了 Filter 介面的 Java 類,由Servlet容器進行調用和執行,需要在 web.xml 中進行註冊和設置它所能攔截的資源。

原理:Filter可以對Servlet容器發送給Servlet程式的請求和Servlet程式回送給Servlet容器的響應進行攔截。可以決定是否將請求繼續傳遞給Servlet程式,以及對請求和響應信息是否進行修改。

 

二、使用方法

1)void init(FilterConfig filterConfig)

作用:類似於 Servlet 的 init 方法。在創建 Filter 對象(Filter 對象在 Servlet 容器載入當前 WEB 應用時即被創建)後,立即被調用, 且只被調用一次。該方法用於對當前的 Filter 進行初始化操作。Filter 實例是單例的。

  • FilterConfig 類似於 ServletConfig
  • 可以在 web.xml 文件中配置當前 Filter 的初始化參數. 配置方式也和 Servlet 類似。

2)void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

作用:真正 Filter 的邏輯代碼需要編寫在該方法中。每次攔截都會調用該方法。

參數:FilterChain:Filter 鏈。多個 Filter 可以構成一個 Filter 鏈。

  • chain.doFilter(ServletRequest request, ServletResponse response):把請求傳給 Filter 鏈的下一個 Filter,若當前 Filter 是 Filter 鏈的最後一個 Filter,將把請求給到目標 Serlvet(或 JSP)。
  • 多個 Filter 攔截的順序和 <filter-mapping> 配置的順序有關,靠前的先被調用。

3)public void destroy()

釋放當前 Filter 所占用的資源的方法。在 Filter 被銷毀之前被調用,且只被調用一次。

public class HelloFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) 
throws IOException, ServletException {//放行 chain.doFilter(request, response); } @Override public void destroy() { } }

 

web.xml

url-pattern:指定該 Filter 可以攔截哪些資源,即可以通過哪些 url 訪問到該 Filter。

<dispatcher>:指定過濾器所攔截的資源被 Servlet 容器調用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,預設REQUEST。可以設置多個<dispatcher> 子元素用來指定 Filter 對資源的多種調用方式進行攔截

  • REQUEST:當用戶直接訪問頁面時,Web 容器將會調用過濾器。如果目標資源是通過 RequestDispatcher 的 include() 或 forward() 方法訪問時,那麼該過濾器就不會被調用。通過 GET 或 POST 請求直接訪問。
  • FORWARD:如果目標資源是通過 RequestDispatcher 的 forward() 方法訪問時,那麼該過濾器將被調用,除此之外,該過濾器不會被調用。或 <jsp:forward page="/..." /> 或 通過 page 指令的 errorPage 轉發頁面. <%@ page errorPage="test.jsp" %>
  • INCLUDE:如果目標資源是通過 RequestDispatcher 的 include() 方法訪問時,那麼該過濾器將被調用。除此之外,該過濾器不會被調用。或 <jsp:include file="/..." />
  • ERROR:如果目標資源是通過聲明式異常處理機制調用時,那麼該過濾器將被調用。除此之外,過濾器不會被調用。在 web.xml 文件中通過 error-page 節點進行聲明:
    <error-page>
        <exception-type>java.lang.ArithmeticException</exception-type>
        <location>/test.jsp</location>
    </error-page>

     

<!-- 註冊 Filter -->
<filter>
    <filter-name>helloFilter</filter-name> 
    <filter-class>com.atguigu.javaweb.HelloFilter</filter-class>
</filter>

<!-- 映射 Filter -->
<filter-mapping>
    <filter-name>helloFilter</filter-name>
    <url-pattern>/test.jsp</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>

 

三、應用

1. 使瀏覽器不緩存頁面的過濾器

有3個HTTP響應頭欄位都可以禁止瀏覽器緩存當前頁面

  • HttpServletResponse.setDataHeader("Expires", -1);
  • HttpServletResponse.setHeader("Cache-Control", "no-cache");
  • HttpServletResponse.setHeader("Pragma", "no-cache");
//HttpFilter的實現與HttpServlet相似
public
class NoCacheFilter extends HttpFilter { @Override public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException { response.setDateHeader("Expires",-1); response.setHeader("Cache-Control","no-cache"); response.setHeader("Pragma","no-cache"); filterChain.doFilter(request, response); } }

 

2. 字元編碼的過濾器

目標:讓所有的頁面都不會出現字元編碼問題,為此需要添加一個過濾器

EncodingFilter.java

public class EncodingFilter extends HttpFilter{

    private String encoding;
    
    @Override
    protected void init() {
        encoding = getFilterConfig().getServletContext().getInitParameter("encoding");
    }
    
    @Override
    public void doFilter(HttpServletRequest request,
            HttpServletResponse response, FilterChain filterChain)
            throws IOException, ServletException {
        System.out.println(encoding); 
        request.setCharacterEncoding(encoding);
        filterChain.doFilter(request, response);
    }
}

 

 

web.xml

 <context-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
 </context-param>
 <filter>
      <filter-name>encodingFilter</filter-name>
      <filter-class>com.atguigu.javaweb.encoding.EncodingFilter</filter-class>
 </filter>
  
 <filter-mapping>
      <filter-name>encodingFilter</filter-name>
      <url-pattern>/*</url-pattern>
 </filter-mapping>

 


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

-Advertisement-
Play Games
更多相關文章
  • 1.Xml添加監聽屬性,這裡添加的doClick。 在Activity中添加doClick實現方法。Activity中實現的方法要和XML添加的屬性名相同,不建議實際開發中使用。 2.匿名內部類方式實現。 3.自定義點擊事件實現。 4.Activity繼承View.OnClickListener,由 ...
  • 時間設置 查看系統當前日期/時間: date -R 查看系統硬體時鐘: hwclock --show 設置硬體時間: hwclock --set --date="07/18/17 20:55" 用硬體時間同步系統時間: hwclock --hctosys 時區設置 tzselect 選擇 Asia ... ...
  • 一、終端列印 [root@cai ~]# echo welcome to bash! welcome to bash! [cairui@cai ~]$ echo 'welcome to bash!' welcome to bash! [cairui@cai ~]$ echo "welcome to ...
  • 一、最小化原則 (1)安裝最小化 (2)開機啟動服務最小化 (3)操作最小化 (4)許可權最小化 (5)配置參數合理,不要最大化 二、埠優化 遠程登錄的埠預設是22號埠,這是大家都知道的。所以為了安全著想,我們要修改伺服器遠程連接埠,這樣黑客就不好破解你的linux伺服器。同時,預設登錄的用戶 ...
  • 前言:這段時間在學習Ant,發現這是一個很強大的構建工具。你可能使用了很長一段時間,才發現Ant能做數不完的事。總之,個人覺得,Ant學習門檻低,入門簡單,能大概看懂程式,寫一些簡單的腳本即可,剩下在遇到的時候邊做邊學就可以了。另外,博主資歷尚淺,有說的不對的地方,還請大家不吝指教。 1、Ant是一 ...
  • 主要內容 函數基本語法及特性 定義 數學函數定義:一般的,在一個變化過程中,如果有兩個變數x和y,並且對於x的每一 個確定的值,y都有唯一確定的值與其對應,那麼我們就把x稱為自變數,把y稱為因變 量,y是x的函數。自變數x的取值範圍叫做這個函數的定義域。 但編程中的「函數」概念,與數學中的函數是有很 ...
  • 一 概述 1.JPA Java Persistence API,是Java EE為ORM框架定義的規範,任何使用java語言的ORM框架都必須實現該規範。Hibernate/Mybatis都是是JPA的一種實現。 2.ORM Object Relational Mapping,對象到關係的映射,在關 ...
  • 自己組建了一個網站,想要發佈到互聯網上。然後我就找到了這個鏈接 https://www.codecasts.com/series/deploy-a-website-from-scratch(是一個從零部署網盤到伺服器的視頻系列,很強大) 然後我就 租了雲伺服器(ucloud),系統是ubuntu 買 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...