摘要:幸好,給我們提供了過濾器解決這個問題。可以將一個或多個過濾器附加到一個或一組。同樣的,過濾器是可用于編程的類,也需要在中聲明的。用戶訪問后續過濾器。過濾器和攔截器是兩個完全不同的概念。
聽說你改bug很厲害,幫我改一個吧
????
上一章我們講到了Servlet請求,可以通過瀏覽器發送的請求,來進行數據的處理并返回相應的響應給瀏覽器。
在我們的實際開發中,常常會遇到一些對所有方法都需要的驗證方法,比如登錄驗證等,這個時候我們在每個方法中都編寫同樣的功能代碼,既浪費時間也不利于維護。
幸好,Servlet給我們提供了過濾器解決這個問題。
是什么Servlet 過濾器可以動態地攔截請求和響應,以變換或使用包含在請求或響應中的信息。
可以將一個或多個 Servlet 過濾器附加到一個 Servlet 或一組 Servlet。調用 Servlet 前調用所有附加的 Servlet 過濾器。
Servlet 過濾器可以實現以下目的:
在客戶端的請求訪問后端資源之前,攔截這些請求。
在服務器的響應發送回客戶端之前,處理這些響應。
同樣的,Servlet過濾器是可用于 Servlet 編程的 Java 類,也需要在XML中聲明的。Filter執行順序和在web.xml中聲明的順序一致,通常把Filter配置在所有邏輯Servlet之前。
如何用Servlet通過javax.servlet.Filter接口來實現過濾器,接口提供了三個方法:
該方法完成實際的過濾操作,當客戶端請求方法與過濾器設置的URL匹配時,Servlet容器將先調用過濾器的doFilter方法。FilterChain用戶訪問后續過濾器。
web 應用程序啟動時,web 服務器將創建Filter 的實例對象,并調用其init方法,讀取web.xml配置,完成對象的初始化功能,從而為后續的用戶請求作好攔截的準備工作(filter對象只會創建一次,init方法也只會執行一次)。開發人員通過init方法的參數,可獲得代表當前filter配置信息的FilterConfig對象。
Servlet容器在銷毀過濾器實例前調用該方法,在該方法中釋放Servlet過濾器占用的資源。
節點 | 說明 |
---|---|
指定這個過濾器 | |
過濾器的名稱 | |
過濾器完整類名 | |
元素用于為過濾器指定初始化參數,它的子元素 |
|
元素用于設置一個 Filter 所負責攔截的資源。一個Filter攔截的資源可通過兩種方式來指定:Servlet 名稱和資源訪問的請求路徑 | |
子元素用于設置filter的注冊名稱。該值必須是在 |
|
設置 filter 所攔截的請求路徑(過濾器關聯的URL樣式) |
我們接著上一章的小栗子繼續擴展我們的應用。
package com.filter; //導入必要的依賴庫 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; //實現Filter類 public class FirstFilter implements Filter { public void init(FilterConfig config) throws ServletException { //獲取web.xml中初始化的參數 String name = config.getInitParameter("name"); //輸出 System.out.println("請關注:"+ name); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException { System.out.println("我在doFilter中"); String message = "我跨越過濾器來跟你說"; // 設置響應內容類型 response.setContentType("text/html;charset=utf-8"); // 實際的邏輯是在這里 PrintWriter out = response.getWriter(); out.println("" + message + "
"); //把請求傳回過濾鏈 chain.doFilter(request, response); } public void destroy(){ //do something } }
FirstFilter com.filter.FirstFilter name 野生前端攻城獅 FirstFilter /* HelloWorld com.servletLearn.HelloWorld HelloWorld /
可以看到,我們在項目啟動的時候,執行了Filter的init()方法,所以在服務器日志中看到了打印請關注野生前端攻城獅字符串。
使用瀏覽器打開對應的鏈接時,同樣在服務器日志中也出現了我們打印的字符串。而在瀏覽器中,則同時出現了我們在過濾器和HelloWorld方法中返回的字符串。
所以,我們在過濾器中返回的值,并沒有影響原來Servlet方法的執行。
最后過濾器在日常開發中適用范圍非常廣泛,所以是我們學習servlet所必須要掌握的一個知識點。
PS:過濾器和攔截器是兩個完全不同的概念。過濾器是原生servlet的類,攔截器是Spring及struts2里的概念
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67060.html
摘要:所以,就是接收瀏覽器或其他客戶端發來的請求,根據請求操作數據庫,并返回請求所需要的數據。和方法是每次服務請求中最常用的方法,分別用于處理和請求。實現一個簡單的在中新建一個項目。接著,在目錄下新增一個,命名為。 本文是菜鳥教程閱讀筆記,詳細請前往菜鳥教程 是什么 Java Servlet是運行在Web服務器上的程序,它是作為來自Web瀏覽器和服務器上的數據庫之間的中間層。 簡單點說,我們...
摘要:服務器響應當客戶端發送了一個請求給服務器,服務器也會返回一個響應給客戶端,同樣的,這個響應中也包含了除數據之外的很多信息。如果沒有指定,會在所有對此站點的傳送時發送。正常情況下,只被送回最初向用戶發送的計算機。下一章大巴司機和。 showImg(https://segmentfault.com/img/bVL3vT?w=800&h=600); Servlet客戶端HTTP請求 當瀏覽器...
摘要:前言由于寫的文章已經是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導航。 前言 由于寫的文章已經是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導航。 由于更新比較頻繁,因此隔一段時間才會更新目錄導航哦~想要獲取最新原創的技術文章歡迎關注我的公眾號:Java3y Java3y文章目錄導航 Java基礎 泛型就這么簡單 注解就這么簡單 Druid數據庫連接池...
閱讀 2983·2021-10-27 14:16
閱讀 699·2021-10-13 09:39
閱讀 3695·2021-09-29 09:46
閱讀 2097·2019-08-30 15:54
閱讀 2603·2019-08-30 15:52
閱讀 2998·2019-08-30 15:44
閱讀 1107·2019-08-30 15:44
閱讀 503·2019-08-30 10:51