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