成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

servlet和JSP過(guò)濾器的作用是什么

這篇文章主要講解了“servlet和JSP過(guò)濾器的作用是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“servlet和JSP過(guò)濾器的作用是什么”吧!

創(chuàng)新互聯(lián)于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元德欽做網(wǎng)站,已為上家服務(wù),為德欽各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575

本章內(nèi)容如下:
l 設(shè)計(jì)基本過(guò)濾器
l 讀取請(qǐng)求數(shù)據(jù)
l 訪問(wèn)serlvet環(huán)境
l 初始化過(guò)濾器

[@more@]或許,servlet API的2.3版本中最重要的一個(gè)新功能就是能夠?yàn)閟ervlet和JSP頁(yè)面定義過(guò)濾器。過(guò)濾器提供了某些早期服務(wù)器所支持的非標(biāo)準(zhǔn)“servlet鏈接”的一種功能強(qiáng)大且標(biāo)準(zhǔn)的替代品。
過(guò)濾器是一個(gè)程序,它先于與之相關(guān)的servlet或JSP頁(yè)面運(yùn)行在服務(wù)器上。過(guò)濾器可附加到一個(gè)或多個(gè)servlet或JSP頁(yè)面上,并且可以檢查進(jìn)入這些資源的請(qǐng)求信息。在這之后,過(guò)濾器可以作如下的選擇:
l 以常規(guī)的方式調(diào)用資源(即,調(diào)用servlet或JSP頁(yè)面)。
l 利用修改過(guò)的請(qǐng)求信息調(diào)用資源。
l 調(diào)用資源,但在發(fā)送響應(yīng)到客戶機(jī)前對(duì)其進(jìn)行修改
l 阻止該資源調(diào)用,代之以轉(zhuǎn)到其他的資源,返回一個(gè)特定的狀態(tài)代碼或生成替換輸出。
過(guò)濾器提供了幾個(gè)重要好處。
首先,它以一種模塊化的或可重用的方式封裝公共的行為。你有30個(gè)不同的serlvet或JSP頁(yè)面,需要壓縮它們的內(nèi)容以減少下載時(shí)間嗎?沒(méi)問(wèn)題:構(gòu)造一個(gè)壓縮過(guò)濾器(參閱第11節(jié)),然后將它應(yīng)用到30個(gè)資源上即可。
其次,利用它能夠?qū)⒏呒?jí)訪問(wèn)決策與表現(xiàn)代碼相分離。這對(duì)于JSP特別有價(jià)值,其中一般希望將幾乎整個(gè)頁(yè)面集中在表現(xiàn)上,而不是集中在業(yè)務(wù)邏輯上。例如,希望阻塞來(lái)自某些站點(diǎn)的訪問(wèn)而不用修改各頁(yè)面(這些頁(yè)面受到訪問(wèn)限制)嗎?沒(méi)問(wèn)題:建立一個(gè)訪問(wèn)限制過(guò)濾器(參閱第8節(jié))并把它應(yīng)用到想要限制訪問(wèn)的頁(yè)面上即可。
最后,過(guò)濾器使你能夠?qū)υS多不同的資源進(jìn)行批量性的更改。你有許多現(xiàn)存資源,這些資源除了公司名要更改外其他的保持不變,能辦到么?沒(méi)問(wèn)題:構(gòu)造一個(gè)串替換過(guò)濾器(參閱第10節(jié)),只要合適就使用它。
但要注意,過(guò)濾器只在與servlet規(guī)范2.3版兼容的服務(wù)器上有作用。如果你的Web應(yīng)用需要支持舊版服務(wù)器,就不能使用過(guò)濾器。
1.  建立基本過(guò)濾器
建立一個(gè)過(guò)濾器涉及下列五個(gè)步驟:
1)建立一個(gè)實(shí)現(xiàn)Filter接口的類。這個(gè)類需要三個(gè)方法,分別是:doFilter、init和destroy。doFilter方法包含主要的過(guò)濾代碼(見(jiàn)第2步),init方法建立設(shè)置操作,而destroy方法進(jìn)行清楚。
2)在doFilter方法中放入過(guò)濾行為。doFilter方法的第一個(gè)參數(shù)為ServletRequest對(duì)象。此對(duì)象給過(guò)濾器提供了對(duì)進(jìn)入的信息(包括表單數(shù)據(jù)、cookie和HTTP請(qǐng)求頭)的完全訪問(wèn)。第二個(gè)參數(shù)為ServletResponse,通常在簡(jiǎn)單的過(guò)濾器中忽略此參數(shù)。最后一個(gè)參數(shù)為FilterChain,如下一步所述,此參數(shù)用來(lái)調(diào)用servlet或JSP頁(yè)。
3)調(diào)用FilterChain對(duì)象的doFilter方法。Filter接口的doFilter方法取一個(gè)FilterChain對(duì)象作為它的一個(gè)參數(shù)。在調(diào)用此對(duì)象的doFilter方法時(shí),激活下一個(gè)相關(guān)的過(guò)濾器。如果沒(méi)有另一個(gè)過(guò)濾器與servlet或JSP頁(yè)面關(guān)聯(lián),則servlet或JSP頁(yè)面被激活。
4)對(duì)相應(yīng)的servlet和JSP頁(yè)面注冊(cè)過(guò)濾器。在部署描述符文件(web.xml)中使用filter和filter-mapping元素。
5)禁用激活器servlet。防止用戶利用缺省servlet URL繞過(guò)過(guò)濾器設(shè)置。
1.1  建立一個(gè)實(shí)現(xiàn)Filter接口的類
所有過(guò)濾器都必須實(shí)現(xiàn)javax.servlet.Filter。這個(gè)接口包含三個(gè)方法,分別為doFilter、init和destroy。
l public void doFilter(ServletRequset request,
                   ServletResponse response,
                   FilterChain chain)
   thows ServletException, IOException
