在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當(dāng)前位置:雨林木風(fēng)下載站 > 技術(shù)開(kāi)發(fā)教程 > 詳細(xì)頁(yè)面

servlet2.3

servlet2.3

更新時(shí)間:2022-05-02 文章作者:未知 信息來(lái)源:網(wǎng)絡(luò) 閱讀次數(shù):

明天的Java開(kāi)發(fā)什么樣?
(仙人掌工作室 2001年06月19日 14:44)

和當(dāng)前的Servlet 2.2規(guī)范相比,Servlet 2.3 建議最終草案(PFD)最大的不同之處在于把filter(過(guò)濾器)和event(事件)加入了Servlet模型。過(guò)濾器提供了一種讓?xiě)?yīng)用程序在任何Servlet運(yùn)行之前或運(yùn)行之后執(zhí)行標(biāo)準(zhǔn)動(dòng)作的方法。很長(zhǎng)時(shí)間以來(lái),Servlet規(guī)范中都沒(méi)有事件。事件提供的是特定動(dòng)作的通知,特別是應(yīng)用程序的啟動(dòng)/結(jié)束與會(huì)話的啟動(dòng)/結(jié)束,使得應(yīng)用程序能夠進(jìn)行某些一次性的初始化/清理操作。

事件句柄
在許多場(chǎng)合,應(yīng)用程序一啟動(dòng)就必須進(jìn)行一些初始化操作。例如,創(chuàng)建和初始化JDBC連接時(shí),或者創(chuàng)建JDBC連接池時(shí),或者讀取在應(yīng)用程序的整個(gè)生命周期內(nèi)都要用到的資源時(shí),或者進(jìn)行簡(jiǎn)單的檢查以確保應(yīng)用程序要用到的某些資源確實(shí)存在時(shí),這種情況都會(huì)發(fā)生。在遵從2.2規(guī)范的容器上,應(yīng)用程序沒(méi)有保證能夠執(zhí)行這類(lèi)初始化操作的辦法。

在2.2規(guī)范中,部署Servlet時(shí)可以在web.xml文件中設(shè)置<load-on-startup>項(xiàng)目。這個(gè)元素應(yīng)該包含一個(gè)正數(shù),它決定了Servlet啟動(dòng)的次序,有關(guān)該標(biāo)記的更多說(shuō)明,請(qǐng)參見(jiàn)Servlet規(guī)范中的web.xml DTD說(shuō)明。采用這種方案有幾個(gè)問(wèn)題。首先,Servlet規(guī)范說(shuō):“l(fā)oad-on-startup元素表示該Servlet應(yīng)該(should)在Web應(yīng)用程序啟動(dòng)的時(shí)候裝入。”Servlet容器開(kāi)發(fā)者可能把它理解成“應(yīng)該裝入,但不是必須裝入”(因此,當(dāng)應(yīng)用程序啟動(dòng)時(shí)Servlet可能沒(méi)有被裝入)。另外一個(gè)問(wèn)題在于,我們是在用一種與Servlet設(shè)計(jì)意圖不同的方式使用Servlet。

Servlet有一個(gè)“請(qǐng)求”級(jí)的作用范圍。也就是說(shuō),按照設(shè)計(jì),Servlet對(duì)于每個(gè)客戶端的請(qǐng)求執(zhí)行一次。但在這里,Servlet有了“應(yīng)用”級(jí)作用范圍,它執(zhí)行一次然后就掛起。

在2.2規(guī)范中,Servlet還可以被卸載——容器檢查初始化Servlet,判斷出Servlet在一段時(shí)間內(nèi)已經(jīng)沒(méi)有使用,于是就卸載它。如果這個(gè)Servlet“占據(jù)”了一些啟動(dòng)的時(shí)候它初始化的資源,那么它應(yīng)該釋放這些資源。但是,Servlet不會(huì)被告知應(yīng)用程序什么時(shí)候結(jié)束。Servlet的拆除方法會(huì)在應(yīng)用程序關(guān)閉的時(shí)候被調(diào)用,但它無(wú)法知道是否所有其他Servlet也被卸載。當(dāng)其他Servlet被卸載時(shí),它們可能需要用到由初始化Servlet創(chuàng)建的資源。如果先卸載的是初始化Servlet,那么其他Servlet的處境就不妙了。

