1. 程式人生 > >servlet和JSP過濾器Filter

servlet和JSP過濾器Filter

或許,servlet API的2.3版本中最重要的一個新功能就是能夠為servlet和JSP頁面定義過濾器。過濾器提供了某些早期伺服器所支援的非標準“servlet連結”的一種功能強大且標準的替代品。
過濾器是一個程式,它先於與之相關的servlet或JSP頁面執行在伺服器上。過濾器可附加到一個或多個servlet或JSP頁面上,並且可以檢查進入這些資源的請求資訊。在這之後,過濾器可以作如下的選擇:
l 以常規的方式呼叫資源(即,呼叫servlet或JSP頁面)。
l 利用修改過的請求資訊呼叫資源。
l 呼叫資源,但在傳送響應到客戶機前對其進行修改
l 阻止該資源呼叫,代之以轉到其他的資源,返回一個特定的狀態程式碼或生成替換輸出。
過濾器提供了幾個重要好處。
首先,它以一種模組化的或可重用的方式封裝公共的行為。你有30個不同的serlvet或JSP頁面,需要壓縮它們的內容以減少下載時間嗎?沒問題:構造一個壓縮過濾器(參閱第11節),然後將它應用到30個資源上即可。
其次,利用它能夠將高階訪問決策與表現程式碼相分離。這對於JSP特別有價值,其中一般希望將幾乎整個頁面集中在表現上,而不是集中在業務邏輯上。例如,希望阻塞來自某些站點的訪問而不用修改各頁面(這些頁面受到訪問限制)嗎?沒問題:建立一個訪問限制過濾器(參閱第8節)並把它應用到想要限制訪問的頁面上即可。
最後,過濾器使你能夠對許多不同的資源進行批量性的更改。你有許多現存資源,這些資源除了公司名要更改外其他的保持不變,能辦到麼?沒問題:構造一個串替換過濾器(參閱第10節),只要合適就使用它。
但要注意,過濾器只在與servlet規範2.3版相容的伺服器上有作用。如果你的Web應用需要支援舊版伺服器,就不能使用過濾器。
1. 建立基本過濾器
建立一個過濾器涉及下列五個步驟:
1)建立一個實現Filter介面的類。這個類需要三個方法,分別是:doFilter、init和destroy。doFilter方法包含主要的過濾程式碼(見第2步),init方法建立設定操作,而destroy方法進行清楚。
2)在doFilter方法中放入過濾行為。doFilter方法的第一個引數為ServletRequest物件。此物件給過濾器提供了對進入的資訊(包括表單資料、cookie和HTTP請求頭)的完全訪問。第二個引數為ServletResponse,通常在簡單的過濾器中忽略此引數。最後一個引數為FilterChain,如下一步所述,此引數用來呼叫servlet或JSP頁。
3)呼叫FilterChain物件的doFilter方法。Filter介面的doFilter方法取一個FilterChain物件作為它的一個引數。在呼叫此物件的doFilter方法時,啟用下一個相關的過濾器。如果沒有另一個過濾器與servlet或JSP頁面關聯,則servlet或JSP頁面被啟用。
4)對相應的servlet和JSP頁面註冊過濾器。在部署描述符檔案(web.xml)中使用filter和filter-mapping元素。
5)禁用啟用器servlet。防止使用者利用預設servlet URL繞過過濾器設定。
1.1 建立一個實現Filter介面的類
所有過濾器都必須實現javax.servlet.Filter。這個介面包含三個方法,分別為doFilter、init和destroy。
l public void doFilter(ServletRequset request,
ServletResponse response,
FilterChain chain)
thows ServletException, IOException
每當呼叫一個過濾器(即,每次請求與此過濾器相關的servlet或JSP頁面)時,就執行其doFilter方法。正是這個方法包含了大部分過濾邏輯。
第一個引數為與傳入請求有關的ServletRequest。對於簡單的過濾器,大多數過濾邏輯是基於這個物件的。如果處理HTTP請求,並且需要訪問諸如getHeader或getCookies等在ServletRequest中無法得到的方法,就要把此物件構造成HttpServletRequest。
第二個引數為ServletResponse。除了在兩個情形下要使用它以外,通常忽略這個引數。首先,如果希望完全阻塞對相關servlet或JSP頁面的訪問。可呼叫response.getWriter並直接傳送一個響應到客戶機。第7節給出詳細內容,第8節給出一個例子。其次,如果希望修改相關的servlet或JSP頁面的輸出,可把響應包含在一個收集所有傳送到它的輸出的物件中。然後,在呼叫serlvet或JSP頁面後,過濾器可檢查輸出,如果合適就修改它,之後傳送到客戶機。詳情請參閱第9節。
DoFilter的最後一個引數為FilterChain物件。對此物件呼叫doFilter以啟用與servlet或JSP頁面相關的下一個過濾器。如果沒有另一個相關的過濾器,則對doFilter的呼叫啟用servlet或JSP本身。
l public void init(FilterConfig config)
thows ServletException
init方法只在此過濾器第一次初始化時執行,不是每次呼叫過濾器都執行它。對於簡單的過濾器,可提供此方法的一個空體,但有兩個原因需要使用init。首先,FilterConfig物件提供對servlet環境及web.xml檔案中指派的過濾器名的訪問。因此,普遍的辦法是利用init將FilterConfig物件存放在一個欄位中,以便doFilter方法能夠訪問servlet環境或過濾器名。這種處理在第3節描述。其次,FilterConfig物件具有一個getInitParameter方法,它能夠訪問部署描述符檔案(web.xml)中分配的過濾器初始化引數。初始化引數的使用在第5節中描述。
l public void destroy( )
此方法在利用一個給定的過濾器物件永久地終止伺服器(如關閉伺服器)時呼叫。大多數過濾器簡單地為此方法提供一個空體,不過,可利用它來完成諸如關閉過濾器使用的檔案或資料庫連線池等清除任務。
1.2 將過濾行為放入doFilter方法
doFilter方法為大多數過濾器地關鍵部分。每當呼叫一個過濾器時,都要執行doFilter。對於大多數過濾器來說,doFilter執行的步驟是基於傳入的資訊的。因此,可能要利用作為doFilter的第一個引數提供的ServletRequest。這個物件常常構造為HttpServletRequest型別,以提供對該類的更特殊方法的訪問。
1.3 呼叫FilterChain物件的doFilter方法
Filter介面的doFilter方法以一個FilterChain物件作為它的第三個引數。在呼叫該物件的doFilter方法時,啟用下一個相關的過濾器。這個過程一般持續到鏈中最後一個過濾器為止。在最後一個過濾器呼叫其FilterChain物件的doFilter方法時,啟用servlet或頁面自身。
但是,鏈中的任意過濾器都可以通過不呼叫其FilterChain的doFilter方法中斷這個過程。在這樣的情況下,不再呼叫JSP頁面的serlvet,並且中斷此呼叫過程的過濾器負責將輸出提供給客戶機。詳情請參閱第7節。
1.4 對適當的servlet和JSP頁面註冊過濾器
部署描述符檔案的2.3版本引入了兩個用於過濾器的元素,分別是:filter和filter-mapping。filter元素向系統註冊一個過濾物件,filter-mapping元素指定該過濾物件所應用的URL。
1.filter元素
filter元素位於部署描述符檔案(web.xml)的前部,所有filter-mapping、servlet或servlet-mapping元素之前。filter元素具有如下六個可能的子元素:
l icon 這是一個可選的元素,它宣告IDE能夠使用的一個圖象檔案。
l filter-name 這是一個必需的元素,它給過濾器分配一個選定的名字。
l display-name 這是一個可選的元素,它給出IDE使用的短名稱。
l description 這也是一個可選的元素,它給出IDE的資訊,提供文字文件。
l filter-class 這是一個必需的元素,它指定過濾器實現類的完全限定名。
l init-param 這是一個可選的元素,它定義可利用FilterConfig的getInitParameter方法讀取的初始化引數。單個過濾器元素可包含多個init-param元素。
請注意,過濾是在serlvet規範2.3版中初次引入的。因此,web.xml檔案必須使用DTD的2.3版本。下面介紹一個簡單的例子:
<?xml version="1.0" encoding="ISO-8859-1"?>
web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">