每當(dāng)調(diào)用一個(gè)過(guò)濾器(即,每次請(qǐng)求與此過(guò)濾器相關(guān)的servlet或JSP頁(yè)面)時(shí),就執(zhí)行其doFilter方法。正是這個(gè)方法包含了大部分過(guò)濾邏輯。
第一個(gè)參數(shù)為與傳入請(qǐng)求有關(guān)的ServletRequest。對(duì)于簡(jiǎn)單的過(guò)濾器,大多數(shù)過(guò)濾邏輯是基于這個(gè)對(duì)象的。如果處理HTTP請(qǐng)求,并且需要訪問(wèn)諸如getHeader或getCookies等在ServletRequest中無(wú)法得到的方法,就要把此對(duì)象構(gòu)造成HttpServletRequest。
第二個(gè)參數(shù)為ServletResponse。除了在兩個(gè)情形下要使用它以外,通常忽略這個(gè)參數(shù)。首先,如果希望完全阻塞對(duì)相關(guān)servlet或JSP頁(yè)面的訪問(wèn)。可調(diào)用response.getWriter并直接發(fā)送一個(gè)響應(yīng)到客戶機(jī)。第7節(jié)給出詳細(xì)內(nèi)容,第8節(jié)給出一個(gè)例子。其次,如果希望修改相關(guān)的servlet或JSP頁(yè)面的輸出,可把響應(yīng)包含在一個(gè)收集所有發(fā)送到它的輸出的對(duì)象中。然后,在調(diào)用serlvet或JSP頁(yè)面后,過(guò)濾器可檢查輸出,如果合適就修改它,之后發(fā)送到客戶機(jī)。詳情請(qǐng)參閱第9節(jié)。
DoFilter的最后一個(gè)參數(shù)為FilterChain對(duì)象。對(duì)此對(duì)象調(diào)用doFilter以激活與servlet或JSP頁(yè)面相關(guān)的下一個(gè)過(guò)濾器。如果沒(méi)有另一個(gè)相關(guān)的過(guò)濾器,則對(duì)doFilter的調(diào)用激活servlet或JSP本身。
l public void init(FilterConfig config)
   thows ServletException