使用會(huì)話的時(shí)候也會(huì)出現(xiàn)完全同樣的問(wèn)題,因?yàn)閼?yīng)用程序完全有理由在建立/拆除每一個(gè)會(huì)話的時(shí)候,做一些初始化或者清理工作。

為了解決這些問(wèn)題,Servlet 2.3規(guī)范引入了事件句柄的概念。事件句柄是一些回應(yīng)和處理由容器初始化的特定事件的代碼。Servlet 2.3規(guī)范定義了兩種類(lèi)型的事件:應(yīng)用程序事件,會(huì)話事件。對(duì)于所有這兩種事件類(lèi)型,事件句柄能夠捕獲啟動(dòng)和結(jié)束事件,能夠捕獲屬性改變事件。

我們將把注意力主要集中到應(yīng)用程序的啟動(dòng)和結(jié)束事件上,但對(duì)于其他事件類(lèi)型來(lái)說(shuō),代碼也是相似的。

我們來(lái)看看事件句柄的代碼。應(yīng)用程序的事件句柄必須擴(kuò)展javax.servlet.ServletContextListener接口。這個(gè)接口有兩個(gè)方法,即contextDestroyed()和contextInitialized()。兩個(gè)方法都有一個(gè)ServletContextEvent參數(shù)。正如你可以猜想到的,contextInitialized()方法在應(yīng)用程序啟動(dòng)的時(shí)候被調(diào)用,contextDestroyed()方法在應(yīng)用程序結(jié)束的時(shí)候被調(diào)用。ServletContextEvent類(lèi)有一個(gè)方法,它能夠返回正在被創(chuàng)建或拆除的ServletContext的引用。

  舉例來(lái)說(shuō),假設(shè)你正在設(shè)計(jì)一個(gè)基于Web的簡(jiǎn)單白頁(yè)(White Page)應(yīng)用。在這個(gè)應(yīng)用中,用戶通過(guò)email查找姓名和地址,如Listing 1所示。這個(gè)例子在一個(gè)Hashtable(散列表)中保存白頁(yè)的內(nèi)容,散列表必須在應(yīng)用程序啟動(dòng)的時(shí)候創(chuàng)建,而且它必須保存到應(yīng)用程序的ServletContext。


【Listing 1】
import javax.servlet.ServletContextListener;

public class WhitePagesListener implements ServletContextListener {
 Hashtable whitePages;
 public WhitePagesServletListener() {
 whitePages = new Hashtable();
 }
public void contextDestroyed(ServletContextEvent sce) { }
public void contextInitialized(ServletContextEvent sce) {
System.out.println("contextInitialized");
WhitePageEntry wpe = new WhitePageEntry("Kevin Jones", "555-1234");
whitePages.put("kev@dev.com", wpe);
wpe = new WhitePageEntry( "Simon Horrell", "555-8765");
whitePages.put("simon@dev.com", wpe);
wpe = new WhitePageEntry( "Don Box", "555-2137");
whitePages.put("don@dev.com", wpe);
// 把散列表保存到ServletContext
sce.getServletContext().setAttribute( "addrbook", whitePages);
}
}

代碼非常簡(jiǎn)單。WhitePagesListener類(lèi)實(shí)現(xiàn)了ServletContextListener。散列表由類(lèi)的構(gòu)造方法創(chuàng)建。contextDestroyed()方法什么事情也不錯(cuò),因?yàn)閼?yīng)用程序是被完全卸載,我們不需要清理過(guò)程。令人感興趣的部分是在contextInitialized()方法內(nèi)。這個(gè)方法把我們需要的數(shù)據(jù)保存到散列表,然后把散列表保存到ServletContext。當(dāng)contextInitialized()被調(diào)用時(shí),它的參數(shù)中傳入了一個(gè)對(duì)ServletContextEvent對(duì)象的引用。ServletContextEvent類(lèi)有一個(gè)getServletContext()方法,它返回的是對(duì)當(dāng)前應(yīng)用程序的ServletContext的引用。獲得ServletContext的引用之后,散列表就被保存到了ServletContext之中。

