一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - ASP.NET教程 - Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解

Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解

2020-04-24 14:29SeeYouBug ASP.NET教程

本篇文章主要介紹了Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

 一、過濾器簡介

 

1.1、理解什么是過濾器

1、過濾器(Filters)就是向請求處理管道中注入額外的邏輯。提供了一個(gè)簡單而優(yōu)雅的方式來實(shí)現(xiàn)橫切關(guān)注點(diǎn)。

2、所謂的過濾器(Filters),MVC框架里面的過濾器完全不同于ASP.NET平臺里面的Request.Filters和Response.Filter對象,它們主要是實(shí)現(xiàn)請求和響應(yīng)流的傳輸。通常我們所說的過濾器是指MVC框架里面的過濾器。

3、過濾器可以注入一些代碼邏輯到請求處理管道中,是基于C#的Attribute的實(shí)現(xiàn)。當(dāng)負(fù)責(zé)調(diào)用Action的類ControllerActionInvoker在調(diào)用執(zhí)行Action的時(shí)候會檢查Action上面的Attribute并查看這些Attribute是否實(shí)現(xiàn)了指定的接口,以便進(jìn)行額外的代碼注入處理

1.2、理解為什么要使用過濾器

假設(shè)你做了一個(gè)小項(xiàng)目,其中某個(gè)功能是操作管理用戶信息模塊,有這樣一個(gè)需求,對用戶信息管理必須是已通過認(rèn)證的用戶才能操作,我們可以在每一個(gè)Action方法里面檢查認(rèn)證請求,如下所示:

 
 1 using MvcFilterDmo.Core;
 2 using System;
 3 using System.Collections.Generic;
 4 using System.Linq;
 5 using System.Web;
 6 using System.Web.Mvc;
 7 using System.Web.Security;
 8 
 9 namespace MvcFilterDmo.Controllers
10 {
11     public class HomeController : Controller
12     {
13         public ActionResult Index()
14         {
15             if (!Request.IsAuthenticated)
16             {
17                 FormsAuthentication.RedirectToLoginPage();
18             }
19             //操作部分...
20             return View();
21         }
22         public ActionResult Insert()
23         {
24             if (!Request.IsAuthenticated)
25             {
26                 FormsAuthentication.RedirectToLoginPage();
27             }
28             //操作部分...
29             return View();
30         }
31         public ActionResult Update()
32         {
33             if (!Request.IsAuthenticated)
34             {
35                 FormsAuthentication.RedirectToLoginPage();
36             }
37             //操作部分...
38             return View();
39         }
40         public ActionResult Delete()
41         {
42             if (!Request.IsAuthenticated)
43             {
44                 FormsAuthentication.RedirectToLoginPage();
45             }
46             //操作部分...
47             return View();
48         }
49         //其他Action操作方法
50         //...
51     }
52 }
 

通過上面的代碼,可以發(fā)現(xiàn)使用這種方式檢查請求認(rèn)證有許多重復(fù)的地方,這也就是為什么要使用過濾器的原因,使用過濾器可以實(shí)現(xiàn)相同的效果。如下所示:

 
 1 using MvcFilterDmo.Core;
 2 using System;
 3 using System.Collections.Generic;
 4 using System.Linq;
 5 using System.Web;
 6 using System.Web.Mvc;
 7 using System.Web.Security;
 8 
 9 namespace MvcFilterDmo.Controllers
10 {
11     [Authorize]
12     public class HomeController : Controller
13     {
14         public ActionResult Index()
15         {
16             //操作部分...
17             return View();
18         }
19         public ActionResult Insert()
20         {
21             //操作部分...
22             return View();
23         }
24         public ActionResult Edit()
25         { 
26             //操作部分...
27             return View();
28         }
29         public ActionResult Delete()
30         {
31             //操作部分...
32             return View();
33         }
34         //其他Action操作方法
35         //...
36     }
37 } 
 

