国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
JSP/Servlet中Filter的應(yīng)用

做B/S的企業(yè)級應(yīng)用,可能會遇到這樣一種情況,客戶的文檔(word等)保存在一個目錄下,需要通過登錄才能看到,但是這些又都是靜態(tài)地址,所以能直接輸入地址就可以訪問到文檔。這時就需要用到Filter過濾器了。

 

Servlet API的2.3版本的一個新功能就是能夠為servlet和JSP頁面定義過濾器。過濾器提供了某些早期服務(wù)器所支持的非標準“servlet鏈接”的一種功能強大且標準的替代品。
過濾器是一個程序,它先于與之相關(guān)的servlet或JSP頁面運行在服務(wù)器上。過濾器可附加到一個或多個servlet或JSP頁面上,并且可以檢查進入這些資源的請求信息。在這之后,過濾器可以作如下的選擇:

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

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

基于以上的原理,在項目中遇到這樣一個問題,用戶只有登陸之后才能瀏覽resource目錄下的資源,而這些resource的地址都是靜態(tài)地址,這時候就用到了過濾器,

public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session=request.getSession();
ServletContext application=session.getServletContext();

if(session.getAttribute("userSession")==null)
{
response.sendRedirect("error/priv_error.jsp");
return;
}
else
{
chain.doFilter(request, response);
}

}

web.xml中如下配置:

<filter>
<filter-name>PrivFilter</filter-name>
<filter-class>com.myPriv.filter.PrivFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>PrivFilter</filter-name>
<url-pattern>/resource/*</url-pattern>
</filter-mapping>

在過濾器程序中判斷到resource目錄下的請求的用戶session是否為空,如果空的話就跳轉(zhuǎn)出去;

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
過濾器、監(jiān)聽器
一個servlet登陸過濾器
用Java Servlets 2.4實現(xiàn)過濾 - good things in life ...
過濾器中的方法
Servlet過濾器
Filter過濾器-JavaWeb三大組件之一
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服