-
過濾器鏈(Web項目支持多個過濾器)
定義:如果兩個或者多個過濾器攔截的URL路徑規(guī)則不同,則互不影響,如果相同,就構(gòu)成了過濾器鏈。
過濾器鏈
過濾器鏈執(zhí)行過程
問題:
1、Web項目中多個過濾器是如何實現(xiàn)的?
2、多個過濾器對應(yīng)同一個用戶路徑執(zhí)行順序如何?
注意:過濾器的初始化方法是按照filter-name的字母排序的,排在后面的字母先加載初始化方法。
查看全部 -
過濾器案例
知識點1:實現(xiàn)過濾器功能,前提是實現(xiàn)javax.servlet.Filter這個接口。
知識點2:實現(xiàn)Filter接口的三個方法簡介。
【a】init():過濾器的初始化方法,Web容器創(chuàng)建過濾器實例后將調(diào)用這個方法,這個方法通過方法參數(shù)FilterConfig可以讀取web.xml文件中的過濾器的參數(shù)。
【b】doFilter():該方法完成實際過濾操作,過濾器的核心方法,當(dāng)用戶請求訪問與過濾器關(guān)聯(lián)的URL時,Web容器將先調(diào)用該方法。FilterChain參數(shù)可以調(diào)用chain.doFilter方法,將請求傳給下一個過濾器(或目標(biāo)資源),或利用轉(zhuǎn)發(fā)、重定向?qū)⒄埱筚Y源轉(zhuǎn)發(fā)到其他資源。
【c】destory():Web容器在銷毀過濾器實例前調(diào)用該方法,在這個方法中可以釋放過濾器占用的資源。(多數(shù)情況用不到)
Web.xml中過濾器的配置(filterChain.doFilter(servletRequest, servletResponse)相當(dāng)于訪問目標(biāo)資源)
問題環(huán)節(jié):
【1】過濾器是否能改變用戶請求的Web資源呢?也就是能否改變用戶請求的路徑?
答:可以,比如:登錄,檢測到不符合要求,則可以跳轉(zhuǎn)到登陸頁面。
【2】過濾器能否直接返回數(shù)據(jù),能不能直接處理用戶請求?
答:不可以,因為Filter不是標(biāo)準(zhǔn)的Servlet,不能把數(shù)據(jù)直接返回到用戶請求,只能跳轉(zhuǎn)到Web請求的資源,或者跳轉(zhuǎn)、重定向到其他的Web資源。
查看全部 -
過濾器的工作原理和生命周期
工作原理:
生命周期:(分為4種)
【a】實例化:Web容器通過Web.xml配置,啟動Web容器時會自動加載過濾器,只會實例化一次。
【b】初始化:加載一些初始化信息,調(diào)用過濾器的init()方法,進行初始化的一些相關(guān)操作,只會執(zhí)行一次。
【c】過濾:調(diào)用過濾器中的doFilter()方法,執(zhí)行n次的,捕獲的每一個請求都會執(zhí)行該方法。
【d】銷毀:調(diào)用過濾器的destory()方法,當(dāng)Web容器關(guān)閉時,調(diào)用該方法。
查看全部 -
Java Web過濾器簡介:過濾用戶請求(不符合規(guī)則的進行一定處理)。
過濾器定義:服務(wù)器端的組件(因為請求都必須要到達服務(wù)器端,然后再進行返回),可以截取用戶端的請求與響應(yīng)信息,并對這些信息過濾。
常用操作:
1、通過過濾器可以實現(xiàn)權(quán)限功能(判斷是否登錄狀態(tài),同一頁面登錄前和登錄后擁有不同顯示效果)。
2、當(dāng)訪問一個界面,結(jié)果找不到的時候,就會提示錯誤,可以通過過濾器做一些人性化的提示,提高用戶體驗。
課程目標(biāo):
一:工作原理
二:生命周期(包括哪些生命周期,以及每個生命周期都要執(zhí)行哪些方法)
三:過濾器分幾種類型(根據(jù)不同業(yè)務(wù)請求,有不同的過濾器)
四:登錄驗證及編碼轉(zhuǎn)換演示兩個實戰(zhàn)案例
查看全部 -
過濾器的生命周期查看全部
-
過濾器的異步處理:
查看全部 -
總結(jié): 過濾器的生命周期: 實例化(web.xml)--〉初始化(init())--〉過濾(doFilter())--〉銷毀(destory()) 1.過濾器的概念: ? ? 過濾器是一個服務(wù)器端的組件,它可以截取用戶端的請求與響應(yīng)信息,并對這些信息過濾。 1.概念:過濾器是一個服務(wù)器上的組件,它可以截取用戶端的請求和相應(yīng)信息,并對其過濾 2.工作原理: 用戶請求--〉過濾器將用戶請求發(fā)送至Web資源--〉web資源--〉web響應(yīng)發(fā)送至過濾器--〉過濾器--〉過濾器將web的響應(yīng)返回給用戶 3.過濾器的生命周期: 實例化(web.xml)--〉初始化(init())--〉過濾(doFilter())--〉銷毀(destory()) 4.過濾器的API: init()、doFilter()、destory() 5.多個過濾器(過濾器鏈) 6.過濾器分類 7.過濾器實例:登錄過濾器和編碼過濾器 服務(wù)器會按照web.xml中過濾器定義的先后順序組裝成一條鏈
查看全部 -
@JavaWeb----過濾器編碼轉(zhuǎn)換
在web.xml中配置
<filter>
??? <filter-name>LoginFilter</filter-name>
??? <filter-class>com.filter.LoginFilter</filter-class>
??? <!-- 指定部分頁面,在代碼中實現(xiàn)對這些頁面放行 -->
??? <init-param>
????? <param-name>noLoginPaths</param-name>
????? <param-value>index.jsp;login.jsp;LoginServlet;fail.jsp</param-value>
??? </init-param>
??? <init-param>
????? <param-name>charset</param-name>
????? <param-value>UTF-8</param-value>
??? </init-param>
</filter>在Filter中
private FilterConfig config = null;public void init(FilterConfig arg0) throws ServletException {
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
?config = arg0; // 將實例化時的init-param存入config
}
???throws IOException, ServletException {
?String charset = config.getInitParameter("charset"); // 從config中獲得字符集
??? if(charset==null){
????? charset = "UTF-8";
??? }
??? request.setCharacterEncoding(charset); // 設(shè)定字符集為UTF-8
}查看全部 -
登錄驗證過濾器: 過濾規(guī)則:通過檢查session中是否有用戶信息來判斷是否已經(jīng)登錄,登錄則放行,未登錄則重定向到登錄頁 過濾的路徑: 1.簡單的將要過濾的路徑添加到配置文件中過(但經(jīng)常會很多不推薦) 2.使用/*過濾所有,此時有一些不應(yīng)過濾的路徑(比如登錄頁本身),只能在doFilter中判斷并放行.一種好的方式是:將不過濾的路徑通過init-param提交,在doFilter通過循環(huán)來判斷,這樣只需要將不過濾的路徑加到配置文件中即可 此外這一節(jié)演示了設(shè)置和讀取init-param的方法
查看全部 -
根據(jù)過濾器的規(guī)則,過濾器得等servlet執(zhí)行結(jié)束才能停止,所以如果servlet執(zhí)行很久,過濾器得等很久,所以說呢,為了使得過濾器早點執(zhí)行結(jié)束,就讓servlet在后臺執(zhí)行,過濾器提前結(jié)束,這就是異步過濾器的優(yōu)點所在
@WebServlet(asyncSupported = true, displayName = "/AsyncServlet", urlPatterns={"/servlet/AsyncServlet"})
asyncSupported = true 是必須開啟用以支持異步
@WebFilter(filterName="AsynFilter",asyncSupported=true,value={"/servlet/AsyncServlet"},dispatcherTypes={DispatcherType.REQUEST,DispatcherType.ASYNC})
asyncSupported = true 是必須開啟用以支持異步
dispatcherTypes={DispatcherType.REQUEST,DispatcherType.ASYNC}
DispatcherType.REQUEST必須要加上,否則過濾器就不會生效了
同時注意在過濾的地址和servlet的地址必須相同查看全部 -
request ? ?用戶直接訪問頁面時(eg:請求response.sendredirect請求重定向),Web容器將會調(diào)用過濾器
? ? forward ? 目標(biāo)資源通過RequestDispatcher的forward訪問時,該過濾器被調(diào)用 ?<jsp:forward也能觸發(fā)
? ? include ? ?目標(biāo)資源通過RequestDispatcher的include訪問時,該過濾器被調(diào)用 ? <jsp:include也能觸發(fā) ? ?
? ? error ? ? ? ?目標(biāo)資源通過聲明式處理機制調(diào)用時,該過濾器被調(diào)用<error-page>
??? <error-code>404</error-code>//500
??? <location>/error.jsp</location>
??? </error-page>
<filter>
??????? <filter-name>ErrorFilter</filter-name>
??????? <filter-class>com.imooc.filter.ErrorFilter</filter-class>
??? </filter>
??? <filter-mapping>
??????? <filter-name>ErrorFilter</filter-name>
??????? <url-pattern>/error.jsp</url-pattern>
??????? <dispatcher>ERROR</dispatcher>
??? </filter-mapping>
@error.jsp
您輸入的路徑有誤!
@ErrorFilter.java
public void doFilter(ServletRequest servletrequest,
ServletResponse servletresponse, FilterChain filterchain)
throws IOException, ServletException {
System.out.println("檢測到有錯誤的信息!");
filterchain.doFilter(servletrequest, servletresponse);//注意:放行
}
Servlet3.0中加入了@引言的這種方式.
@WebFilter用來將一個類聲明為過濾器,該注解將會在部署時被容器處理,容器將根據(jù)具體的屬性配置將相應(yīng)的類部署為過濾器.(部署理解為項目發(fā)布,就會把Web.xml文件與項目的文件讀取在Web容器里,部署的時候容器就會識別注解,將相應(yīng)的類部署為過濾器.啟動服務(wù)器才執(zhí)行過濾器的初始化方法.)
則添加過濾器不需要再web.xml中配置.直接在過濾器類里加入@WebFilter聲明即可.
filter-mapping元素用來聲明Web應(yīng)用中的過濾器映射。過濾器可被映射到一個servlet或一個URL模式。將過濾器映射到一個servlet中會造成過濾器作用于servlet上。將過濾器映射到一個URL模式中則可以將過濾器應(yīng)用于任何資源,只要該資源的URL與URL模式匹配。過濾是按照部署描述符的filter-mapping元素出現(xiàn)的順序執(zhí)行的。
過濾器filter-mapping的<servlet-name>標(biāo)簽意思是過濾器關(guān)聯(lián)Servlet,當(dāng)某些用戶請求訪問Servlet的時候,會被過濾器截取請求.(即Web容器會調(diào)用過濾器的doFilter()方法)
過濾器filter-mapping的<url-pattern>標(biāo)簽意思是過濾器關(guān)聯(lián)的URL地址.當(dāng)用戶訪問關(guān)聯(lián)的URLWeb資源時,會被過濾器截取請求.(即Web容器會調(diào)用過濾器的doFilter()方法)
圖中上部分是Servlet3.0配置過濾器的方法.下部分是Servlet2.5的配置過濾器方法查看全部 -
為什么sendRedirect會陷入死循環(huán),而getRequestDispatcher.forward不會? 因為前者是使用的過濾器類型是request,訪問index.jsp頁面時,觸發(fā)過濾器,重定向到main.jsp,由于過濾器類型是request,所以會繼續(xù)觸發(fā)main.jsp的過濾器,所以會陷入死循環(huán)。 后者在訪問index.jsp的時候,過濾器類型是request,所以會觸發(fā)過濾器,然后利用轉(zhuǎn)發(fā)的方式訪問main.jsp,這時候過濾器的類型是forward,而此時web.xml中定義的匹配main的過濾器類型還是request,所以不執(zhí)行main所匹配的過濾器,因此只執(zhí)行一次。
查看全部 -
Web應(yīng)用允許多個過濾器來過濾頁面請求——聯(lián)想現(xiàn)實生活中的例子是最好理解的啦!比如:為了獲得更加干凈的水,可能需要多個過濾器來進行過濾。 這個時候就分為兩種情況了 1:多個過濾器過濾的URL不同,那么此時的多個過濾器是互不相干的,各過濾各的,互不干擾 2:多個多慮期過濾的URL相同,那么此時的多個過濾器就形成了一個過濾器鏈,此時就有個一個問題了Web容器現(xiàn)將對應(yīng)的請求給誰過濾呢?處理規(guī)則也很簡單,就是根據(jù)在Web.xml文件中配置的聲明的順序來決定,那個先過濾那個在過濾
查看全部 -
JAVA過濾機制——第一個過濾器案例 1、創(chuàng)建一個過濾器類 ,繼承自servlet下的Filter 2、重寫三個方法init() doFilter() destroy()方法 (1)init()初始化:這個方法可以讀取web.xml文件中的過濾器初始化參數(shù)。通過參數(shù)FilterConfig arg0可以獲取更多參數(shù) (2)doFIlter()核心:完成實際的過濾操作。當(dāng)用戶請求訪問與過濾器【關(guān)聯(lián)的URL】時,Web容器將先調(diào)用過濾器的doFilter方法,F(xiàn)ilterChain arg2參數(shù)可以調(diào)用chain.doFilter方法,將請求傳給下一個過濾器(或目標(biāo)資源),或利用轉(zhuǎn)發(fā),重定向?qū)⒄埱筠D(zhuǎn)發(fā)給其他資源。 (3)web容器在消耗過濾器前調(diào)用該方法,用于釋放過濾器占用的資源。(大多數(shù)情況用不到)
查看全部 -
一.過濾器的工作原理
用戶發(fā)送請求到過濾器,過濾器將用戶請求發(fā)送到web資源,web資源將響應(yīng)發(fā)送到過濾器,過濾器將響應(yīng)發(fā)送給用戶
二.過濾器的工作周期
1.實例化階段-->一啟動服務(wù)器就會從Web容器的web.xml文件中自動去加載實例化過濾器.且只會實例化一次.即生成了過濾器. 2.初始化階段-->生成過濾器之后便是初始化,加載一些初始化信息.調(diào)用init()方法.且只執(zhí)行一次. 3.過濾階段-->執(zhí)行過濾器的doFilter()方法進行過濾.執(zhí)行n次的,凡是過濾器捕獲到用戶的請求,都會執(zhí)行這個過濾方法. 4.銷毀階段-->當(dāng)Web容器關(guān)閉即服務(wù)器關(guān)閉的時候,便執(zhí)行destroy()方法銷毀.查看全部
舉報