過濾器是.NET里面的特性(Attributes),它提供了添加到請求處理管道的額外方法。這里使用Authorize過濾器可以實(shí)現(xiàn)同樣的效果,不過代碼就顯然比之前更加簡潔優(yōu)雅。

 

二、過濾器的使用

 

 

2.1、基本類型的過濾器

過濾器實(shí)現(xiàn)的機(jī)制:在MVC框架調(diào)用一個(gè)Action之前,它會檢查方法的定義中是否實(shí)現(xiàn)了特性(Attributes),如果實(shí)現(xiàn)的話,那么在請求處理管道適當(dāng)?shù)奈恢茫撎匦远x的方法會被調(diào)用。

Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解

ActionFilterAttribute類既實(shí)現(xiàn)了IactionFilter接口,也實(shí)現(xiàn)IResultFilter接口。這是一個(gè)抽象類,它要求你必須提供一個(gè)實(shí)現(xiàn)。AuthorizeAttribute和HandleErrorAttribute類,則包含了一些有用的特性,并且可以不必創(chuàng)建派生類進(jìn)行使用。

2.2、過濾器的應(yīng)用、應(yīng)用方式以及執(zhí)行順序

應(yīng)用: 過濾器可以被應(yīng)用到控制器上也可以用到Action方法上,應(yīng)用到控制上時(shí),表示所有的Action方法都有了這個(gè)過濾器,并且可以混合使用,或多次使用,如下所示:

 
 1 [A] //表示所有的Action方法都會應(yīng)用A過濾器
 2 Public class DemoController:Controller
 3 {
 4     [B]//B,C過濾器只作用于此Action方法,但它也會有A過濾器的應(yīng)用效果
 5     [C]
 6     Public ActionResult Index()
 7     {
 8           //操作部分...
 9          return View();
10     }  
11 }
 

應(yīng)用方式:特性的方式,如上面代碼所示。

執(zhí)行順序:相同類型過濾器,執(zhí)行順序靠近方法的先執(zhí)行,不同類型的過濾器一般執(zhí)行順序?yàn)?span style="color: #ff0000;">【authorize--->action--->actionResult至于異常過濾器不分先后,只要拋出異常時(shí)就會執(zhí)行異常過濾器。如果要調(diào)整執(zhí)行順序,可以通過調(diào)整Order方法值大小來控制執(zhí)行順序,值越小,越先執(zhí)行。下圖是Action/Result過濾器應(yīng)用的執(zhí)行順序圖

Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解

(1)、相同類型過濾器應(yīng)用示例:兩個(gè)自定義Action過濾器MyFirstFilter,MyThreeFilter應(yīng)用到同一個(gè)Action方法Index上。

Three控制器代碼如下:

Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解

MyFirstFilter 代碼如下:

Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解

MyThreeFilter代碼如下:

Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解

運(yùn)行結(jié)果如下:

 Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解

(2)、不同類型過濾器應(yīng)用示例:有一個(gè)自定義Action過濾器MyFirstFilter,有一個(gè)自定義Result過濾器MySecondFilter,應(yīng)用到同一個(gè)Action方法Index上。

Three控制器代碼如下:

Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解

MyFirstFilter 代碼如下:

Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解

MySecondFilter代碼如下:

Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解

運(yùn)行結(jié)果如下:

Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解

看完上面的解釋,可能你現(xiàn)在對這些過濾器的執(zhí)行順序,以及如何自定義過濾器還不明白,不要緊,下面我們會逐一介紹這幾個(gè)基本的過濾器的使用,以及如何自定義過濾器。

 

2.3、使用授權(quán)過濾器

所有實(shí)現(xiàn)了IAuthorizationFilter接口的都可以稱之為授權(quán)過濾器:其定義如下:

1   public interface IAuthorizationFilter
2         {
3             void OnAuthorization(AuthorizationContext filterContext);
4         }