MyFilter
myPackage.FilterClass


<?xml version="1.0" encoding="ISO-8859-1"?>
web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">


MyFilter
myPackage.FilterClass


SomeFilter
somePackage.SomeFilterClass


SomeFilter
somePackage.SomeFilterClass


<?xml version="1.0" encoding="ISO-8859-1"?>
web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">


package moreservlets.filters;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*; // For Date class

/** Simple filter that prints a report on the standard output
* each time an associated servlet or JSP page is accessed.
*/

public class ReportFilter implements Filter {
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws ServletException, IOException {
HttpServletRequest req = (HttpServletRequest)request;
System.out.println(req.getRemoteHost() +
" tried to access " +
req.getRequestURL() +
" on " + new Date() + ".");
chain.doFilter(request,response);
}

public void init(FilterConfig config)
throws ServletException {
}

public void destroy() {}
}


程式清單9-3 web.xml(針對報告過濾器的摘錄)

相關推薦

servletJSP過濾器Filter

或許,servlet API的2.3版本中最重要的一個新功能就是能夠為servlet和JSP頁面定義過濾器。過濾器提供了某些早期伺服器所支援的非標準“servlet連結”的一種功能強大且標準的替代品。過濾器是一個程式,它先於與之相關的servlet或JSP頁面執行在伺服器上。