應(yīng)用程序必須經(jīng)過(guò)配置才能使用這個(gè)事件句柄,具體通過(guò)修改應(yīng)用程序的部署描述器(即web.xml文件)完成:


<web-app>
<listener>
<listener-class>
 WhitePagesListener
</listener-class>
</listener>...

用這種方法可以配置任意數(shù)量的監(jiān)聽(tīng)器(Listener)。調(diào)用監(jiān)聽(tīng)器的次序就是它們?cè)诓渴鹈枋銎髦谐霈F(xiàn)的次序。監(jiān)聽(tīng)器屬于Singleton,開(kāi)發(fā)者必須負(fù)責(zé)進(jìn)行同步。這一點(diǎn)對(duì)于本例來(lái)說(shuō)不是特別重要,但對(duì)于所有其它類(lèi)型的應(yīng)用來(lái)說(shuō),它可能很重要。

過(guò)濾器
過(guò)濾器是Servlet 2.3規(guī)范中最主要的新增功能。過(guò)濾器使得Servlet開(kāi)發(fā)者能夠在請(qǐng)求到達(dá)Servlet之前截取請(qǐng)求,在Servlet處理請(qǐng)求之后修改應(yīng)答。正如我們即將看到的,過(guò)濾器的創(chuàng)建和安裝都很簡(jiǎn)單。

所有的過(guò)濾器實(shí)現(xiàn)javax.filter.Filter接口。這個(gè)接口有三個(gè)方法:setFilterConfig()方法,在最后的規(guī)范中,這個(gè)方法很可能被兩個(gè)方法取代,取代的方法可能是init(Filterconfig config)和destroy();getFilterConfig()方法,在規(guī)范的稍后版本中這個(gè)方法可能消失;doFilter()方法。setFilterConfig()方法在第一次創(chuàng)建過(guò)濾器實(shí)例以及從調(diào)用鏈刪除過(guò)濾器時(shí)被調(diào)用。創(chuàng)建實(shí)例時(shí),傳入過(guò)濾器的參數(shù)是一個(gè)非null的FilterConfig對(duì)象。這個(gè)對(duì)象使得過(guò)濾器能夠訪問(wèn)它的名字和當(dāng)前的ServletContext。初始化參數(shù)可以作為過(guò)濾器配置的一部分指定,這些參數(shù)也可以通過(guò)FilterConfig訪問(wèn)。當(dāng)過(guò)濾器被刪除時(shí),傳入setFilterConfig()的是一個(gè)值為null的FilterConfig。

配置過(guò)濾器時(shí),我們可以把過(guò)濾器關(guān)聯(lián)到一個(gè)或者多個(gè)Servlet上。只要請(qǐng)求傳遞到了與某個(gè)過(guò)濾器關(guān)聯(lián)的Servlet上,該過(guò)濾器就會(huì)執(zhí)行。過(guò)濾器以調(diào)用鏈中一部分的形式執(zhí)行,執(zhí)行次序由過(guò)濾器在部署描述器(即web.xml文件)中的次序決定。容器通過(guò)調(diào)用過(guò)濾器的doFilter()方法執(zhí)行過(guò)濾器。doFilter()方法的參數(shù)包括一個(gè)ServletRequest對(duì)象、一個(gè)ServletResponse對(duì)象、一個(gè)javax.servlet.FilterChain對(duì)象。

FilterChain只有一個(gè)方法doFilter(),過(guò)濾器通過(guò)調(diào)用該方法把請(qǐng)求和應(yīng)答繼續(xù)向調(diào)用鏈的下一環(huán)傳遞。當(dāng)然這也意味著,過(guò)濾器可以不再向調(diào)用鏈傳遞它,從而阻塞調(diào)用。此時(shí),當(dāng)前過(guò)濾器必須負(fù)責(zé)生成合適的應(yīng)答內(nèi)容。