init方法只在此過(guò)濾器第一次初始化時(shí)執(zhí)行,不是每次調(diào)用過(guò)濾器都執(zhí)行它。對(duì)于簡(jiǎn)單的過(guò)濾器,可提供此方法的一個(gè)空體,但有兩個(gè)原因需要使用init。首先,F(xiàn)ilterConfig對(duì)象提供對(duì)servlet環(huán)境及web.xml文件中指派的過(guò)濾器名的訪問(wèn)。因此,普遍的辦法是利用init將FilterConfig對(duì)象存放在一個(gè)字段中,以便doFilter方法能夠訪問(wèn)servlet環(huán)境或過(guò)濾器名。這種處理在第3節(jié)描述。其次,F(xiàn)ilterConfig對(duì)象具有一個(gè)getInitParameter方法,它能夠訪問(wèn)部署描述符文件(web.xml)中分配的過(guò)濾器初始化參數(shù)。初始化參數(shù)的使用在第5節(jié)中描述。
l public void destroy( )
此方法在利用一個(gè)給定的過(guò)濾器對(duì)象永久地終止服務(wù)器(如關(guān)閉服務(wù)器)時(shí)調(diào)用。大多數(shù)過(guò)濾器簡(jiǎn)單地為此方法提供一個(gè)空體,不過(guò),可利用它來(lái)完成諸如關(guān)閉過(guò)濾器使用的文件或數(shù)據(jù)庫(kù)連接池等清除任務(wù)。
1.2  將過(guò)濾行為放入doFilter方法
doFilter方法為大多數(shù)過(guò)濾器地關(guān)鍵部分。每當(dāng)調(diào)用一個(gè)過(guò)濾器時(shí),都要執(zhí)行doFilter。對(duì)于大多數(shù)過(guò)濾器來(lái)說(shuō),doFilter執(zhí)行的步驟是基于傳入的信息的。因此,可能要利用作為doFilter的第一個(gè)參數(shù)提供的ServletRequest。這個(gè)對(duì)象常常構(gòu)造為HttpServletRequest類型,以提供對(duì)該類的更特殊方法的訪問(wèn)。
1.3  調(diào)用FilterChain對(duì)象的doFilter方法
Filter接口的doFilter方法以一個(gè)FilterChain對(duì)象作為它的第三個(gè)參數(shù)。在調(diào)用該對(duì)象的doFilter方法時(shí),激活下一個(gè)相關(guān)的過(guò)濾器。這個(gè)過(guò)程一般持續(xù)到鏈中最后一個(gè)過(guò)濾器為止。在最后一個(gè)過(guò)濾器調(diào)用其FilterChain對(duì)象的doFilter方法時(shí),激活servlet或頁(yè)面自身。
但是,鏈中的任意過(guò)濾器都可以通過(guò)不調(diào)用其FilterChain的doFilter方法中斷這個(gè)過(guò)程。在這樣的情況下,不再調(diào)用JSP頁(yè)面的serlvet,并且中斷此調(diào)用過(guò)程的過(guò)濾器負(fù)責(zé)將輸出提供給客戶機(jī)。詳情請(qǐng)參閱第7節(jié)。
1.4  對(duì)適當(dāng)?shù)膕ervlet和JSP頁(yè)面注冊(cè)過(guò)濾器
部署描述符文件的2.3版本引入了兩個(gè)用于過(guò)濾器的元素,分別是:filter和filter-mapping。filter元素向系統(tǒng)注冊(cè)一個(gè)過(guò)濾對(duì)象,filter-mapping元素指定該過(guò)濾對(duì)象所應(yīng)用的URL。
1.filter元素
filter元素位于部署描述符文件(web.xml)的前部,所有filter-mapping、servlet或servlet-mapping元素之前。filter元素具有如下六個(gè)可能的子元素:
l icon  這是一個(gè)可選的元素,它聲明IDE能夠使用的一個(gè)圖象文件。
l filter-name  這是一個(gè)必需的元素,它給過(guò)濾器分配一個(gè)選定的名字。
l display-name  這是一個(gè)可選的元素,它給出IDE使用的短名稱。
l description  這也是一個(gè)可選的元素,它給出IDE的信息,提供文本文檔。
l filter-class  這是一個(gè)必需的元素,它指定過(guò)濾器實(shí)現(xiàn)類的完全限定名。
l init-param  這是一個(gè)可選的元素,它定義可利用FilterConfig的getInitParameter方法讀取的初始化參數(shù)。單個(gè)過(guò)濾器元素可包含多個(gè)init-param元素。
請(qǐng)注意,過(guò)濾是在serlvet規(guī)范2.3版中初次引入的。因此,web.xml文件必須使用DTD的2.3版本。下面介紹一個(gè)簡(jiǎn)單的例子:


   <!DOCTYPE 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
     

     <!-- ... --&gt
     ...
   

2.filter-mapping元素
filter-mapping元素位于web.xml文件中filter元素之后serlvet元素之前。它包含如下三個(gè)可能的子元素::
l filter-name  這個(gè)必需的元素必須與用filter元素聲明時(shí)給予過(guò)濾器的名稱相匹配。
l url-pattern  此元素聲明一個(gè)以斜杠(/)開(kāi)始的模式,它指定過(guò)濾器應(yīng)用的URL。所有filter-mapping元素中必須提供url-pattern或servlet-name。但不能對(duì)單個(gè)filter-mapping元素提供多個(gè)url-pattern元素項(xiàng)。如果希望過(guò)濾器適用于多個(gè)模式,可重復(fù)整個(gè)filter-mapping元素。
l servlet-name  此元素給出一個(gè)名稱,此名稱必須與利用servlet元素給予servlet或JSP頁(yè)面的名稱相匹配。不能給單個(gè)filter-mapping元素提供多個(gè)servlet-name元素項(xiàng)。如果希望過(guò)濾器適合于多個(gè)servlet名,可重復(fù)這個(gè)filter-mapping元素。
下面舉一個(gè)例子:


   <!DOCTYPE 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
     

     <!-- ... --&gt
     
       MyFilter
       /someDirectory/SomePage.jsp
     

   

1.5  禁用激活器servlet
在對(duì)資源應(yīng)用過(guò)濾器時(shí),可通過(guò)指定要應(yīng)用過(guò)濾器的URL模式或servlet名來(lái)完成。如果提供servlet名,則此名稱必須與web.xml的servlet元素中給出的名稱相匹配。如果使用應(yīng)用到一個(gè)serlvet的URL模式,則此模式必須與利用web.xml的元素servlet-mapping指定的模式相匹配。但是,多數(shù)服務(wù)器使用“激活器servlet”為servlet體統(tǒng)一個(gè)缺省的URL:http://host/WebAppPrefix/servlet/ServletName。需要保證用戶不利用這個(gè)URL訪問(wèn)servlet(這樣會(huì)繞過(guò)過(guò)濾器設(shè)置)。
例如,假如利用filter和filter-mapping指示名為SomeFilter的過(guò)濾器應(yīng)用到名為SomeServlet的servlet,則如下:


     SomeFilter
     somePackage.SomeFilterClass
   

   <!-- ... --&gt
   
     SomeFilter
     SomeServlet
   

