版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第三章Servlet容器模型3.1ServletContext對(duì)象3.2偵聽ServletContext對(duì)象的事件3.3過濾器基本概念當(dāng)servlet容器啟動(dòng)時(shí),它會(huì)初始化每一個(gè)部署好的Web應(yīng)用程序。這時(shí)容器會(huì)為每個(gè)Web應(yīng)用程序創(chuàng)建一個(gè)ServletContext對(duì)象。ServletContext對(duì)象3.1節(jié)我們可以在編寫Servlet代碼時(shí),通過ServletContext對(duì)象獲得與Web應(yīng)用程序相關(guān)的信息。
注意,Web應(yīng)用的信息應(yīng)是其中所有Servlet共享的信息。WebApp1擁有一個(gè)ServletContext對(duì)象WebApp2擁有第二個(gè)ServletContext對(duì)象HelloworldApp擁有第三個(gè)ServletContext對(duì)象Web應(yīng)用程序的初始化參數(shù)ServletContext對(duì)象3.1節(jié)每個(gè)WebApps目錄下的子目錄都被Tomcat看作一個(gè)Web應(yīng)用每個(gè)應(yīng)用都有一個(gè)配置文件,其中存放該應(yīng)用的部署信息,其中包括該應(yīng)用的初始化信息<web-app>
:<context-param><param-name>copyright</param-name><param-value>Copyright2004
</param-value></context-param>
:</web-app>
publicvoiddoGet(……){
:
:
ServletContextcontext=this.getServletContext();Stringc=context.getInitParameter(“copyright”);
:
:}Web應(yīng)用程序的初始化參數(shù)ServletContext對(duì)象3.1節(jié)一、設(shè)置Web應(yīng)用程序上下文初始化參數(shù)在web.xml中,利用<context-param>標(biāo)記來定義Web應(yīng)用上下文參數(shù),它包含兩個(gè)子元素:<param-name>:定義上下文參數(shù)的名稱<param-value>:定義上下文參數(shù)的值Web應(yīng)用程序的初始化參數(shù)ServletContext對(duì)象3.1節(jié)一、設(shè)置Web應(yīng)用程序上下文初始化參數(shù)Web應(yīng)用程序的初始化參數(shù)ServletContext對(duì)象3.1節(jié)一、設(shè)置Web應(yīng)用程序上下文初始化參數(shù)<web-app>
:
:<context-param><param-name>copyright</param-name><param-value>Copyright2004Allrightsarereserved.</param-value></context-param>
:
:</web-app>Web應(yīng)用程序的初始化參數(shù)ServletContext對(duì)象3.1節(jié)二、存取Web應(yīng)用程序上下文初始化參數(shù)
Servlet可通過servlet容器為Web應(yīng)用程序創(chuàng)建的ServletContext對(duì)象來獲取web.xml中所定義的上下文初始化參數(shù)。在Servlet代碼中,獲取ServletContext對(duì)象引用的途徑有兩種:
調(diào)用某Servlet對(duì)象的getServletConfig()方法,獲得容器傳遞給本Servlet的ServletConfig對(duì)象的引用,然后通過該ServletConfig對(duì)象的getServletContext方法獲得ServletContext對(duì)象的引用:
ServletConfig
config=getServletConfig();
ServletContextcontext=config.getServletContext();
直接使用HttpServlet對(duì)象的getServletContext()方法獲得對(duì)ServletContext對(duì)象的引用。
ServletContextsc=getServletContext();Web應(yīng)用程序的初始化參數(shù)ServletContext對(duì)象3.1節(jié)二、存取Web應(yīng)用程序上下文初始化參數(shù)
獲得了對(duì)ServletContext對(duì)象的引用后,我們就可以利用該對(duì)象提供的方法來訪問上下文初始化參數(shù)了。ServletContext的讀取上下文初始化參數(shù)的方法與Servelt讀取Servlet初始化參數(shù)的方法相似。publicStringgetInitParameter(String
name)
返回由name指定的上下文初始化參數(shù)的數(shù)值,例如:
Stringcopyright=context.getInitParameter(“copyright”);
本調(diào)用將返回在web.xml文件中定義的值
"Copyright2004Allrightsarereserved."。publicjava.util.Enumeration
getInitParameterNames()ServletContext對(duì)象的方法和屬性
ServletContext對(duì)象3.1節(jié)獲取與服務(wù)器相關(guān)信息讀寫上下文初始設(shè)置參數(shù)屬性設(shè)置本地資源路徑相關(guān)記錄日志ServletContext對(duì)象的方法和屬性ServletContext對(duì)象3.1節(jié)一、獲取服務(wù)器相關(guān)的信息publicStringgetServerInfo()方法
返回Servlet容器的名稱和版本號(hào),例如在JBuilder9.0默認(rèn)的tomcat平臺(tái)上運(yùn)行的返回值是ApacheTomcat/4.0.6。
publicStringgetServletContextName()方法
返回Web應(yīng)用程序的名字,這個(gè)名字在web.xml中用<display-name>元素指定。如返回“HelloworldApp”。
publicint
getMajorVersion()、publicint
getMinorVersion()方法
分別返回Web服務(wù)器所支持的JavaServletAPI的主版本號(hào)和次版本號(hào),在Tomcat4.0.6服務(wù)器上支持的是ServletAPI2.3版本,所以前者返回2,后者返回3。ServletContext對(duì)象的方法和屬性ServletContext對(duì)象3.1節(jié)二、存取Web應(yīng)用程序上下文初始化參數(shù)publicStringgetInitParameter(String
name)
返回由name指定的上下文初始化參數(shù)的數(shù)值。
publicjava.util.Enumeration
getInitParameterNames()
本方法返回在web.xml中定義的所有上下文初始化參數(shù)的名字組成的枚舉表。當(dāng)我們不知道上下文參數(shù)的名稱時(shí)可以使用本方法。ServletContext對(duì)象的方法和屬性ServletContext對(duì)象3.1節(jié)三、ServletContext屬性管理publicvoidsetAttribute(String
name,Object
object)
把一個(gè)對(duì)象綁定到一個(gè)用name指定名稱的上下文屬性上,該對(duì)象將成為ServletContext對(duì)象的一個(gè)屬性,在整個(gè)Web應(yīng)用范圍內(nèi)所有的servlet都可以用getAttribute()方法讀取。例如:
ServletContextcontext=getServletContext();
context.setAttribute("category",productCategory);publicObjectgetAttribute(String
name)
返回按name指定的上下文屬性的對(duì)象,如果調(diào)用之前沒有使用setAttribute()方法設(shè)定name指定的屬性,將返回null。例如:
ServletContextcontext=getServletContext();
CategoryproductCatory=(Category)context.getAttribute("category");publicEnumerationgetAttributeNames()
返回一個(gè)Enumeration,其中包含所有的上下文屬性的名稱。publicvoidremoveAttribute(String
name)
讓name指定的上下文屬性不可用,此后如果用getAttribute()方法返回此屬性將返回null。ServletContext對(duì)象的方法和屬性ServletContext對(duì)象3.1節(jié)四、與本地資源路徑相關(guān)的方法
publicStringgetRealPath(String
path)
返回path指定的虛擬路徑在服務(wù)器上的實(shí)際物理路徑。
public.URL
getResource(Stringpath)
throws.MalformedURLException
取得由path指定的路徑下的數(shù)據(jù)文件,此方法將返回一個(gè)URL對(duì)象。
publicjava.io.InputStream
getResourceAsStream(java.lang.String
path)
取得由path指定的服務(wù)器所在操作系統(tǒng)下的資源文件,此方法將返回一個(gè)InputStream對(duì)象。ServletContext對(duì)象的方法和屬性ServletContext對(duì)象3.1節(jié)五、日志publicvoidlog(String
msg)
向Servlet日志文件寫入一條消息
publicvoidlog(String
message,Throwable
throwable)
既在日志中寫入一條消息,又寫入Throwable異常的棧跟蹤信息。
以Tomcat服務(wù)器為例,日志文件位于<Tomcat目錄>\logs目錄下。日志文件的命名格式為:localhost_log.<日期>.txt,例如localhost_log.2004-3-4.txt。第三章Servlet容器模型3.1ServletContext對(duì)象3.2偵聽ServletContext對(duì)象的事件3.3過濾器基本概念監(jiān)聽ServletContext對(duì)象事件3.2節(jié)生命周期
ServletContext的生命周期與Web應(yīng)用的生命周期是一致的。
事件
在ServletContext生命周期中,一般會(huì)有很多事件發(fā)生。Servlet容器對(duì)ServletContext對(duì)象的操作,如初始化、銷毀、添加或刪除屬性等,都會(huì)觸發(fā)事件。
偵聽事件如果Web應(yīng)用程序需要監(jiān)視Servlet的上下文環(huán)境的變更,那么就需要編寫一個(gè)實(shí)現(xiàn)ServletContextListener接口的Java類;
若監(jiān)視綁定到ServletContext對(duì)象上的屬性的變化,那么就需要編寫一個(gè)實(shí)現(xiàn)ServletContextAttributeListener接口的Java類;需要用Servlet容器注冊(cè)這些偵聽類(即在web.xml文件中配置)ServletContextListener偵聽器監(jiān)聽ServletContext對(duì)象事件3.2節(jié)ServletContextListener偵聽器可以為Web應(yīng)用部署實(shí)現(xiàn)ServletContextListener接口的類來達(dá)到監(jiān)視Web應(yīng)用程序生命周期的目的。該類稱為ServletContextListener偵聽器。javax.servlet.ServletContextListener接口publicvoidcontextInitialized(ServletContextEvent
sce)
在Web應(yīng)用的初始化階段,servlet容器調(diào)用ServletContextListener對(duì)象的本方法,通知偵聽器ServletContext對(duì)象進(jìn)入初始化階段。publicvoidcontextDestroyed(ServletContextEvent
sce)
在Web應(yīng)用的結(jié)束階段,servlet容器會(huì)調(diào)用ServletContextListener對(duì)象的本方法,通知偵聽器ServletContext對(duì)象進(jìn)入銷毀階段。ServletContextListener偵聽器監(jiān)聽ServletContext對(duì)象事件3.2節(jié)啟動(dòng)Servlet容器時(shí),Servlet容器為每個(gè)包含Servlet的Web應(yīng)用實(shí)例化一個(gè)ServletContext對(duì)象啟動(dòng)Servlet容器時(shí),Servlet容器還根據(jù)部署描述符,為每個(gè)Web應(yīng)用實(shí)例化各種偵聽器。隨后,容器向其下所有Web應(yīng)用的ServletContextlistener偵聽器發(fā)送contextInitialized事件消息。當(dāng)Servlet容器關(guān)閉時(shí),Servlet容器向容器中所有應(yīng)用的ServletContextlistener偵聽器發(fā)送contextDestroyed事件消息。ServletContextListener偵聽器監(jiān)聽ServletContext對(duì)象事件3.2節(jié)ServletContextEvent對(duì)象
在上述兩個(gè)事件中,容器通過傳遞ServletContextEvent對(duì)象來告訴偵聽器發(fā)生的事件的具體信息。ServletContextEvent是一個(gè)事件類。當(dāng)Web應(yīng)用程序啟動(dòng)或關(guān)閉時(shí),Servlet容器將事件包裝成ServletContextEvent對(duì)象,并將該對(duì)象作為參數(shù)傳遞給ServletContext對(duì)象的偵聽器類的兩個(gè)方法。ServletContextEvent對(duì)象提供了一個(gè)getServletContext()方法,偵聽器可以用它來獲得對(duì)觸發(fā)該事件的ServletContext對(duì)象的引用:
publicServletContext
getServletContext();ServletContextListener偵聽器監(jiān)聽ServletContext對(duì)象事件3.2節(jié)publicclassContextListenerimplementsServletContextListener{publicvoidcontextInitialized(ServletContextEvent
sce){
ServletContextcontext=sce.getServletContext();
context.log(context.getServletContextName()+"initialated.");}publicvoidcontextDestroyed(ServletContextEvent
sce){
ServletContextcontext=sce.getServletContext();
context.log("context.getServletContextName()+"destroyed.");}}ServletContext的初始化事件處理函數(shù)從事件對(duì)象sce中獲取當(dāng)前ServletContext對(duì)象的引用調(diào)用ServletContext的log方法,將ServletContext名字寫入日志。ServletContextListener偵聽器監(jiān)聽ServletContext對(duì)象事件3.2節(jié)ServletContextListener偵聽器的部署:在web.xml文件中,用<listener>元素進(jìn)行定義,用<listener-class>子元素指定偵聽器的實(shí)現(xiàn)類。Servlet容器啟動(dòng)時(shí),會(huì)根據(jù)web.xml文件內(nèi)容,創(chuàng)建一個(gè)偵聽器的實(shí)例并注冊(cè)該偵聽器。當(dāng)ServletContext發(fā)生了相應(yīng)的事件時(shí)就通知偵聽器進(jìn)行處理。<listener>
<listener-class>
com.mycompany.servlet.ContextListener
</listener-class>
</listener>ServletContextListener偵聽器監(jiān)聽ServletContext對(duì)象事件3.2節(jié)ServletContextListener偵聽器的測(cè)試:1、在Tomcat中部署包含偵聽器的Web應(yīng)用;
2、啟動(dòng)Tomcat,則偵聽器就會(huì)在日志文件中添加一行信息;
3、關(guān)閉Tomcat,偵聽器同樣會(huì)在日志文件中添加一行信息。:
2004-11-0211:38:50ContextLifeCycle
initialated.
:2004-11-0211:39:22ContextLifeCycledestroyed.
:當(dāng)調(diào)用ServletContext對(duì)象的setAttribute()方法改變已經(jīng)綁定到ServletContext對(duì)象的某個(gè)屬性的值的時(shí)候,容器會(huì)調(diào)用偵聽器的該方法。ServletContextAttributeListener偵聽器監(jiān)聽ServletContext對(duì)象事件3.2節(jié)ServletContextAttributeListener偵聽器ServletContext的屬性是由Web應(yīng)用程序中所有的servlet所共享的。為保證屬性在整個(gè)Web應(yīng)用范圍內(nèi)的一致性,有必要監(jiān)視ServletContext對(duì)象的任何屬性的改變。
ServletContextAttributeListener偵聽器就是為了這一目的而設(shè)立的。該偵聽器是一個(gè)實(shí)現(xiàn)了接口ServletContextAttributeListener的Java類。ServletContextAttributeListener接口publicvoidattributeAdded(ServletContextAttributeEvent
scab)publicvoidattributeRemoved(ServletContextAttributeEvent
scab)publicvoidattributeReplaced(ServletContextAttributeEvent
scab)當(dāng)調(diào)用ServletContext對(duì)象的setAttribute()方法將某個(gè)屬性綁定到ServletContext對(duì)象時(shí),容器會(huì)調(diào)用偵聽器的該方法。當(dāng)調(diào)用ServletContext對(duì)象的removeAttribute()方法將某個(gè)屬性從ServletContext對(duì)象中刪除時(shí),容器會(huì)調(diào)用偵聽器的這個(gè)方法。當(dāng)調(diào)用ServletContext對(duì)象的setAttribute()方法將某個(gè)屬性綁定到ServletContext對(duì)象時(shí),容器會(huì)調(diào)用偵聽器的attributeAdded方法。ServletContextAttributeListener偵聽器監(jiān)聽ServletContext對(duì)象事件3.2節(jié)當(dāng)調(diào)用ServletContext對(duì)象的setAttribute()方法改變已經(jīng)綁定到ServletContext對(duì)象的某個(gè)屬性的值的時(shí)候,容器會(huì)調(diào)用偵聽器的這個(gè)方法。當(dāng)調(diào)用ServletContext對(duì)象的removeAttribute()方法將某個(gè)屬性從ServletContext對(duì)象中刪除時(shí),容器會(huì)調(diào)用偵聽器的這個(gè)方法。ServletContextAttributeListener偵聽器監(jiān)聽ServletContext對(duì)象事件3.2節(jié)ServletContextAttributeEvent類
在上述三個(gè)事件中,容器通過傳遞ServletContextAttributeEvent對(duì)象來告訴偵聽器發(fā)生的事件的具體信息。ServletContextAttributeEvent類是一個(gè)事件類。
當(dāng)Servlet容器捕獲對(duì)ServletContext屬性的操作事件時(shí),它將事件包裝成一個(gè)ServletContextAttributeEvent對(duì)象,并將該對(duì)象作為參數(shù)傳遞給屬性偵聽器類的三個(gè)方法。ServletContextAttributeEvent類繼承自ServletContextEvent類。
除了getServletContext()方法,還包含StringgetName()
返回正在創(chuàng)建、替換或者刪除的屬性的名稱ObjectgetValue()
返回正在創(chuàng)建、替換或者刪除的屬性的對(duì)象值。ServletContextAttributeListener偵聽器監(jiān)聽ServletContext對(duì)象事件3.2節(jié)publicclassContextListenerimplementsServletContextAttributeListener{publicvoidattributeAdded(ServletContextAttributeEventscab){
ServletContextcontext=scab.getServletContext();
context.log(scab.getName()+“setto"+scab.getValue().toString());}publicvoidattributeRemoved(ServletContextAttributeEventscab){
ServletContextcontext=scab.getServletContext();
context.log(scab.getName()+"removed.");}publicvoidattributeReplaced(ServletContextAttributeEventscab){
ServletContextcontext=scab.getServletContext();
context.log(scab.getName()+"replacedto"+scab.getValue().toString());}}當(dāng)調(diào)用ServletContext對(duì)象的setAttribute()方法將某個(gè)屬性綁定到ServletContext對(duì)象時(shí),容器會(huì)調(diào)用偵聽器的該方法。獲取ServletContext對(duì)象的引用利用獲得的ServletContext對(duì)象,將事件對(duì)象的信息寫入日志。ServletContextAttributeListener偵聽器監(jiān)聽ServletContext對(duì)象事件3.2節(jié)ServletContextAttributeListener偵聽器的部署
在web.xml文件中,用<listener>元素進(jìn)行定義,用<listener-class>子元素指定偵聽器的實(shí)現(xiàn)類。<listener><listener-class>
com.mycompany.servlet.MyAttributeListener</listener-class></listener>第三章Servlet容器模型3.1ServletContext對(duì)象3.2偵聽ServletContext對(duì)象的事件3.3過濾器應(yīng)用場景一過濾器3.3節(jié)MyCompany公司在使用Tomcat網(wǎng)站和Servlet技術(shù)發(fā)布他們的產(chǎn)品。最近發(fā)現(xiàn)該網(wǎng)站的Web應(yīng)用“Admin”有安全方面的設(shè)計(jì)漏洞。公司希望有一種解決方案,在所有用戶訪問Web應(yīng)用“Admin”前,根據(jù)訪問者的請(qǐng)求信息,對(duì)訪問者的身份進(jìn)行驗(yàn)證。
公司有以下要求:公司不打算對(duì)“Admin”本身進(jìn)行重新設(shè)計(jì),而是用“打補(bǔ)丁”方式完成。希望支持首先實(shí)現(xiàn)的身份驗(yàn)證方式是用戶名/密碼驗(yàn)證。但公司希望在不久的將來,可以方便地增加其他更安全的身份驗(yàn)證方式??梢詫⒂脩舻恼?qǐng)求信息記錄到管理日志中。MySearch是一家提供搜索服務(wù)的公司,用戶可以在網(wǎng)上訪問其搜索主頁http://www.MyS/Search,輸入關(guān)鍵字表達(dá)式來搜索自己需要的資源。/Search將該表達(dá)式進(jìn)行分析后轉(zhuǎn)發(fā)給Google、YaHoo!等合作伙伴。公司最近使用Servlet技術(shù)將其/Search應(yīng)用重新進(jìn)行了設(shè)計(jì)。為了過濾掉對(duì)某些不健康關(guān)鍵字的搜索,公司希望為/Search應(yīng)用添加請(qǐng)求過濾功能。應(yīng)用場景二過濾器3.3節(jié)基本概念過濾器3.3節(jié)過濾器(Filter)
過濾器是Servlet2.3技術(shù)規(guī)范引入了一種新的Web應(yīng)用程序組件。過濾器位于客戶和基層Web應(yīng)用程序之間,用于檢查和修改兩者之間流過的請(qǐng)求和響應(yīng)。過濾器作為一種Web應(yīng)用程序組件,可以傳輸或者修改用戶請(qǐng)求與servlet響應(yīng)。它可以在用戶請(qǐng)求到達(dá)servlet之前對(duì)請(qǐng)求進(jìn)行處理,也可以在響應(yīng)離開servlet之后修改響應(yīng)信息。在請(qǐng)求到達(dá)servlet之前,過濾器可以截取該請(qǐng)求并檢查請(qǐng)求內(nèi)容。除了檢查之外,還可以定制請(qǐng)求,如修改請(qǐng)求標(biāo)題或者請(qǐng)求數(shù)據(jù)等。具體的方法是對(duì)傳遞過來的ServletRequest對(duì)象進(jìn)行操作,達(dá)到檢查和修改的目的。被過濾器處理后的請(qǐng)求發(fā)給servletservlet執(zhí)行其任務(wù)并可能產(chǎn)生響應(yīng)。過濾器可以截獲響應(yīng)信息并進(jìn)行修改,例如修改響應(yīng)標(biāo)題或者響應(yīng)數(shù)據(jù)。具體的方法是通過操作servlet對(duì)象傳遞給它的ServletResponse對(duì)象來達(dá)到目的。處理完畢之后將修改后的響應(yīng)信息發(fā)送給客戶端?;靖拍钸^濾器3.3節(jié)可以過濾的響應(yīng)流在過濾器截獲響應(yīng)對(duì)象的時(shí)候,如果輸出流被servlet關(guān)閉了,那么過濾器就不能夠再改變輸出流中的響應(yīng)信息。因此如果需要修改響應(yīng)信息,在servlet的實(shí)現(xiàn)代碼中,應(yīng)當(dāng)是使用刷新輸出流,而不能夠關(guān)閉輸出流。如:PrintWriterout=response.getPrintWriter();…out.flush();//如果希望有過濾器截獲并處理響應(yīng)信息,此處不能用out.close()代替out.flush()?;靖拍钸^濾器3.3節(jié)過濾器鏈我們可以實(shí)現(xiàn)多個(gè)過濾器,這些過濾器就形成了一個(gè)“過濾器鏈”,過濾器鏈的實(shí)現(xiàn)與維護(hù)工作是由servlet容器負(fù)責(zé)實(shí)現(xiàn)的。過濾器鏈中不同過濾器的先后順序是在部署文件web.xml中設(shè)定的。最先截取客戶請(qǐng)求的過濾器將最后才能截取servlet響應(yīng)信息。創(chuàng)建過濾器LogFilter過濾器3.3節(jié)過濾器是一個(gè)簡單的Java類,它的主要特征是實(shí)現(xiàn)了Filter接口:packagefilters;
importjava.io.*;importjavax.servlet.*;importjavax.servlet.http.*;
publicfinalclassLogFilter
implementsFilter{
:
:
:}FilterChain參數(shù)對(duì)于正確的過濾器操作至關(guān)重要,F(xiàn)ilterChain對(duì)象代表了多個(gè)過濾器形成的過濾器鏈。為了將請(qǐng)求/響應(yīng)沿過濾器鏈繼續(xù)傳送,在每個(gè)過濾器的doFilter方法中必須調(diào)用FilterChain對(duì)象的doFilter方法。Web容器調(diào)用本方法,說明過濾器正被嵌入到Web容器中去。容器只在實(shí)例化過濾器時(shí)才會(huì)調(diào)用該方法一次。初始化方法必須在被調(diào)用做過濾工作前正確完成。容器為這個(gè)方法傳遞一個(gè)FilterConfig對(duì)象,其中包含著與Filter相關(guān)的配置信息。每當(dāng)請(qǐng)求和響應(yīng)經(jīng)過過濾器鏈時(shí),容器都要調(diào)用一次該方法。需要注意的是過濾器的一個(gè)實(shí)例可以同時(shí)服務(wù)于多個(gè)請(qǐng)求,因此,特別需要注意多線程的同步問題。過濾器API過濾器3.3節(jié)Filter接口所有過濾器都必須實(shí)現(xiàn)javax.servlet.Filter接口。該接口定義了三個(gè)方法,這三個(gè)方法分別在過濾器生命周期的不同階段被調(diào)用:publicvoidinit(FilterConfig
filterConfig)
publicvoiddoFilter(ServletRequest
req,ServletResponse
res,FilterChain
chain)
publicvoiddestroy()過濾器的doFilter()方法實(shí)現(xiàn)中,任何出現(xiàn)在FilterChain的doFilter方法之前的代碼都被看作為預(yù)處理過濾器邏輯,在這一階段,進(jìn)入的請(qǐng)求是可用的,可在這里對(duì)請(qǐng)求進(jìn)行修改,但不能修改響應(yīng)信息,因?yàn)閃eb資源的響應(yīng)處理還沒有發(fā)生。任何出現(xiàn)在FilterChain的doFilter()方法之后的代碼構(gòu)成了過濾器邏輯的后期處理。在這一階段中,外發(fā)的來意Web資源的響應(yīng)信息已經(jīng)處理完畢,可以在這里修改響應(yīng)信息。此時(shí)修改請(qǐng)求沒有任何意義,因?yàn)檎?qǐng)求已經(jīng)處理完畢。最后被調(diào)用的方法是destroy()方法。該方法同樣由servlet容器調(diào)用,指出將從服務(wù)中刪除該過濾器。如果過濾器使用了其他資源,需要在這個(gè)方法中釋放這些資源。過濾器API過濾器3.3節(jié)FilterConfig接口當(dāng)容器對(duì)Filter對(duì)象進(jìn)行初始化時(shí),容器調(diào)用Filter的init方法,并傳入一個(gè)實(shí)現(xiàn)FilterConfig接口的對(duì)象。Filter可使用該對(duì)象獲得一些有用的信息。FilterConfig接口包含以下方法:publicStringgetFilterName()
publicStringgetInitParamter(Stringname)
publicEnumerationgetInitParamterNames()publicServletContext
getServletContext()獲得過濾器的名稱信息。該名稱是在部署描述符中說明的。獲得過濾器的初始化字符串。初始化字符串也是在部署描述符中說明的。獲得一個(gè)枚舉器,以遍歷過濾器的所有初始化字符串。獲得過濾器所在Web應(yīng)用的ServletContext對(duì)象引用。過濾器API過濾器3.3節(jié)FilterChain接口對(duì)于一個(gè)Servlet,用戶可以定義多個(gè)Filter。這些Filter由容器組織成一個(gè)過濾器鏈。在每個(gè)Filter對(duì)象中,可以使用容器傳入doFilter方法的FilterChain參數(shù)引用該過濾器鏈。FilterChain接口定義了一個(gè)doFilter方法,用于將請(qǐng)求/響應(yīng)繼續(xù)沿鏈向后傳送。publicvoiddoFilter(ServletRequest
req,ServletResponse
res)
實(shí)現(xiàn)過濾器LogFilter過濾器3.3節(jié)LogFilter的init方法的實(shí)現(xiàn)//保存容器傳遞給過濾器的FilterConfig對(duì)象FilterConfig
filterConfig=null;//過濾器生成時(shí)由容器調(diào)用publicvoidinit(FilterConfig
filterConfig)throwsServletException{
this.filterConfig=filterConfig;//保存容器傳來的FilterConfig對(duì)象的引用}實(shí)現(xiàn)過濾器LogFilter過濾器3.3節(jié)LogFilter的Destroy方法的實(shí)現(xiàn)//過濾器被銷毀前由容器調(diào)用該方法,釋放過濾器占用的資源publicvoiddestroy(){
filterConfig=null;//過濾器銷毀之前釋放filterConfig對(duì)象,進(jìn)行垃圾回收}LogFilter的DoFilter方法的實(shí)現(xiàn)
//當(dāng)有請(qǐng)求來臨時(shí),請(qǐng)求通過本方法進(jìn)入過濾器publicvoiddoFilter(ServletRequestrequest,ServletResponse
response,FilterChainchain)
throwsIOException,ServletException
{
longstartTime=System.currentTimeMillis();//訪問時(shí)間戳
StringremoteAddress=request.getRemoteAddr();//從請(qǐng)求獲取遠(yuǎn)程地址
StringremoteHost=request.getRemoteHost();//從請(qǐng)求獲取遠(yuǎn)程主機(jī)名
HttpServletRequest
httpRequest=(HttpServletRequest)request;
StringreqURI=httpRequest.getRequestURI();//客戶請(qǐng)求的資源URI
Stringbrowser=httpRequest.getHeader(“User-Agent”);//客戶使用的瀏覽器
chain.doFilter(request,response);
longendTime=System.currentTimeMillis();
longworkTime=endTime-startTime;
ServletContextsc=filterConfig.getServletContext();
sc.log("RequestfromIP:"+remoteAddress+"("+remoteHost+")"+//寫入日志
"Usingbrowser("+browser+")"+"andwantedtoaccessresource"+
reqURI+"andused"+workTime+"ms");
}對(duì)請(qǐng)求對(duì)象進(jìn)行以下預(yù)處理邏輯:存儲(chǔ)當(dāng)前時(shí)間,表示客戶請(qǐng)求到達(dá)的時(shí)間;從ServletRequest對(duì)象中獲取客戶的遠(yuǎn)程地址、遠(yuǎn)程主機(jī)名、客戶請(qǐng)求資源的URI,然后通過讀取USER-AGENT標(biāo)題獲得客戶端瀏覽器的類型。預(yù)處理邏輯完成后,必須調(diào)用下游過濾器。這只需要簡單的調(diào)用FilterChain對(duì)象的doFilter()方法:chain.doFilter(request,response);下游的doFilter()方法調(diào)用返回后,我們就可以處理后期邏輯了。后期邏輯處理。這時(shí)請(qǐng)求已經(jīng)被目標(biāo)servlet響應(yīng)并產(chǎn)生了響應(yīng)信息包裝在ServletResponse對(duì)象中。如果有必要的話,可以在后續(xù)的代碼中繼續(xù)對(duì)響應(yīng)信息進(jìn)行處理,這時(shí)需注意,應(yīng)保證不要使用Close方法將輸出流關(guān)閉,而是使用Flush方法部署過濾器過濾器3.3節(jié)
在創(chuàng)建過濾器之后必須將它添加到部署描述符中,這樣容器才會(huì)將過濾器投入到服務(wù)中去。
配置工作由兩部分組成。
聲明過濾器設(shè)置過濾器映射部署過濾器過濾器3.3節(jié)一、聲明過濾器<filter> <filter-name>LogFilter</filter-name> <filter-class>filters.LogFilter</filter-class> <init-param>
<param-name>filterVersion</param-name> <param-value>1.0</param-value>
<init-param>
<init-param>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年陜西陜能投資管理有限公司招聘筆試參考題庫含答案解析
- 2025年浙江海寧鵑湖科技城開發(fā)投資有限責(zé)任公司招聘筆試參考題庫附帶答案詳解
- 2025年度店面租賃合同附贈(zèng)營銷活動(dòng)支持服務(wù)2篇
- 江蘇省常州市2024-2025學(xué)年第一學(xué)期高三期末質(zhì)量調(diào)研語文試題及答案解析
- 2025年個(gè)人所得稅贍養(yǎng)老人子女贍養(yǎng)義務(wù)協(xié)議書4篇
- 2024年科普知識(shí)競賽試題庫及答案(共50題)
- 2025版?zhèn)€人入股協(xié)議書模板及股權(quán)變更流程指南3篇
- 觀瀾湖圣安德魯斯別墅營銷策劃報(bào)告
- 二零二五年度廚師職業(yè)資格認(rèn)證聘用合同3篇
- 2025年智慧城市建設(shè)項(xiàng)目合同范本2篇
- GB/T 16895.3-2024低壓電氣裝置第5-54部分:電氣設(shè)備的選擇和安裝接地配置和保護(hù)導(dǎo)體
- 安徽省合肥市2025年高三第一次教學(xué)質(zhì)量檢測(cè)地理試題(含答案)
- 計(jì)劃合同部部長述職報(bào)告范文
- 統(tǒng)編版八年級(jí)下冊(cè)語文第三單元名著導(dǎo)讀《經(jīng)典常談》閱讀指導(dǎo) 學(xué)案(含練習(xí)題及答案)
- 風(fēng)光儲(chǔ)儲(chǔ)能項(xiàng)目PCS艙、電池艙吊裝方案
- 人教版高一地理必修一期末試卷
- GJB9001C質(zhì)量管理體系要求-培訓(xùn)專題培訓(xùn)課件
- 二手車車主寄售協(xié)議書范文范本
- 窗簾采購?fù)稑?biāo)方案(技術(shù)方案)
- 基于學(xué)習(xí)任務(wù)群的小學(xué)語文單元整體教學(xué)設(shè)計(jì)策略的探究
- 人教版高中物理必修一同步課時(shí)作業(yè)(全冊(cè))
評(píng)論
0/150
提交評(píng)論