舉一個(gè)例子,我們來(lái)看一個(gè)在調(diào)試Servlet時(shí)很有用的Servlet,如Listing 2所示。這個(gè)過(guò)濾器將輸出“下游”Servlet和過(guò)濾器設(shè)置的HttpRequest頭和HttpResponse頭。如果讓這個(gè)過(guò)濾器成為調(diào)用鏈中的第一個(gè)過(guò)濾器,它可能能夠讓我們捕獲所有的應(yīng)答頭,不過(guò)容器可能決定以過(guò)濾器永遠(yuǎn)不能了解的方式設(shè)置應(yīng)答頭:


【Listing 2】下面清單中的Servlet將輸出由“下游”Servlet和 過(guò)濾器設(shè)置的HttpRequest頭和HttpResponse頭

public class DumpHeadersimplements
javax.servlet.Filter {
private FilterConfig fc;
private ServletContext ctx;
... ...

public FilterConfig getFilterConfig() {
return fc;
}
publicvoid setFilterConfig( FilterConfig filterConfig) {
fc = filterConfig;
if(fc !=null) ctx = fc.getServletContext();
}
}

這個(gè)過(guò)濾器實(shí)現(xiàn)了javax.servlet.Filter接口,所以它必須按照前面所顯示的實(shí)現(xiàn)setFilterConfig()和getFilterConfig()。setFilterContext()保存了一個(gè)對(duì)ServletContext的引用以便以后使用。

doFilter()方法的實(shí)現(xiàn)需要一點(diǎn)技巧。doFilter()的第一部分很簡(jiǎn)單:獲取request對(duì)象,分析HTTP方法和查詢字符串,然后枚舉請(qǐng)求頭。代碼如Listing 3所示。


【Listing 3】下面顯示了doFilter()第一部分的實(shí)現(xiàn),它獲取request對(duì)象, 分析HTTP方法和查詢字符串。