接著,用servlet和servlet-mapping規(guī)定URL  http://host/webAppPrefix/Blah 應(yīng)該調(diào)用SomeSerlvet,如下所示:


     SomeServlet
     somePackage.SomeServletClass
   

   <!-- ... --&gt
   
     SomeServlet
     /Blah
   

現(xiàn)在,在客戶機(jī)使用URL  http://host/webAppPrefix/Blah 時(shí)就會(huì)調(diào)用過(guò)濾器。過(guò)濾器不應(yīng)用到
http://host/webAppPrefix/servlet/SomePackage.SomeServletClass。
盡管有關(guān)閉激活器的服務(wù)器專用方法。但是,可移植最強(qiáng)的方法時(shí)重新映射Web應(yīng)用鐘的/servlet模式,這樣使所有包含此模式的請(qǐng)求被送到相同的servlet中。為了重新映射此模式,首先應(yīng)該建立一個(gè)簡(jiǎn)單的servlet,它打印一條錯(cuò)誤消息,或重定向用戶到頂層頁(yè)。然后,使用servlet和servlet-mapping元素發(fā)送包含/servlet模式的請(qǐng)求到該servlet。程序清單9-1給出了一個(gè)簡(jiǎn)短的例子。

程序清單9-1 web.xml(重定向缺省servlet URL的摘錄)
   
   <!DOCTYPE web-app PUBLIC
       "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
       "http://java.sun.com/dtd/web-app_2_3.dtd">
   
   <!-- ... --&gt
   
     Error
     somePackage.ErrorServlet
   

   <!-- ... --&gt
   
     Error
     /servlet/*
   

   <!-- ... --&gt
   


2.  樣例:報(bào)告過(guò)濾器
趁熱打鐵,我們來(lái)試驗(yàn)一個(gè)簡(jiǎn)單的過(guò)濾器,只要調(diào)用相關(guān)的servlet或JSP頁(yè)面,它就打印一條消息到標(biāo)準(zhǔn)輸出。為了完成此任務(wù),相應(yīng)的過(guò)濾器必須具有下面的內(nèi)容:
1)實(shí)現(xiàn)Filter接口的一個(gè)類。這個(gè)類名為ReportFilter,如程序清單9-2所示。這個(gè)類對(duì)init和destroy方法提供空體。
2)在doFilter方法中過(guò)濾行為。每當(dāng)調(diào)用與這個(gè)過(guò)濾器相關(guān)的servlet或JSP頁(yè)面時(shí),doFilter方法就生成一個(gè)打印輸出,此輸出列出請(qǐng)求主機(jī)和調(diào)用的URL。因?yàn)間etRequestURL方法位于HttpServletRequest而不是ServletRequest中,所以把ServletRequest對(duì)象構(gòu)造為HttpServletRequest類型。
3)調(diào)用FilterChain的doFilter方法。在打印輸出報(bào)告后,過(guò)濾器調(diào)用FilterChain的doFilter方法激活servlet或JSP頁(yè)面(如果有的話,調(diào)用下一個(gè)過(guò)濾器)
4)對(duì)Web應(yīng)用主頁(yè)和顯示TodaysSpecialservlet進(jìn)行注冊(cè)。首先,filter元素將名稱Reporter與類moreservlets.filters.ReportFilter相關(guān)聯(lián)。然后,filter-mapping元素使用/index.jsp的url-pattern將過(guò)濾器與主頁(yè)相關(guān)聯(lián)。最后,filter-mapping元素使用TodaysSpecial的servlet-name將過(guò)濾器與TodaysSpecialservlet(名稱TodaysSpecial是在servlet元素中聲明的)相關(guān)聯(lián)。參見(jiàn)程序清單9-3。
5)禁用激活器servlet。首先,建立一個(gè)RedirectorServlet(見(jiàn)程序清單9-6),它把接收到的所有請(qǐng)求重定向到此Web應(yīng)用的主頁(yè)。接著,利用servlet和servlet-mapping元素(參見(jiàn)程序清單9-3)指定所有以http://host/webAppPrefix/servlet/ 開(kāi)始的URL都應(yīng)該激活RedirectorServlet。
給出這些設(shè)置后,每當(dāng)客戶機(jī)請(qǐng)求此Web應(yīng)用主頁(yè)(程序清單9-4)或TodaysSpecialservlet(程序清單9-5)時(shí),都調(diào)用此過(guò)濾器。

程序清單9-2 ReportFilter.java
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(針對(duì)報(bào)告過(guò)濾器的摘錄)
   
   <!DOCTYPE web-app PUBLIC
       "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
       "http://java.sun.com/dtd/web-app_2_3.dtd">
   
     <!-- Register the name "Reporter" for ReportFilter. --&gt
     
       Reporter
       
         moreservlets.filters.ReportFilter
       

     

     <!-- ... --&gt
     <!-- Apply the Reporter filter to home page. --&gt
     
       Reporter
       /index.jsp
     

     <!-- Also apply the Reporter filter to the servlet named
         "TodaysSpecial".
     --&gt
     
       Reporter
       TodaysSpecial
     

     <!-- ... --&gt
   
     <!-- Give a name to the Today's Special servlet so that filters
         can be applied to it.
     --&gt
     
       TodaysSpecial
       
         moreservlets.TodaysSpecialServlet
       

     

     <!-- ... --&gt
   
     <!-- Make /TodaysSpecial invoke the servlet
         named TodaysSpecial (i.e., moreservlets.TodaysSpecial).
     --&gt
     
       TodaysSpecial
       /TodaysSpecial
     

   
     <!-- Turn off invoker. Send requests to index.jsp. --&gt
     
       Redirector
       /servlet/*
     

     <!-- ... --&gt
   


程序清單9-4 index.jsp



Filters 'R' Us
<LINK REL=STYLESHEET
HREF="filter-styles.css"
       TYPE="text/css">



 
Filters 'R' Us


 
   
servlet和JSP過(guò)濾器的作用是什么
   
servlet和JSP過(guò)濾器的作用是什么
   
servlet和JSP過(guò)濾器的作用是什么
 

We specialize in the following:



  • Air filters

  • Coffee filters

  • Pump filters

  • Camera lens filters

  • Image filters for Adobe Photoshop

  • Web content filters

  • Kalman filters

  • Servlet and JSP filters


Check out Today's Special.

undefined


程序清單9-5 TodaysSpecialServlet.java
package moreservlets;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

/** Sample servlet used to test the simple filters. */