servletjsp頁面過濾器Filter的作用及配置

剛剛有個朋友問我,Servlet的過濾器有什麼作用? 現在發個帖子說明一下,            過濾器是一個物件,可以傳輸請求或修改響應。它可以在請求到達Servlet/JSP之前對其進行預處理,而且能夠在響應離開Servlet /JSP之後對其進行後處理。所以如果你有

ServletJSP中的過濾器都是Java類

javax res remote 後端 tro response 服務 value 客戶端 JSP 過濾器 Servlet和JSP中的過濾器都是Java類,它們存在的目的如下: 在請求訪問後端資源時攔截它 管理從服務器返回給客戶端的響應 下面列出了多種常用的過濾器類型:

Servlet中的過濾器Filter詳解

rep 釋放 ons smo text 執行c 總結 throws 程序啟動 轉自: http://blog.csdn.net/sd0902/article/details/8395641 web.xml中元素執行的順序listener->filter->str

有關ServletJSP的梳理(一)

con type 獨立 ava 項目 考試成績 add lean 提交   大二第一學期的時候有學JSP的課,但是因為在開學之前做過JSP的小項目,所以一個學期的課也沒聽,直到期末考試成績出來了,才回想JSP的內容還有多少記得,沒想到模模糊糊也記不起多少,趕緊回頭學回來。接

ServletJSP之自定義標簽學習

new nds lsp xsd 自定義 content center 處理 rar    此文章會講述簡單標簽處理器,因為經典自定義標簽處理器沒有簡單標簽處理器方便使用,故在此不進行描述。 參考:慕課網的《JSP自定義標簽》視頻;     《Servle

ServletJSP之標簽文件學習

digi expr 提前 -type 一個 後綴 www. 其中 中標   在上一篇文章中介紹了自定義標簽的用法,接下來介紹標簽文件的用法啦。   tag file指令   tag file簡介   用tag file的方式,無需編寫標簽處理類和標簽庫描述文件,也可以

易學筆記--ServletJSP--入門就看這一篇就夠了

