青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Khan's Notebook GCC/GNU/Linux Delphi/Window Java/Anywhere

路漫漫,長(zhǎng)修遠(yuǎn),我們不能沒(méi)有錢
隨筆 - 173, 文章 - 0, 評(píng)論 - 257, 引用 - 0
數(shù)據(jù)加載中……

servlet和JSP過(guò)濾器Filter

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。首先, FilterConfig對(duì)象提供對(duì)servlet環(huán)境及web.xml文件中指派的過(guò)濾器名的訪問(wèn)。因此,普遍的辦法是利用init將 FilterConfig對(duì)象存放在一個(gè)字段中,以便doFilter方法能夠訪問(wèn)servlet環(huán)境或過(guò)濾器名。這種處理在第3節(jié)描述。其次, FilterConfig對(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)單的例子:
    xml version="1.0" encoding="ISO-8859-1"?>
    
DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd"
>
    
<web-app>
      
<filter>
        
<filter-name>MyFilterfilter-name>
        
<filter-class>myPackage.FilterClassfilter-class>
      
filter>
      

      
<filter-mapping>...filter-mapping>
    
web-app>

 



2.filter-mapping元素
filter-mapping元素位于web.xml文件中filter元素之后serlvet元素之前。它包含如下三個(gè)可能的子元素::
l filter-name  這個(gè)必需的元素必須與用filter元素聲明時(shí)給予過(guò)濾器的名稱相匹配。
l url-pattern  此元素聲明一個(gè)以斜杠(/)開始的模式,它指定過(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è)例子:
  xml version="1.0" encoding="ISO-8859-1"?>
    
DOCTYPE web-app PUBLIC
        
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        
"http://java.sun.com/dtd/web-app_2_3.dtd">
    
<web-app>
      
<filter>
        
<filter-name>MyFilterfilter-name>
        
<filter-class>myPackage.FilterClassfilter-class>
      
filter>
      

      
<filter-mapping>
        
<filter-name>MyFilterfilter-name>
        
<url-pattern>/someDirectory/SomePage.jspurl-pattern>
      
filter-mapping>
    
web-app>

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,則如下:
  <filter>
      
<filter-name>SomeFilterfilter-name>
      
<filter-class>somePackage.SomeFilterClassfilter-class>
    
filter>
    

    
<filter-mapping>
      
<filter-name>SomeFilterfilter-name>
      
<servlet-name>SomeServletservlet-name>
    
filter-mapping>


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

  <filter>
      
<filter-name>SomeFilterfilter-name>
      
<filter-class>somePackage.SomeFilterClassfilter-class>
    
filter>
    

    
<filter-mapping>
      
<filter-name>SomeFilterfilter-name>
      
<servlet-name>/Blahservlet-name>
    
filter-mapping>


現(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的摘錄)
   xml version="1.0" encoding="ISO-8859-1"?>
    
DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd"
>
    
<web-app>
    

    
<servlet>
      
<servlet-name>Errorservlet-name>
      
<servlet-class>somePackage.ErrorServletservlet-class>
    
servlet>
    

    
<servlet-mapping>
      
<servlet-name>Errorservlet-name>
      