public class TodaysSpecialServlet extends HttpServlet {
 private String title, picture;

public void doGet(HttpServletRequest request,
                   HttpServletResponse response)
       throws ServletException, IOException {
   updateSpecials();
   response.setContentType("text/html");
   PrintWriter out = response.getWriter();
   String docType =
       "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 " +
       "Transitional//EN">n";
       out.println
       (docType +
       "n" +
       "Today's Specialn" +
       "n" +
       "

n" +
       "

Today's Special: " + title + "s!

n" +
       "servlet和JSP過(guò)濾器的作用是什么n" +
       "
n" +
       "Special deal: for only twice the price, you cann" +
       "buy one, get one free!.n" +
       "

");
 }

// Rotate among the three available filter images.

private void updateSpecials() {
   double num = Math.random();
   if (num < 0.333) {
     title = "Air Filter";
     picture = "air-filter.jpg";
   } else if (num < 0.666) {
     title = "Coffee Filter";
     picture = "coffee-filter.gif";
   } else {
     title = "Pump Filter";
     picture = "pump-filter.jpg";
   }
 }
}


程序清單9-6 RedirectorServlet.java
package moreservlets;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

/** Servlet that simply redirects users to the
* Web application home page. Registered with the
* default servlet URL to prevent clients from
* using http://host/webAppPrefix/servlet/ServletName
* to bypass filters or security settings that
* are associated with custom URLs.
*/

public class RedirectorServlet extends HttpServlet {
 public void doGet(HttpServletRequest request,
                   HttpServletResponse response)
       throws ServletException, IOException {
   response.sendRedirect(request.getContextPath());
 }

public void doPost(HttpServletRequest request,
                  HttpServletResponse response)
       throws ServletException, IOException {
   doGet(request, response);
 }
}
3.  從過(guò)濾器中訪問(wèn)servlet環(huán)境
前一節(jié)的ReportFilter只要調(diào)用指定的servlet或JSP頁(yè)面,就在標(biāo)準(zhǔn)輸出上打印一個(gè)報(bào)告。當(dāng)你在自己的桌面系統(tǒng)上運(yùn)行一個(gè)服務(wù)器時(shí),一般會(huì)用一個(gè)顯示標(biāo)準(zhǔn)輸出的窗口,在開(kāi)發(fā)過(guò)程中,標(biāo)準(zhǔn)輸出上的報(bào)告很好用。但在部署過(guò)程中,不可能訪問(wèn)這個(gè)窗口。因此,一種自然的改進(jìn)是將報(bào)告寫入servlet日志文件寫到標(biāo)準(zhǔn)輸出。
Servlet API提供了兩個(gè)log方法:一個(gè)取一個(gè)簡(jiǎn)單的String而另一個(gè)取一個(gè)String和一個(gè)Throwable。這兩個(gè)方法都可以從GenericServlet或ServletContext類中使用。關(guān)于這兩個(gè)方法所用的日志文件的準(zhǔn)確位置,請(qǐng)查看相關(guān)服務(wù)器的幫助文檔。問(wèn)題是doFilter方法在與其相關(guān)的serlvet或JSP頁(yè)面之前執(zhí)行。因此,你不能訪問(wèn)該servlet的實(shí)例,從而不能調(diào)用從GenericServlet繼承的log方法。此外,API沒(méi)有體統(tǒng)從doFilter方法中訪問(wèn)ServletContext的簡(jiǎn)單方法??梢栽L問(wèn)ServletContext的方法并且與過(guò)濾器相關(guān)的唯一類是FilterConfig,訪問(wèn)ServletContext的方法為getServletContext。FilterConfig對(duì)象被傳輸給init方法,但不會(huì)自動(dòng)存放到doFilter可使用的某個(gè)位置。
因此,你必須自己存放FilterConfig。可建立一個(gè)FilterConfig類型的字段,然后重載init,將它的參數(shù)分配給該字段。因?yàn)橐话阒皇褂肍ilterConfig對(duì)象來(lái)訪問(wèn)ServletContext和過(guò)濾器名,所以可以存放該ServletContext和名稱在字段中。相面舉一個(gè)例子:
   public class SomeFilter implements Filter {
     protected FilterConfig config;
     private ServletContext context;
     private String filterName;
     public void init(FilterConfig config)
           throws ServletException {
       this.config = config; // In case it is needed by subclass.
       context = config.getServletContext();
       filterName = config.getFilterName();
     }

// doFilter and destroy methods...
   }