第4章:作為Servlet:請求和響應/4.1 Servlet載入過程 第4章:作為Servlet:請求和響應/4.2 請求 第4章:作為Servlet:請求和響應/4.3 響應 第4章:作為Servlet:請求和響應/4.4 資源下載例項 第4章:作為Servlet:

servletJSP中轉發重定向知識複習

1:servlet中轉發 、包含、和重定向 請求轉發:(源元件留頭不留體,目標元件留體不留頭) Servlet(源元件)先對客戶請求做一些預處理操作(一般是對響應頭進行處理),然後把請求轉發給其他Servlet(目標元件)來完成包括生成響應結果在內的後續操作。    實現方法:re

JAVA企業面試題精選 ServletJSP 31-40

2.31.session如何存取?何時被建立?session何時被刪除?如何在關閉瀏覽器的時候刪除session? 參考答案: 1.通過HttpServletRequest物件的getSession()來獲取session.     儲存資料方式:sess

servlet jsp 技術(02)

五、AJAX技術 1、ajax的概念和作用 (1)概念:非同步的 xml 和 js; (2)作用:區域性刷新技術; (3)原理: 通過 xhr 物件傳送請求,響應並不直接給到瀏覽器而是給 xhr 物件,最後通過 js 操作 dom 來動態重新整理區域性; 2、使用

servlet jsp 技術(01)

一、瞭解 http 協議 1、概念作用特點 (1)概念:超文字傳輸協議 (2)作用:規範客戶端和伺服器之間的互動 (3)特點:簡單便捷、無狀態(對事務處理沒有記憶能力)、無連線(1.1版本支援連線保持) 2、互動流程請求格式和請求方式 (1)互動流程:建立連線、傳送請求、接受

ServletJsp中的Request轉發、重定向

我們先來看例子,然後在說原理細節 這個例子就是一個html頁面有3個連結,一個轉發、一個重定向、一個登入 <a href="loginServlet">loginServlet</a> <br> <a href="f

關於servletjsp的學習總結一(詳細)

一、常用的web伺服器 主要有Tomact、Resin、Apache、IIS。 1、在這裡主要講一下關於Tomact和Apache的區別 說法一 A:Apache支援靜態頁,Tomact支援動態網頁(e.g servlet) 一般使用Apache+Toma

ServletJSP程式設計基礎》學習筆記

第1章  JSP簡介 Java Server Page(JSP)是一種建立動態網頁的簡單方法 第2章  配置JSP執行環境 JSP執行環境主要包括JDK和Tomcat,開發工具為Eclipse 啟動Tomcat: /usr/local/src/apache-tomcat-9

servletjsp學習指南pdf

譯者序  前 言  第1章 Servlet / 1  1.1 Servlet API概述 / 1  1.2 Servlet / 2  1.3 編寫基礎的Servlet應用程式 / 3  1.4 ServletRequest / 6  1.5 ServletResponse / 7  1.6 ServletCo

MVC-結合ServletJSP實現查詢功能

使用MVC的思想,結合Servlet和JSP進行做查詢操作實體類Heropackage bean; public class Hero { public int id; public String name; public float h

Servletjsp對外訪問路徑的配置的…

1 將一個servlet配置成保護的使得外界無法直接訪問:   做法: <servlet>       <servlet-name>loginServlet</servlet-name>       <servlet-class

servletjsp學習(一)

1,網路應用程式的架構(瞭解) (1)主機/終端 特點: 主機負責所有的計算(處理業務),終端只負責輸入輸出(不做任何計算)。 優點: 可靠,安全,i/o能力強。 缺點: 昂貴,擴充套件困難。 (2)client/server

java中 servletjsp的概念及區別

目錄 一、瞭解Servlet的概念         Servlet定義:Servlet是基於Java技術的Web元件,由容器管理併產生動態的內容。Servlet引擎作為WEB伺服器 的擴充套件提供支援Servlet的功能。Servlet與客戶端通過Servlet