<url-pattern>/servlet/*url-pattern>
    
servlet-mapping>
    

    
web-app>


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/ 開始的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ò)濾器的摘錄)

<?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd">
    <web-app>
      <!-- Register the name "Reporter" for ReportFilter. -->
      <filter>
        <filter-name>Reporter</filter-name>
        <filter-class>
          moreservlets.filters.ReportFilter
        </filter-class>
      </filter>
      <!-- ... -->
      <!-- Apply the Reporter filter to home page. -->
      <filter-mapping>
        <filter-name>Reporter</filter-name>
        <url-pattern>/index.jsp</url-pattern>
      </filter-mapping>
      <!-- Also apply the Reporter filter to the servlet named
          "TodaysSpecial".
      -->
      <filter-mapping>
        <filter-name>Reporter</filter-name>
        <servlet-name>TodaysSpecial</servlet-name>
      </filter-mapping>
      <!-- ... -->
    
      <!-- Give a name to the Today's Special servlet so that filters
          can be applied to it.
      -->
      <servlet>
        <servlet-name>TodaysSpecial</servlet-name>
        <servlet-class>
          moreservlets.TodaysSpecialServlet
        </servlet-class>
      </servlet>
      <!-- ... -->
    
      <!-- Make /TodaysSpecial invoke the servlet
          named TodaysSpecial (i.e., moreservlets.TodaysSpecial).
      -->
      <servlet-mapping>
        <servlet-name>TodaysSpecial</servlet-name>
        <url-pattern>/TodaysSpecial</url-pattern>
      </servlet-mapping>
    
      <!-- Turn off invoker. Send requests to index.jsp. -->
      <servlet-mapping>
        <servlet-name>Redirector</servlet-name>
        <url-pattern>/servlet/*</url-pattern>
      </servlet-mapping>
      <!-- ... -->
    </web-app>

 

程序清單9-4 index.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Filters 'R' Us</TITLE>
<LINK REL=STYLESHEET
        HREF="filter-styles.css"
        TYPE="text/css">
</HEAD>
<BODY>
<CENTER>
<TABLE BORDER=5>
  <TR><TH CLASS="TITLE">Filters 'R' Us</TABLE>
<P>
<TABLE>
  <TR>
    <TH><IMG SRC="images/air-filter.jpg" ALT="Air Filter">
    <TH><IMG SRC="images/coffee-filter.gif" ALT="Coffee Filter">
    <TH><IMG SRC="images/pump-filter.jpg" ALT="Pump Filter">
  </TR>
</TABLE>

<H3>We specialize in the following:</H3>
<UL>
  <LI>Air filters
  <LI>Coffee filters
  <LI>Pump filters
  <LI>Camera lens filters
  <LI>Image filters for Adobe Photoshop
  <LI>Web content filters
  <LI>Kalman filters
  <LI>Servlet and JSP filters
</UL>
Check out <A HREF="TodaysSpecial">Today's Special</A>.
</CENTER>
</BODY>
</HTML>


程序清單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 +
        "<HTML>\n" +
        "<HEAD><TITLE>Today's Special</TITLE></HEAD>\n" +
        "<BODY BGCOLOR=\"WHITE\">\n" +
        "<CENTER>\n" +
        "<H1>Today's Special: " + title + "s!</H1>\n" +
        "<IMG SRC=\"images/" + picture + "\"\n" +
        " ALT=\"" + title + "\">\n" +
        "<BR CLEAR=\"ALL\">\n" +
        "Special deal: for only twice the price, you can\n" +
        "<I>buy one, get one free!</I>.\n" +
        "</BODY></HTML>");
  }

  // 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)輸出的窗口,在開發(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) 單方法。可以訪問(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)橐话阒皇? 用FilterConfig對(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ò)濾器的摘錄)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC
    "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <!-- ... -->

  <!-- Register the name "Logger" for LogFilter. -->
  <filter>
    <filter-name>Logger</filter-name>
    <filter-class>
      moreservlets.filters.LogFilter
    </filter-class>
  </filter>
  <!-- ... -->

  <!-- Apply the Logger filter to all servlets and
  JSP pages.
  -->
  <filter-mapping>
    <filter-name>Logger</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <!-- ... -->
</web-app>


5.  利用過(guò)濾器的初始化參數(shù)
對(duì)于servlet和JSP頁(yè)面,可通過(guò)提供初始化參數(shù)定制初始化行為。這個(gè)功能之所以游泳的原因在于有三組不同的人員可能希望定制servlet或JSP頁(yè)面的行為,這三組人員分別為:
1)開發(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)境中部署它 們的人員。他們不一定是開發(fā)人員,因此期望他們修改servlet和JSP代碼是不現(xiàn)實(shí)的。但由于過(guò)濾器在它們所附加的servlet或JSP頁(yè)面之前執(zhí) 行,最終用戶一般不能定制過(guò)濾器的行為,這種能力仍然很有用。定制過(guò)濾器的行為用如下步驟完成:
1)定義初始化參數(shù)。使用web.xml中的filter的init-param子元素以及param-nam和param-value子元素,如下所示。

    <filter>
      <filter-name>SomeFilter</filter-name>
      <filter-class>somePackage.SomeFilterClass</filter-class>
      <init-param>
        <param-name>param1</param-name>
        <param-value>value1</param-value>
      </init-param>
      <init-param>
        <param-name>param2</param-name>
        <param-value>value2</param-value>
      </init-param>
    </filter>

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)? “不尋常”要視具體情況而定,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ù),這使用缺省 值。然后,它將開始和結(jié)束事件、FilterConfig、ServletContext以及過(guò)濾器名存入過(guò)濾器的字段。最后, LateAccessFilter對(duì)destroy方法提供一個(gè)空體。
2)在doFilter方法中過(guò)濾行為。這個(gè)方法查找當(dāng)前事件,看它問(wèn)是否在開始時(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ò)濾器的摘錄)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC
    "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
    <!-- ... -->

    <!-- Register the name "LateAccessFilter" for
        moreservlets.filter.LateAccessFilter.
        Supply two initialization parameters:
        startTime and endTime.
    -->
    <filter>
      <filter-name>LateAccessFilter</filter-name>
      <filter-class>
        moreservlets.filters.LateAccessFilter
      </filter-class>
      <init-param>
        <param-name>startTime</param-name>
        <param-value>2</param-value>
      </init-param>
      <init-param>
        <param-name>endTime</param-name>
        <param-value>10</param-value>
      </init-param>
    </filter>
    <!-- ... -->

    <!-- Apply LateAccessFilter to the home page. -->
    <filter-mapping>
      <filter-name>LateAccessFilter</filter-name>
      <url-pattern>/index.jsp</url-pattern>
    </filter-mapping>

    <!-- ... -->
</web-app>

posted on 2004-10-22 21:45 Khan 閱讀(747) 評(píng)論(1)  編輯 收藏 引用 所屬分類: Java

評(píng)論

# re: servlet和JSP過(guò)濾器Filter   回復(fù)  更多評(píng)論   

網(wǎng)站提交的時(shí)候有些字符給腳本解釋器過(guò)濾了,大家不要貼代碼,自己小心看看
2006-01-19 14:58 | Khan's Notebook
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一区二区在线观看视频| 另类专区欧美制服同性| 亚洲一区欧美激情| 国产日韩精品一区| 麻豆精品在线播放| 欧美国产精品日韩| 欧美一级免费视频| 美女日韩欧美| 久久精品国产一区二区三| 蜜月aⅴ免费一区二区三区| 亚洲美女精品成人在线视频| 亚洲色图自拍| 亚洲激情图片小说视频| 亚洲一区二区免费| 91久久综合亚洲鲁鲁五月天| 亚洲一区二区三区在线播放| 亚洲高清资源综合久久精品| 亚洲视频在线一区| 99国产精品久久久久久久久久| 亚洲制服av| 亚洲综合欧美日韩| 欧美日韩在线观看一区二区| 欧美国产一区二区在线观看| 国产精品素人视频| av成人免费在线| 夜久久久久久| 欧美日韩三级视频| 99天天综合性| 亚洲一区欧美| 欧美日韩在线一区| 亚洲精品久久嫩草网站秘色 | 在线国产亚洲欧美| 亚洲免费在线观看视频| 亚洲资源在线观看| 国产亚洲观看| 久久一二三国产| 亚洲精品欧洲精品| 午夜精品久久久久久久蜜桃app | 亚洲五月六月| 国产精品成人免费| 欧美在线免费播放| 欧美+日本+国产+在线a∨观看| 在线看片成人| 欧美日韩在线精品| 久久国产一区| 日韩一区二区高清| 久久精品一本久久99精品| 1000部精品久久久久久久久| 欧美精品啪啪| 欧美一区二区精品久久911| 欧美激情亚洲一区| 欧美一区二区三区久久精品茉莉花| 韩日视频一区| 欧美日韩一区不卡| 蜜桃av一区二区三区| 午夜精品一区二区三区四区| 欧美成人一区在线| 久久精品系列| 午夜精品久久久久久久白皮肤| 在线国产欧美| 精品1区2区| 国产日韩一区二区三区在线播放| 欧美日韩国产三级| 欧美成人综合在线| 久久精品视频99| 亚洲自拍偷拍一区| 一区二区欧美激情| 亚洲一区二区三区在线视频| 亚洲大片精品永久免费| 国产视频在线观看一区二区| 欧美特黄视频| 国产精品精品视频| 欧美日韩视频一区二区三区| 欧美成人免费网站| 免费观看成人鲁鲁鲁鲁鲁视频| 久久精品一二三| 久久婷婷久久| 欧美激情在线观看| 欧美日韩一区高清| 国产精品成人一区二区| 国产精品卡一卡二卡三| 国产精品视频一区二区高潮| 国产精品久久网站| 国产亚洲美州欧州综合国| 狠狠色综合播放一区二区| 在线免费观看视频一区| 亚洲乱码日产精品bd| 亚洲一区二区影院| 久久精品水蜜桃av综合天堂| 老司机久久99久久精品播放免费| 久久av二区| 欧美a级片网| 中国成人黄色视屏| 毛片av中文字幕一区二区| 久久久91精品国产| 国产精品一区二区在线观看不卡 | 亚洲欧美日韩在线观看a三区 | 欧美午夜视频在线| 在线观看欧美成人| 久久国产精品电影| 一区二区动漫| 欧美在线视频日韩| 亚洲图片欧美午夜| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 久久夜色精品一区| 欧美精品色一区二区三区| 亚洲欧美日韩精品综合在线观看 | 亚洲福利视频网站| 亚洲精品永久免费| 亚洲视频观看| 亚洲人成网在线播放| 国产一区二区三区久久精品| 欧美有码在线观看视频| 欧美日韩18| 亚洲精品专区| 亚洲永久在线| 欧美激情一区二区三区成人 | 亚洲国产精品一区二区第四页av | 亚洲先锋成人| 欧美日韩亚洲一区二| 亚洲精品在线看| 亚洲大片精品永久免费| 久久精品国产清高在天天线| 国产午夜精品美女毛片视频| 欧美一区永久视频免费观看| 在线一区二区三区做爰视频网站| 欧美国产激情| 日韩一区二区久久| 亚洲夜晚福利在线观看| 国产欧美精品一区| 免费成人高清在线视频| 欧美成人网在线| 亚洲欧美久久久久一区二区三区| 亚洲视频狠狠| 影音先锋中文字幕一区| 欧美日韩免费一区二区三区| 午夜一区二区三视频在线观看| 亚洲欧美日韩一区二区| 亚洲第一中文字幕| 一本一本久久a久久精品综合麻豆| 国产美女高潮久久白浆| 欧美激情精品| 伊人久久综合97精品| 亚洲视频综合| av成人黄色| 美女国产一区| 久久综合国产精品台湾中文娱乐网| 欧美高清在线一区二区| 久久精品国产第一区二区三区| 欧美成人dvd在线视频| 久久久www成人免费毛片麻豆| 欧美精品1区2区3区| 欧美中文日韩| 国产精品欧美激情| 99国产麻豆精品| 亚洲国产成人高清精品| 久久精品国产99精品国产亚洲性色| 亚洲午夜国产成人av电影男同| 久久久久久亚洲精品杨幂换脸| 欧美一级视频精品观看| 欧美午夜精品久久久久久浪潮 | 国产日韩欧美高清免费| 日韩视频一区| 在线午夜精品自拍| 国产精品播放| 亚洲综合欧美日韩| 久久国产黑丝| 狠狠色综合播放一区二区| 欧美专区一区二区三区| 老司机精品视频网站| 亚洲二区在线| 欧美视频日韩视频| 午夜久久久久久| 美日韩精品免费观看视频| 亚洲第一页自拍| 欧美日韩精品免费看| 在线天堂一区av电影| 欧美综合国产| 艳妇臀荡乳欲伦亚洲一区| 国产精品亚洲美女av网站| 久久综合亚洲社区| 亚洲国产成人不卡| 欧美私人网站| 美女91精品| 欧美一区1区三区3区公司| 欧美国产精品久久| 性欧美大战久久久久久久免费观看 | 亚洲午夜在线观看视频在线| 欧美一区二视频在线免费观看| 在线观看亚洲a| 国产精品色婷婷| 欧美区一区二| 欧美成人精品一区二区| 欧美中文字幕| 午夜伦理片一区| 国产精品99久久久久久久久| 欧美激情第二页| 另类图片综合电影| 久久婷婷人人澡人人喊人人爽| 亚洲在线播放电影|