4.  例子:日志記錄過(guò)濾器
我們來(lái)更新ReportFilter(程序清單9-2),以便消息進(jìn)入日志文件而不是標(biāo)準(zhǔn)輸出。為了完成這個(gè)任務(wù),過(guò)濾器應(yīng)該具有下列內(nèi)容:
1)實(shí)現(xiàn)Filter接口的一個(gè)類。這個(gè)類名為L(zhǎng)ogFilter,如程序清單9-7所示。這個(gè)類的init方法在過(guò)濾器的字段中存放FilterConfig、ServletContext和過(guò)濾器名。它對(duì)destory方法提供一個(gè)空體。
2)在doFilter方法中過(guò)濾行為。這個(gè)行為和ReportFilter的行為之間有兩點(diǎn)不同:報(bào)告放于日志文件中而不是標(biāo)準(zhǔn)輸出中,報(bào)告包括過(guò)濾器的名稱。
3)調(diào)用FilterChain的doFilter方法。在打印出報(bào)告后,此過(guò)濾器調(diào)用FilterChain的doFilter方法激活鏈中的下一個(gè)過(guò)濾器(如果沒(méi)有更多的過(guò)濾器,則激活servlet或JSP頁(yè)面)。
4)對(duì)所有URL進(jìn)行注冊(cè)。首先,filter元素將名稱LogFilter與類moreservlets.filters.LogFilter相關(guān)聯(lián)。接著,filter-mapping元素使用值為/*的url-pattern將此過(guò)濾器與Web應(yīng)用中所有URL相關(guān)聯(lián)。參看程序清單9-8。
5)禁用激活servlet。這個(gè)操作已經(jīng)在第2節(jié)介紹過(guò),這里就不再重復(fù)了。
當(dāng)這個(gè)Web應(yīng)用部署在一個(gè)外部服務(wù)器上且附加了日志記錄過(guò)濾器后,客戶機(jī)對(duì)此Web應(yīng)用主頁(yè)的請(qǐng)求將在日志文件中產(chǎn)生一個(gè)項(xiàng),如:“audits.irs.gov tired to acces http://www.filtersrus.com/filters/index.jsp on Fri Oct 26 15:16:15 EDT 2001.(Reported by Logger.)”。

程序清單9-7 LogFilter.java
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 in the log file
* whenever the associated servlets or JSP pages
* are accessed.
*/

public class LogFilter implements Filter {
 protected FilterConfig config;
 private ServletContext context;
 private String filterName;
 public void doFilter(ServletRequest request,
                      ServletResponse response,
                      FilterChain chain)
       throws ServletException, IOException {
   HttpServletRequest req = (HttpServletRequest)request;
   context.log(req.getRemoteHost() +
               " tried to access " +
               req.getRequestURL() +
               " on " + new Date() + ". " +
               "(Reported by " + filterName + ".)");
   chain.doFilter(request,response);
 }

public void init(FilterConfig config)
       throws ServletException {
   this.config = config; // In case it is needed by subclass.
   context = config.getServletContext();
   filterName = config.getFilterName();
 }

public void destroy() {}

}


程序清單9-8 web.xml(針對(duì)日志記錄過(guò)濾器的摘錄)

<!DOCTYPE web-app PUBLIC
   "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
   "http://java.sun.com/dtd/web-app_2_3.dtd">

 <!-- ... --&gt

<!-- Register the name "Logger" for LogFilter. --&gt
 
   Logger
   
     moreservlets.filters.LogFilter
   

 

 <!-- ... --&gt