由于MVC框架系統(tǒng)自帶的AuthorizeAttribute實(shí)現(xiàn)有一些突出的功能,而這種牽涉到安全的代碼一定要謹(jǐn)慎的編寫,所以一般我們不會直接實(shí)現(xiàn)這個(gè)接口,而是去繼承AuthorizeAttribute這個(gè)類,并重寫其AuthorizeCore方法,簽名為: bool AuthorizeCore(HttpContextBase httpContext) 而處理授權(quán)失敗的時(shí)候,可以重寫其HandleUnauthorizedRequest方法,其簽名為: void HandleUnauthorizedRequest(AuthorizationContext context) 。注意:驗(yàn)證與授權(quán)是兩回事,驗(yàn)證發(fā)生在授權(quán)之前。

默認(rèn)的授權(quán)過濾器已經(jīng)有了驗(yàn)證的功能,其驗(yàn)證的機(jī)理是利用Asp.net平臺自帶的驗(yàn)證機(jī)制,如表單驗(yàn)證和Windows驗(yàn)證。除了驗(yàn)證功能,它本身還有授權(quán)的功能。授權(quán)過濾器是所有過濾器中最早運(yùn)行的。

經(jīng)過Route到達(dá)了控制器的時(shí)候,在調(diào)用Action之前,MVC框架會檢測在相關(guān)的Action上是否有授權(quán)過濾器,如果有會調(diào)用OnAuthorization方法,如果此方法批準(zhǔn)了請求,才會調(diào)用相應(yīng)的Action。

使用授權(quán)過濾器幾種情況如下:

1.直接在Action上或者控制器上加Authorize,表示啟用了驗(yàn)證,但不牽涉到授權(quán)。

2.添加Authorize(Users=“a,b”)],表示啟用了驗(yàn)證,并且也啟用了授權(quán),只有a或者b用戶能訪問此控制器。

3.當(dāng)添加Authorize(Roles=“admin,Member”)]時(shí)的步驟如下:

---利用asp.net自帶的角色提供者,或者實(shí)現(xiàn)自己的角色提供者,實(shí)現(xiàn)自己的角色提供者時(shí),只需要集成RoleProvider類型,并實(shí)現(xiàn)其中的所有方法或部分方法,最好實(shí)現(xiàn)所有方法。

---在Web程序的根目錄的Web.config文件中配置角色管理者。

---在適當(dāng)?shù)腁ction中利用Roles類型來訪問自己創(chuàng)建的RoleProvider中的相關(guān)方法。

使用內(nèi)置的授權(quán)過濾器

MVC框架內(nèi)置的授權(quán)過濾器AuthorizeAttribute,它允許我們使用這個(gè)類的兩個(gè)公共屬性來指定授權(quán)策略,如下所示:

Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解

Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解

Users和Roles兩者是并且的關(guān)系,例如Users=“a,b,c”,Roles=“admin”,表示用戶是a,b,c 其中一個(gè)并且是Admin角色才能訪問。

創(chuàng)建自定義的授權(quán)過濾器

方式一:直接實(shí)現(xiàn)IAuthorizationFilter接口,但不推薦這樣做,因?yàn)闋可娴桨踩矫娴拇a。

方式二:繼承AuthorizeAttribute這個(gè)類,并重寫其AuthorizeCore方法,簽名為: bool AuthorizeCore(HttpContextBase httpContext),代碼如下所示:

 
 1  public class MyAuthorizeAttribute : AuthorizeAttribute
 2     {
 3         private string[] allowedUsers;
 4         public MyAuthorizeAttribute(params string[] users)
 5         {
 6             allowedUsers = new string[] { "admin", "user1", "xf" };
 7         }
 8 
 9         protected override bool AuthorizeCore(HttpContextBase httpContext)
10         {
11             return httpContext.Request.IsAuthenticated &&allowedUsers.Contains(httpContext.User.Identity.Name, 
12                 StringComparer.InvariantCultureIgnoreCase);
13         }
14     } 
 
 