public void doFilter(
ServletRequest request,
ServletResponse response, chain)
throws java.io.IOException,
ServletException {

 // 獲得request對(duì)象
 HttpServletRequest req = (HttpServletRequest)request;

 // 重新構(gòu)造HTTP請(qǐng)求行
 String temp;
 temp = req.getMethod() + req.getRequestURI();
 if(req.getQueryString() != null)
 temp += "?"+req.getQueryString();
 temp += " " + req.getProtocol();

 // 用ServletContext記錄HTTP請(qǐng)求行
 ctx.log(temp); temp = "";

 // 枚舉請(qǐng)求頭
 Enumeration names = req.getHeaderNames();
 while(names.hasMoreElements()) {
String name = (String)names.nextElement();
temp += name + ": " ;
Enumeration values = req.getHeaders(name);
while (values.hasMoreElements()) {
 String value = (String)values.nextElement();
 temp += value + " ";
 } // 記錄 ctx.log(temp); temp = "";
}

但處理應(yīng)答比較復(fù)雜,而且它涉及到Servlet的一個(gè)新概念——封裝request和response對(duì)象。在Servlet規(guī)范以前的版本中,調(diào)用任何一個(gè)要求有[Http]ServletRequest或[Http]ServletResponse的方法時(shí),你必須把傳遞給Servlet service方法的request和response對(duì)象傳遞給該方法。最明顯的例子就是分派請(qǐng)求的時(shí)候:


RequestDispatch rd = getServletContext().getRequestDispatcher("foo"); rd.forward(request, response); // or rd.include(request, response);

假設(shè)你想執(zhí)行一個(gè)包含操作,然后,在把應(yīng)答發(fā)送給客戶端之前又要對(duì)它進(jìn)行處理,或者在把應(yīng)答發(fā)送給客戶端之前從RequestDispatcher.forward()查看應(yīng)答。在以前的Servlet規(guī)范中,這是不可能的。但在Servlet 2.3規(guī)范中這一切都成為可能。

新的規(guī)范定義了兩個(gè)新類(lèi),即javax.servlet.http.HttpServletRequestWrapper和javax.servlet.http.HttpServletResponseWrapper(這兩個(gè)類(lèi)從它們各自的非HTTP版本繼承)。這兩個(gè)類(lèi)的構(gòu)造方法如下:


HttpServletRequestWrapper(HttpServletRequest request) HttpServletResponseWrapper(HttpServletResponse response)

在這些類(lèi)中,這兩個(gè)方法的默認(rèn)行為是把調(diào)用傳遞給它們所封裝的對(duì)象。使用這些類(lèi)的時(shí)候,你一般要派生這些類(lèi)并覆蓋那些感興趣的方法。對(duì)于本文的過(guò)濾器,我們必須創(chuàng)建一個(gè)應(yīng)答封裝器,記錄對(duì)addXXXHeader()方法和setXXXHeader()方法的調(diào)用。另外,我們還想要捕獲對(duì)setStatus()、setContentLength()、setContentType()和setLocale()方法的調(diào)用。代碼如Listing 4所示,它簡(jiǎn)單地記錄了對(duì)各個(gè)方法的調(diào)用。


【Listing 4】應(yīng)答封裝器。下面的代碼為過(guò)濾器構(gòu)造了一個(gè)應(yīng)答封裝器, 它將記錄對(duì)addXXXHeader()和setXXXHeader()方法的調(diào)用。另外, 它還要捕獲對(duì)setStatus()、setContentLength()、setContentType()和 setLocale()方法的調(diào)用。

class HeaderResponseWrapper extends
HttpServletResponseWrapper {
ServletContext ctx;

public HeaderResponseWrapper(
HttpServletResponse response,
ServletContext ctx) {
super(response);
this.ctx = ctx;
 }

public void addCookie(Cookie cookie) {
ctx.log("Set-Cookie: " + cookie.getName() + ":" + cookie.getValue());
super.addCookie(cookie);
 }

public void addHeader(String name, String value) {
ctx.log(name + ": " + value); super.addHeader(name, value);
 }

public void addIntHeader(String name, int value) {
ctx.log(name + ": " + value); super.addIntHeader(name, value);
 }

public void addDateHeader(String name, long value) {
ctx.log(name + ": " + value); super.addDateHeader(name, value);
 }

public void setHeader( String name, String value) {
ctx.log(name + ": " + value); super.setHeader(name, value);
 }

public void setIntHeader( String name, int value) {
ctx.log(name + ": " + value); super.setIntHeader(name, value);
 }

public void setDateHeader( String name, long value) {
ctx.log(name + ": " + value); super.setDateHeader(name, value);
 }

public void setStatus(int sc) {
ctx.log("status: " + sc); super.setStatus(sc);
 }

public void setStatus( int sc, java.lang.String sm) {
ctx.log("status: " + sc); super.setStatus(sc, sm);
 }

public void setContentLength(int len) {
ctx.log("Content-Length: " + len); super.setContentLength(len);
 }

public void setContentType(java.lang.String type) {
ctx.log("Content-Type: " + type); super.setContentType(type);
 }

public void setLocale(java.util.Locale loc) {
ctx.log("locale: " + loc); super.setLocale(loc);
 }
}

在過(guò)濾器中,我們按照如下方式使用這個(gè)對(duì)象:


HttpServletResponse resp = (HttpServletResponse)response;
HeaderResponseWrapper hrespw = new HeaderResponseWrapper(resp, ctx);

System.out.println("********");

chain.doFilter(request, hrespw);

注意創(chuàng)建好封裝器之后chain.doFilter()方法就被調(diào)用。

定義好過(guò)濾器之后就應(yīng)該安裝它。為此,web.xml中應(yīng)該定義一個(gè)filter元素:


<filter>
<filter-name>
Headers Filter
</filter-name>
<filter-class>
DumpHeaders
</filter-class>
<!- optional <init-params> ->
</filter>

完成這一步之后,你還要把過(guò)濾器和你想要過(guò)濾的資源關(guān)聯(lián)起來(lái)。這時(shí)你有兩種選擇:在web.xml中,把過(guò)濾器關(guān)聯(lián)到單個(gè)命名的Servlet,或者把過(guò)濾器關(guān)聯(lián)到一個(gè)URL。如下所示:


<filter-mapping>
<filter-name>
Headers Filter
</filter-name>
<servlet-name>
AddressBookServlet
</servlet-name>
</filter-mapping>

或者:


<filter-mapping>
<filter-name>
Header Filter
</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

輸出的請(qǐng)求頭如下所示:


GET/AddressBook/Browse.jsp HTTP/1.1
accept: */*
referer: http://localhost/ AddressBook/
accept-language: en-gb
accept-encoding: gzip, deflate
user-agent: Mozilla/4.0 ( compatible; MSIE 5.5; Windows NT 5.0)
host: localhost
connection: Keep-Alive
cookie: JSESSIONID= E0F9646772F4448004C16122020664F1

輸出的應(yīng)答頭如下所示:


Content-Type: text/html;charset=8859_1 Content-Type: text/plain

如果進(jìn)行網(wǎng)絡(luò)跟蹤,你會(huì)發(fā)現(xiàn)這里少了一些東西。例如,狀態(tài)代碼沒(méi)有顯示,這是因?yàn)橛幸恍⿷?yīng)答頭由容器在過(guò)濾器鏈執(zhí)行之前或之后設(shè)置。

過(guò)濾器有很多用途,比如驗(yàn)證、轉(zhuǎn)換、加密/解密。但有一點(diǎn)必須注意:你可以把過(guò)濾器關(guān)聯(lián)到任意資源,而不僅僅是Servlet。如果你使用的是一個(gè)插入到其他Web服務(wù)器的Servlet引擎,Web服務(wù)器很可能會(huì)不依賴(lài)于Servlet容器獨(dú)立地提供服務(wù)。在這種情況下,Servlet容器將接收不到所有的請(qǐng)求,所以過(guò)濾器也就不會(huì)總是被執(zhí)行。

JSP 1.1中有一個(gè)問(wèn)題涉及到請(qǐng)求分派。如果你有一個(gè)頁(yè)面執(zhí)行include操作,jsp:include有一個(gè)必須設(shè)置為true的強(qiáng)制性flush(刷新)屬性:


<jsp:include page="somePage" flush="true" />

這個(gè)屬性強(qiáng)制容器把當(dāng)前緩沖區(qū)內(nèi)容刷新到客戶端。這樣,JSP頁(yè)面不能再設(shè)置任意HTTP應(yīng)答頭。JSP 1.2規(guī)范已經(jīng)修正這個(gè)問(wèn)題,jsp:include標(biāo)記中現(xiàn)在已經(jīng)可以指定flush="false"。

溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!

本類(lèi)教程下載

系統(tǒng)下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 中文字幕无码不卡免费视频| 亚洲 欧美 综合 另类 中字| 99re6这里有精品热视频| 成年人视频在线免费| 欧美变态另类刺激| 丰满少妇大力进入| 老太脱裤子让老头玩xxxxx| 天堂а√在线中文在线| 青青草免费在线视频观看| 黄色a级三级三级三级| 国产美女视频免费看| 在线免费黄色小视频| 992tv成人免费观看| mm131午夜| www.国产在线播放| 国产亚洲黄色片| 动漫av网站免费观看| 999精品网站| www.久久av.com| 路边理发店露脸熟妇泻火| 免费看欧美一级片| 欧美牲交a欧美牲交aⅴ免费真| www黄色av| 午夜免费福利网站| 男的插女的下面视频| av黄色在线网站| 久久久国产欧美| 免费看污污视频| 欧美 日韩 国产一区| 日韩av片专区| 国产极品尤物在线| 亚洲va综合va国产va中文| 老司机午夜免费福利视频| 欧美视频在线播放一区| 九九精品久久久| 欧美成人三级在线视频| 污污动漫在线观看| 免费拍拍拍网站| 99九九99九九九99九他书对| 隔壁人妻偷人bd中字| 亚洲天堂2018av| 免费看一级大黄情大片| 91在线第一页| 国产欧美高清在线| 国内精品国产三级国产99| 99视频精品免费| 国产xxxx振车| 免费在线观看污污视频| www日韩在线观看| 日本熟妇人妻xxxx| 黄色一级片网址| 国产高清视频网站| 日韩少妇内射免费播放18禁裸乳| 青娱乐精品在线| 欧美成人三级在线播放| 少妇高潮喷水在线观看| 国产在线xxxx| 神马午夜伦理影院| 久久成年人网站| 亚洲精品永久视频| 五月婷婷激情久久| 免费激情视频在线观看| 久久精品免费一区二区| 成人免费观看cn| 亚洲国产精品成人天堂| 国产黄色激情视频| 成人小视频在线观看免费| 精品91一区二区三区| 日本美女视频一区| 爱豆国产剧免费观看大全剧苏畅| 亚洲免费av一区二区三区| 亚洲熟女乱色一区二区三区| 东北少妇不带套对白| 男人添女人荫蒂免费视频| 搞av.com| 免费在线观看的毛片| 美女网站免费观看视频| 高清一区在线观看| 亚洲网中文字幕| 黄色污污在线观看| 欧美 日韩 国产 高清| 久久9精品区-无套内射无码| 黑森林精品导航| www.桃色.com| 久久亚洲a v| 亚洲中文字幕无码专区| 亚洲欧美自偷自拍另类| 在线观看成人免费| 久草资源站在线观看| 国产又黄又猛又粗| 最新视频 - x88av| 欧美亚洲另类色图| 99国产精品久久久久久| avav在线播放| 美女黄色片视频| 国产小视频免费| 国产三级三级看三级| 成人在线免费观看视频网站| 国产精品沙发午睡系列| 亚洲综合123| 黄色片久久久久| 亚洲国产午夜精品| 欧美视频在线观看网站| 日本中文字幕影院| 香港三级韩国三级日本三级| 国产传媒免费观看| 欧美黄网站在线观看| 91制片厂免费观看| 五月婷婷激情久久| 欧美日韩黄色一级片| 欧美xxxxxbbbbb| 视色视频在线观看| 国产l精品国产亚洲区久久| 黄色网络在线观看| 五月天中文字幕在线| 日本a级片免费观看| 国产女教师bbwbbwbbw| 中文字幕成人在线视频| 欧美牲交a欧美牲交aⅴ免费下载| 免费看污污视频| 特级西西444www| 自拍偷拍21p| 免费看污污网站| 别急慢慢来1978如如2| 六月丁香激情网| a级黄色一级片| 久久综合久久网| 大荫蒂性生交片| 免费看日本黄色| 国产精品自拍合集| 成年人深夜视频| 日韩国产小视频| 精品国产一区二区三区无码| 中国一级黄色录像 | 天天久久综合网| 日韩av片网站| 成人免费在线观看视频网站| 99精品视频播放| 国产精品入口免费软件| 韩国中文字幕av| 亚洲一二三区av| www.com黄色片| www.久久久久久久久久久| 中文字幕一区久久| 精品日韩在线播放| 拔插拔插海外华人免费| 波多野结衣之无限发射| 三级4级全黄60分钟| 噼里啪啦国语在线观看免费版高清版| 无码无遮挡又大又爽又黄的视频| 又粗又黑又大的吊av| 色七七在线观看| 手机福利在线视频| 日韩视频免费播放| 老头吃奶性行交视频| 黄色aaaaaa| 3d动漫一区二区三区| 免费在线观看的毛片| 欧美精品色视频| 日本国产在线播放| 狠狠躁狠狠躁视频专区| 久久国产精品免费观看| 久久久亚洲国产精品| 无码人妻精品一区二区三区66| 手机av在线免费| 国产中文字幕乱人伦在线观看| 91av在线免费播放| 加勒比海盗1在线观看免费国语版| 久久国产精品网| 羞羞的视频在线| 18禁网站免费无遮挡无码中文| 亚洲午夜无码av毛片久久| 第一区免费在线观看| 香港三级韩国三级日本三级| 在线播放免费视频| 乱子伦视频在线看| www.日本在线视频| 91制片厂毛片| 欧美极品欧美精品欧美图片| aaa一级黄色片| 欧美一级片中文字幕| 影音先锋成人资源网站| 性生活免费在线观看| 北条麻妃在线观看| 欧美狂野激情性xxxx在线观| 激情黄色小视频| 免费黄色一级网站| 成人免费毛片网| 国产真人做爰毛片视频直播| 日本丰满少妇黄大片在线观看| 色片在线免费观看| 亚洲成人福利在线观看| 六月丁香婷婷在线| 无码人妻精品一区二区三区在线| 国产1区2区3区中文字幕| 亚洲一级片av| 天天干天天色天天干| www.午夜av| 日本77777| 超碰免费在线公开|