<!-- Apply the Logger filter to all servlets and
 JSP pages.
 --&gt
 
   Logger
   /*
 

<!-- ... --&gt

5.  利用過(guò)濾器的初始化參數(shù)
對(duì)于servlet和JSP頁(yè)面,可通過(guò)提供初始化參數(shù)定制初始化行為。這個(gè)功能之所以游泳的原因在于有三組不同的人員可能希望定制servlet或JSP頁(yè)面的行為,這三組人員分別為:
1)開(kāi)發(fā)人員——他們通過(guò)更改serlvet或JSP頁(yè)面的代碼定制相應(yīng)的行為。
2)最終用戶——他們通過(guò)在HTML表單中輸入值來(lái)定制相應(yīng)的行為。
3)部署人員——這是提供初始化參數(shù)服務(wù)的一組人員。這組人員是那些獲得現(xiàn)存Web應(yīng)用(或個(gè)別的servlet或JSP頁(yè)面)并在一個(gè)定制環(huán)境環(huán)境中部署它們的人員。他們不一定是開(kāi)發(fā)人員,因此期望他們修改servlet和JSP代碼是不現(xiàn)實(shí)的。但由于過(guò)濾器在它們所附加的servlet或JSP頁(yè)面之前執(zhí)行,最終用戶一般不能定制過(guò)濾器的行為,這種能力仍然很有用。定制過(guò)濾器的行為用如下步驟完成:
1)定義初始化參數(shù)。使用web.xml中的filter的init-param子元素以及param-nam和param-value子元素,如下所示。


     SomeFilter
     somePackage.SomeFilterClass
     
       param1
       value1
     

     
       param2
       value2
     

   

2)讀初始化參數(shù)。從過(guò)濾器的inti方法中調(diào)用FilterConfig的getInitParameter方法。如下所示。

public void init(FilterConfig config)
       throws ServletException {
     String val1 = config.getInitParameter("param1");
     String val2 = config.getInitParameter("param2");
     ...
   }

3)分析初始化參數(shù)。就像servlet和JSP的初始化參數(shù)一樣,每個(gè)過(guò)濾器的初始化都是String類型的。因此,如果想要其他類型的值,必須對(duì)它進(jìn)行轉(zhuǎn)換。例如,可用Integer.parseInt將String“7”轉(zhuǎn)換為int 7。在分析時(shí),別忘了檢查缺少的和不良的數(shù)據(jù)。缺少初始化參數(shù)將導(dǎo)致從getInitParameter返回null。即使這些參數(shù)存在,也一個(gè)來(lái)考慮到部署人員不正確地對(duì)其值進(jìn)行格式化的可能性。例如,在轉(zhuǎn)換String類型的值為int類型的值時(shí),應(yīng)該將Integer.parseInt調(diào)用封在try/catch中,這個(gè)塊捕捉NumberFormatException。這種辦法徹底地處理了null和格式化不正確的值。
6.  例子:訪問(wèn)時(shí)的過(guò)濾器
第4節(jié)的LogFilter,每當(dāng)相關(guān)的servlet或JSP頁(yè)面被訪問(wèn)時(shí),就在日志文件中打印一個(gè)項(xiàng)。假如想修改它,使它只注意不尋常時(shí)刻出現(xiàn)的訪問(wèn)。因?yàn)椤安粚こ!币暰唧w情況而定,servlet應(yīng)該提供不尋常時(shí)間范圍的缺省值,并允許部署人員通過(guò)初始化參數(shù)來(lái)重載這些值。為了完成這種功能,相應(yīng)的過(guò)濾器應(yīng)該具有下面的內(nèi)容:
1)實(shí)現(xiàn)Filter接口的一個(gè)類。這個(gè)類名為L(zhǎng)ateAccessFilter,如程序清單9-9所示。這個(gè)類的init方法讀取startTime和endTime初始化參數(shù)。它嘗試作為init分析這些值,如果這些參數(shù)為null或未格式化為整數(shù),這使用缺省值。然后,它將開(kāi)始和結(jié)束事件、FilterConfig、ServletContext以及過(guò)濾器名存入過(guò)濾器的字段。最后,LateAccessFilter對(duì)destroy方法提供一個(gè)空體。
2)在doFilter方法中過(guò)濾行為。這個(gè)方法查找當(dāng)前事件,看它問(wèn)是否在開(kāi)始時(shí)間和結(jié)束事件給出的范圍內(nèi),如果是,打印一個(gè)日志項(xiàng)。
3)調(diào)用FilterChain的doFilter方法。在打印出報(bào)告后,此過(guò)濾器調(diào)用FilterChain的doFilter方法激活鏈中的下一個(gè)過(guò)濾器(如果沒(méi)有更多的過(guò)濾器,則激活servlet或JSP頁(yè)面)。
4)對(duì)Web應(yīng)用主頁(yè)進(jìn)行注冊(cè);定義初始化參數(shù)。首先,filter元素將名稱LateAccessFilter與類moreservlets.filters.LateAccessFilter相關(guān)聯(lián)。filter元素還包含兩個(gè)init-param子元素:一個(gè)定義startTime參數(shù),另一個(gè)定義endTime參數(shù)。因?yàn)閷⒁L問(wèn)filterRus主頁(yè)的人是程序員,考慮反常的時(shí)間范圍為上午2:00到10:00之間。最后,filter-mapping元素使用值為/index.jsp的ulr-pattern子元素,將此過(guò)濾器與Web應(yīng)用主頁(yè)相關(guān)聯(lián)。參看程序清單9-10。
5)己用激活器serlvet。這個(gè)已經(jīng)在第2節(jié)介紹過(guò),不再重復(fù)。
當(dāng)這個(gè)Web應(yīng)用部署在一個(gè)外部服務(wù)器上且附加了日志記錄過(guò)濾器后,客戶機(jī)對(duì)此Web應(yīng)用主頁(yè)的請(qǐng)求將在日志文件中產(chǎn)生一個(gè)項(xiàng),如:“WARNING: hacker6.filtersrus.com accessed http://www.filtersrus.com/filters/index.jsp on Oct 30,2001 9:22:09 AM.”。

程序清單9-9 LateAccessFilter.java
package moreservlets.filters;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
import java.text.*;

/** Filter that keeps track of accesses that occur
* at unusual hours.
*/
public class LateAccessFilter implements Filter {
 private FilterConfig config;
 private ServletContext context;
 private int startTime, endTime;
 private DateFormat formatter;
 public void doFilter(ServletRequest request,
                      ServletResponse response,
                      FilterChain chain)
       throws ServletException, IOException {
   HttpServletRequest req = (HttpServletRequest)request;
   GregorianCalendar calendar = new GregorianCalendar();
   int currentTime = calendar.get(calendar.HOUR_OF_DAY);
   if (isUnusualTime(currentTime, startTime, endTime)) {
     context.log("WARNING: " +
     req.getRemoteHost() +
     " accessed " +
     req.getRequestURL() +
     " on " +
     formatter.format(calendar.getTime()));
   }
   chain.doFilter(request,response);
 }

public void init(FilterConfig config)
       throws ServletException {
   this.config = config;
   context = config.getServletContext();
   formatter =
     DateFormat.getDateTimeInstance(DateFormat.MEDIUM,
   DateFormat.MEDIUM);
   try {
     startTime =
       Integer.parseInt(config.getInitParameter("startTime"));
     endTime =
       Integer.parseInt(config.getInitParameter("endTime"));
   } catch(NumberFormatException nfe) { // Malformed or null
     // Default: access at or after 10 p.m. but before 6 a.m.
     // is considered unusual.
     startTime = 22; // 10:00 p.m.
     endTime = 6; // 6:00 a.m.
   }
 }

public void destroy() {}

// Is the current time between the start and end
 // times that are marked as abnormal access times?

private boolean isUnusualTime(int currentTime,
                               int startTime,
                               int endTime) {
   // If the start time is less than the end time (i.e.,
   // they are two times on the same day), then the
   // current time is considered unusual if it is
   // between the start and end times.
   if (startTime < endTime) {
     return((currentTime >= startTime) &&
     (currentTime < endTime));
   }
   // If the start time is greater than or equal to the
   // end time (i.e., the start time is on one day and
   // the end time is on the next day), then the current
   // time is considered unusual if it is NOT between
   // the end and start times.
   else {
     return(!isUnusualTime(currentTime, endTime, startTime));
   }
 }
}