2.4、使用動(dòng)作過濾器

 動(dòng)作過濾器是可以以用于任何目的的多用途過濾器,創(chuàng)建自定義動(dòng)作過濾器需要實(shí)現(xiàn)IActionFilter接口,該接口代碼如下所示:

Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解

該接口定義了兩個(gè)方法,MVC框架在調(diào)用動(dòng)作方法之前,會調(diào)用OnActionExecting方法。在調(diào)用動(dòng)作方法之后,則會調(diào)用OnActionExecuted方法。

實(shí)現(xiàn)OnActionExecting方法

參數(shù)ActionExecutingContext對象繼承于ControllerContext,其中的2個(gè)屬性:

ActionDescriptor:提供了關(guān)于Action方法的相關(guān)信息

Result:類型為ActionResult,通過給這個(gè)屬性設(shè)置一個(gè)非null的值就可以取消這個(gè)請求。

我們可以用過濾器來取消一個(gè)請求,通過設(shè)置Result屬性即可。代碼如下所示:

 
 1  public class MyActionFilterAttribute : FilterAttribute, IActionFilter
 2     {
 3         public void OnActionExecuting(ActionExecutingContext filterContext)
 4         {
 5            if(filterContext.HttpContext.Request.IsLocal)
 6            {
 7                filterContext.Result = new HttpNotFoundResult();
 8            }
 9         }
10         public void OnActionExecuted(ActionExecutedContext filterContext)
11         {
12             //未做實(shí)現(xiàn)
13         }
14     }
 

這個(gè)例子通過用OnActionExecuting方法檢查請求是否來自本地機(jī)器,如果是,編隊(duì)用戶返回一個(gè)“404”未找到的響應(yīng)。運(yùn)行結(jié)果如下圖:

 Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解

實(shí)現(xiàn)OnActionExecuted方法

我們也可以通過OnActionExecuted方法來執(zhí)行一些跨越動(dòng)作方法的任務(wù),下面這個(gè)例子是計(jì)算動(dòng)作方法運(yùn)行的時(shí)間,代碼如下:

 
 1  public class MyActionFilterAttribute : FilterAttribute, IActionFilter
 2     {
 3         private Stopwatch timer;
 4         public void OnActionExecuting(ActionExecutingContext filterContext)
 5         {
 6             timer = Stopwatch.StartNew();
 7         }
 8         public void OnActionExecuted(ActionExecutedContext filterContext)
 9         {
10             timer.Stop();
11             if (filterContext.Exception == null)
12             {
13                 filterContext.HttpContext.Response.Write(
14                     string.Format("動(dòng)作方法延遲的時(shí)間: {0}",
15                         timer.Elapsed.TotalSeconds));
16             }
17         }
18     }
19 }
 

我們將自定義的動(dòng)作過濾器MyActionFilter應(yīng)用到HomeControllerIndex方法上,運(yùn)行結(jié)果如下:

Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解

 

2.5、使用結(jié)果過濾器

結(jié)果過濾器是多用途的過濾器,他會對動(dòng)作方法所產(chǎn)生結(jié)果進(jìn)行操作,結(jié)果過濾器實(shí)現(xiàn)IResultFilter接口,創(chuàng)建自定義結(jié)果過濾器需要現(xiàn)IResultFilter接口,該接口代碼如下所示:

Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解

當(dāng)結(jié)果過濾器運(yùn)用于一個(gè)動(dòng)作方法時(shí),會在動(dòng)作方法返回動(dòng)作結(jié)果之前,調(diào)用OnResultExecuting方法,在返回動(dòng)作結(jié)果之后,會調(diào)用OnResultExecuted方法。下面這個(gè)例子是計(jì)算動(dòng)作方法返回結(jié)果運(yùn)行的時(shí)間,代碼如下:

 
 1  public class MyResultFilterAttribute : FilterAttribute, IResultFilter
 2     {
 3         private Stopwatch timer;
 4         public void OnResultExecuting(ResultExecutingContext filterContext)
 5         {
 6             timer = Stopwatch.StartNew();
 7         }
 8         public void OnResultExecuted(ResultExecutedContext filterContext)
 9         {
10             timer.Stop();
11             filterContext.HttpContext.Response.Write(string.Format("結(jié)果執(zhí)行延遲時(shí)間: {0}", timer.Elapsed.TotalSeconds));
12         }
13 }
 