程序清單9-10 web.xml(針對(duì)訪問(wèn)時(shí)過(guò)濾器的摘錄)

<!DOCTYPE web-app PUBLIC
   "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
   "http://java.sun.com/dtd/web-app_2_3.dtd">

   <!-- ... --&gt

<!-- Register the name "LateAccessFilter" for
       moreservlets.filter.LateAccessFilter.
       Supply two initialization parameters:
       startTime and endTime.
   --&gt
   
     LateAccessFilter
     
       moreservlets.filters.LateAccessFilter
     

     
       startTime
       2
     

     
       endTime
       10
     

   

   <!-- ... --&gt

<!-- Apply LateAccessFilter to the home page. --&gt
   
     LateAccessFilter
     /index.jsp
   

<!-- ... --&gt

感謝各位的閱讀,以上就是“servlet和JSP過(guò)濾器的作用是什么”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)servlet和JSP過(guò)濾器的作用是什么這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

當(dāng)前名稱:servlet和JSP過(guò)濾器的作用是什么
網(wǎng)站網(wǎng)址:http://jinyejixie.com/article6/psicig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)手機(jī)網(wǎng)站建設(shè)、網(wǎng)站建設(shè)網(wǎng)站維護(hù)、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站營(yíng)銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司
昌宁县| 沙湾县| 新民市| 永嘉县| 福建省| 葫芦岛市| 溧阳市| 东丽区| 石柱| 千阳县| 韶山市| 元朗区| 新津县| 宁阳县| 玉门市| 张家港市| 克什克腾旗| 辛集市| 句容市| 仪陇县| 门源| 凤阳县| 道孚县| 囊谦县| 镇宁| 天气| 江阴市| 新建县| 海伦市| 惠安县| 赣州市| 法库县| 台南市| 临泽县| 兴业县| 通河县| 海兴县| 台江县| 西平县| 泊头市| 光山县|