我們將自定義的結(jié)果過濾器MyResultFilter應(yīng)用到HomeControllerIndex方法上,運(yùn)行結(jié)果如下:

Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解

需要注意的是:動(dòng)作過濾器是運(yùn)行在頁面輸出之前,結(jié)果過濾器是運(yùn)行在頁面輸出之后。

 

2.6、使用異常過濾器

異常過濾器只有在調(diào)用一個(gè)動(dòng)作方法而拋出未處理的異常才會運(yùn)行,這種異常來自以下位置:

A、另一種過濾器(授權(quán)、動(dòng)作、或結(jié)果過濾器)。

B、動(dòng)作方法本身。

C、當(dāng)動(dòng)作結(jié)果被執(zhí)行時(shí)。

使用內(nèi)置的異常過濾器

HandleErrorAttribute(處理程序錯(cuò)誤特性),它是MVC內(nèi)嵌的異常過濾器,有以下3個(gè)重要的屬性:

1.ExceptionType:類型為Type,表示希望被此過濾器處理的異常類型,包括其子類型,默認(rèn)值為System.Exception

2.View:類型為string,表示此過濾器呈遞的視圖頁面,默認(rèn)值為Error

3.Master:呈遞的視圖頁的母板頁,如果不指定,視圖會用其默認(rèn)的母版頁

內(nèi)嵌的HandleErrorException只有在配置文件Web.config中配置的CustomError mode設(shè)置為on的時(shí)候才生效(其默認(rèn)模式為RemoteOnly,如下圖所示:

Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解

此過濾器還會給視圖傳遞一個(gè)HandleErrorInfo類型的對象給視圖,以便視圖可以顯示一些額外的關(guān)于錯(cuò)誤的信息。下面是使用異常過濾器的示例。

應(yīng)用到Index動(dòng)作方法上:

Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解

Views/Shared文件夾下添加一個(gè)顯示異常信息的視圖頁SpecialError.cshtml,頁面代碼如下:

 
 1 @model HandleErrorInfo
 2     <!DOCTYPE html>
 3     <html>
 4     <head>
 5         <meta name="viewport" content="width=device-width" />
 6         <title>SpecialError</title>
 7     </head>
 8     <body>
 9         <div>
10             <p>
11                 There was a<b>@Model.Exception.GetType().Name</b>
12                 while rendering<b>@Model.ControllerName</b>'s
13                 <b>@Model.ActionName</b> action
14             </p>
15         </div>
16     </body>
17 </html>
 

運(yùn)行結(jié)果如下:

Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解

創(chuàng)建自定義的異常過濾器

如果我們對異常過濾器有特殊的需求,可以通過自定義的異常過濾器來完成,創(chuàng)建自定義異常過濾器必須實(shí)現(xiàn)IExceptionFilter接口,該接口代碼如下:

Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解

當(dāng)一個(gè)未知處理異常發(fā)生時(shí),OnException方法會被調(diào)用。該方法的傳遞一個(gè)ExceptionContext對象,派生于ControllerContext類,定義了一些額外的過濾器專有屬性如下表所示:

Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解

拋出的異常通過Exception屬性是可以訪問的。通過把ExceptionHandled屬性設(shè)置為true,一個(gè)異常過濾器可以報(bào)告它已經(jīng)處理了該異常,應(yīng)用于一個(gè)動(dòng)作的所有異常過濾器都會被調(diào)用。

需要注意的是:如果一個(gè)動(dòng)作方法的所有異常過濾器均為把ExceptionHandled屬性設(shè)置為true,MVC框架將使用默認(rèn)的ASP.NET異常處理程序。

Result屬性有異常過濾器使用,以告訴MVC框架要做什么,異常過濾器的兩個(gè)主要應(yīng)用是記錄該異常到日志,并把適當(dāng)?shù)南@示給用戶。下面的代碼將演示通過創(chuàng)建一個(gè)自定義的異常過濾器,當(dāng)一個(gè)特定的鐘類的未處理異常出現(xiàn)時(shí),把該用戶重定向到一個(gè)指定的錯(cuò)誤頁面。

 
 1  public class MyExectionAttribute:FilterAttribute,IExceptionFilter
 2     {
 3         public void OnException(ExceptionContext filterContext)
 4         {
 5             if(!filterContext.ExceptionHandled&&
 6                 filterContext.Exception is NullReferenceException)
 7             {
 8                 filterContext.Result = new RedirectResult("~/Content/SpecialErrorPage.html");
 9                 filterContext.ExceptionHandled = true;
10             }
11         }
12 }
 

后在項(xiàng)目根目錄添加一個(gè)名為Content的文件夾,在該文件夾下創(chuàng)建SpeciErrorPage.html文件,當(dāng)異常被處理時(shí),將以這個(gè)錯(cuò)誤頁面顯示個(gè)用戶。該頁面代碼如下:

 
 1 <!DOCTYPE html>
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
 5     <title></title>
 6 </head>
 7 <body>
 8     <h1>Sorry</h1>
 9     <p>this is a Excetption test</p>
10     There was aNullReferenceException while renderingHome's Index action 
11 </body>
12 </html>
 

在控制器中應(yīng)用MyExection異常過濾器,并主動(dòng)讓其拋出一個(gè)空引用異常,以便測試。

 
1 public class HomeController : Controller
2     {
3         [MyExection]
4         public ActionResult Index()
5         {
6             throw new NullReferenceException();
7         }
8     }
 

運(yùn)行結(jié)果如下:

Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解

總結(jié):本文章簡單總結(jié)了對過濾器的理解以及如何使用MVC框架內(nèi)置基本的過濾器和如何自定義過濾器及應(yīng)用。

總結(jié):本文章簡單總結(jié)了對過濾器的理解以及如何使用MVC框架內(nèi)置基本的過濾器和如何自定義過濾器及應(yīng)用。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:http://www.cnblogs.com/SeeYouBug/p/6446100.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久成人精品免费播放 | 久久成人永久免费播放 | 久久久精品3d动漫一区二区三区 | 猛操女人| 草莓香蕉榴莲丝瓜秋葵绿巨人在线看 | 国产剧情一区 | 国产福利在线观看91精品 | 成年人福利视频 | 果冻传媒在线视频播放观看 | 男同激情视频 | 大胸被c出奶水嗷嗷叫 | 亚洲成年男人的天堂网 | 成人福利在线观看 | 亚洲国产第一区二区三区 | 特级www| ak福利午夜在线观看 | 明星h文集合短篇小说 | 特黄aa级毛片免费视频播放 | 新影音先锋男人色资源网 | 久久内在线视频精品mp4 | 大象传媒短视频网站 | 超强台风免费观看完整版视频 | 免费老外的毛片清高 | 美女机机对机机的视频(免费) | juy799大岛优香在线观看 | 亚洲色图丝袜 | 美尻在线| 天作谜案免费完整版在线观看 | 国产精品久久久久不卡绿巨人 | 日本一区二区三区精品 | 久久久久久久伊人电影 | 5月色婷婷 | 亚洲天堂免费看 | 女人pp被扒开流水了 | 国产福利视频一区二区微拍 | 好大好深受不了了快进来 | 99热这里有精品 | 色视频久久 | 欧美办公室silkstocking | 99久久精品免费观看区一 | 国产成人小视频在线观看 |