精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

讓前端監控數據采集更高效

安全 應用安全
隨著業務的快速發展,我們對生產環境下的問題感知能力越來越關注。作為距離用戶最近的一層,前端的表現是否可靠、穩定、好用,很大程度上決定著用戶對整個產品的體驗和感受。因此,對于前端的監控不容忽視。

 隨著業務的快速發展,我們對生產環境下的問題感知能力越來越關注。作為距離用戶最近的一層,前端的表現是否可靠、穩定、好用,很大程度上決定著用戶對整個產品的體驗和感受。因此,對于前端的監控不容忽視。

搭建一套前端監控平臺需要考慮的方面很多,比如數據采集、埋點模式、數據處理和分析、報警以及監控平臺在具體業務中的應用等等。在這所有環節中,準確、完整、全面的數據采集是一切的前提,也為后續的用戶精細化運營提供基礎。

前端技術的日新月異給數據采集也帶來了變化和挑戰,傳統的手工打點模式已經不能滿足需求。如何在新的技術背景下讓前端數據采集工作更加完善、高效,是本文討論的重點。

[[262933]]

前端監控數據采集

在采集數據之前,首先要考慮采集什么樣的數據。我們重點關注兩類數據,一類是與用戶體驗相關的,如首屏時間、文件加載時間、頁面性能等;另外是幫助我們及時感知產品上線后是否出現異常的,比如資源錯誤、API 響應時間等。具體來說,我們對前端的數據采集具體主要分為:

  • 路由切換 (href、hashchange、pushState)
  • JsError
  • 性能 (performance)
  • 資源錯誤
  • API
  • 日志上報

 路由切換

Vue、React、Angular 等前端技術的快速發展使單頁面應用盛行。我們都知道,傳統的頁面應用是用一些超鏈接來實現頁面切換和跳轉的,而單頁面應用是使用各自的路由系統來管理前端的每一個頁面切換,例如 vue-router、react-router 等,跳轉時僅刷新局部資源 ,js、css 等公共資源只需要加載一次,這就使傳統網頁進入離開的方式只有***次打開能被記錄。單頁應用后續所有路由切換的方式有兩種,一種是 Hash,一種是 HTML5 推出的 History API。

1. href

href 為頁面初始化的***次進入,這里只需要單純上報「進入頁面」事件即可。

2. hashchange

Hash 路由一個明顯的標志是帶有「 # 」。Hash 的優勢是兼容性更好,但問題在于 URL 中一直存在「 # 」并不美觀。我們主要通過監聽 URL 中的 hashchange 來捕獲具體的 hash 值進行檢測。

  1. window.addEventListener('hashchange'function() { 
  2.     // 上報【進入頁面】事件 
  3. }, true

需要注意的是,在新版 vue-router 中如果瀏覽器支持 history,即使 mode 選擇 hash 也會優先選擇 history 模式,雖然表現形式暫時還是 # 號,但實際上是模擬的,所以千萬不要認為自己在 mode 選擇了hash 就一定會是 hash。

3. History API

History 利用了 HTML5 History Interface 中新增的 pushState() 和 replaceState() 方法進行路由切換,是目前主流的無刷新切換路由方式。與 hashchange 只能改變 # 后面的代碼片段相比,History API (pushState、replaceState) 給了前端完全的自由。

PopState 是瀏覽器返回事件的回調,但是更新路由的 pushState、replaceState 并沒有回調事件,因此,還需要分別在 history.pushState() 和 history.replaceState() 方法里處理 URL 的變化。在這里,我們運用到了一種類似 Java 的 AOP 編程思想,對 pushState 和 replaceState 進行改造。

AOP (Aspect-oriented programming)即面向切面編程,提倡針對同一類問題進行統一處理。AOP 的核心思想是讓某個模塊能夠重用,它采用橫向抽取機制,將功能代碼從業務邏輯代碼中分離出來,擴展功能而不修改源代碼,相比封裝來說隔離得更加徹底。

下面介紹我們的具體改造方式:

  1. // ***階段:我們對原生方法進行包裝,調用前執行 dispatchEvent 了一個同樣的事件 
  2. function aop (type) { 
  3.     var source = window.history[type]; 
  4.     return function () { 
  5.         var event = new Event(type); 
  6.         event.arguments = arguments; 
  7.         window.dispatchEvent(event); 
  8.         var rewrite = source.apply(this, arguments); 
  9.         return rewrite; 
  10.     }; 
  11.  
  12. // 第二階段:將 pushState 和 replaceState 進行基于 AOP 思想的代碼注入 
  13. window.history.pushState = aop('pushState'); 
  14. window.history.replaceState = aop('replaceState'); // 更改路由,不會留下歷史記錄 
  15.  
  16. // 第三階段:捕獲pushState 和 replaceState 
  17. window.addEventListener('pushState'function() { 
  18.     // 上報【進入頁面】事件 
  19. }, true
  20. window.addEventListener('replaceState'function() { 
  21.     // 上報【進入頁面】事件 
  22. }, true

window.history.pushState 實際調用關系如圖:

至此,我們對 pushState、replaceState 改造完畢,實現了有效地捕獲路由切換。可以看到,我們在不侵入業務代碼的情況下,對 window.history.pushState 進行了擴展,在調用的同時會主動 dispatchEvent 一個 pushState。

但在這里我們也能看到一個弊端,就是如果 AOP 代理函數發生 JS 錯誤,將會阻斷后續的調用關系,使實際的 window.history.pushState 無法被調用。所以在使用此方式的時候,要對 AOP 代理函數的內容做好完善的 try catch,來防止業務上出現異常。

*Tips:想自動捕獲頁面停留時間只需要在下一個進入頁面事件觸發時,通過上一個頁面的打點時間和當前時間做差值即可,這時候可以上報一個【離開頁面】事件。

 JsError

前端項目中,由于 JavaScript 本身是一個弱類型語言,加上瀏覽器環境的復雜性、網絡問題等,很容易發生錯誤。因此做好網頁錯誤監控,不斷優化代碼,提高代碼健壯性是一項很重要的工作。

JsError 的捕獲可以幫助我們分析和監控線上問題,它與我們在 Chrome 瀏覽器的調試工具 Console 中看到的內容一致。

1. window.onerror

我們使用 window.onerror 捕獲一般情況下 JS 錯誤的異常信息。捕獲 JS 錯誤的方式有兩種,window.onerror 和 window.addEventListener(‘error’)。一般情況下,捕獲 JS 異常不推薦使用 addEventListener(‘error’),主要是因為它沒有堆棧信息,而且還需要對捕獲到的信息做區分,因為它會將所有異常信息捕獲到,包括資源加載錯誤等。

  1. window.onerror = function (msg, url, lineno, colno, stack) { 
  2.     // 上報 【js錯誤】事件 

2. Uncaught (in promise)

當 Promise 內發生 JS 錯誤或者 reject 信息未被業務處理的情況時,會拋出一個 unhandledrejection,并且這個錯誤不會被 window.onerror 以及 window.addEventListener('error')  捕獲,這里需要用專門的 window.addEventListener('unhandledrejection')  進行捕獲處理:

  1. window.addEventListener('unhandledrejection'function (e) { 
  2.     var reg_url = /\(([^)]*)\)/; 
  3.     var fileMsg = e.reason.stack.split('\n')[1].match(reg_url)[1]; 
  4.     var fileArr = fileMsg.split(':'); 
  5.     var lineno = fileArr[fileArr.length - 2]; 
  6.     var colno = fileArr[fileArr.length - 1]; 
  7.     var url = fileMsg.slice(0, -lno.length - cno.length - 2);}, true); 
  8.     var msg = e.reason.message; 
  9.     // 上報 【js錯誤】事件 

我們注意到 unhandledrejection 因為繼承自 PromiseRejectionEvent,PromiseRejectionEvent 又繼承自 Event,所以 msg、url、lineno、colno、stack 以字符串形式放到了 e.reason.stack 中,我們需要解析出來上述參數來和 onerror 參數對齊,為后續監控平臺的指標統一化打下基礎。

3. 常見問題

  • "Script error."

如果出現捕獲的 msg 全部為 "Script error." ,問題在于你的 JS 地址和當前網頁不在同一個域下。因為我們要經常在線上的版本做靜態資源 CDN 化,會導致常訪問的頁面跟腳本文件來自不同的域名。這時如果沒有進行額外的配置,瀏覽器出于安全方面的設計就容易出現 "Script error."。我們可以利用目前流行的 Webpack 打包工具來處理此類問題。

  1. // webpack config 配置 
  2. // 處理 html 注入 js 添加跨域標識 
  3. plugins: [ 
  4.     new HtmlWebpackPlugin({ 
  5.       filename: 'html/index.html'
  6.       template: HTML_PATH, 
  7.       attributes: { 
  8.         crossorigin: 'anonymous' 
  9.       } 
  10.     }), 
  11.     new HtmlWebpackPluginCrossorigin({ 
  12.       inject: true 
  13.     }) 
  14.  
  15. // 處理按需加載的 js 添加跨域標識 
  16. output: { 
  17.     crossOriginLoading: true 
  • SourceMap

大部分場景下,生產環境中的代碼都是經過壓縮合并的,這使得我們捕獲到的錯誤很難映射到具體的源碼,為我們解決問題帶來很大困擾,這里簡要提出 2 個解決方案的思路。

生產環境我們需要添加 sourceMap 配置,這會導致安全隱患,因為這樣外網就可以通過 sourceMap 進行源碼映射。為了降低風險,我們可以通過如下方式:

  • 將 sourceMap 生成的 .map 文件設置公司內網訪問,降低源碼安全風險
  • 在發布代碼到 CDN 的時候,將 .map 文件存儲到公司內網下

這時我們已經擁有了 .map 文件,后續要做的就是通過捕獲到的 lineno、colno、url 調用 mozilla/source-map 庫進行源碼映射,即可拿到真實的源碼錯誤信息。

 性能

性能指標的獲取相對比較簡單,在 onload 之后讀取 window.performance 即可,里面包含了性能、內存等信息。這部分內容在很多現有的文章中都有介紹,因篇幅所限不在本文做過多展開,之后在相關主題文章中我們會有相關探討,感興趣的朋友可以添加「馬蜂窩技術」公眾號持續關注。

 資源錯誤

首先我們要明確下資源錯誤捕獲的使用場景,更多的是感知 DNS 劫持 及 CDN 節點異常等,具體方式如下:

  1. window.addEventListener('error'function (e) { 
  2.     var target = e.target || e.srcElement; 
  3.     if (target instanceof HTMLScriptElement) { 
  4.         // 上報 【資源錯誤】事件 
  5.     } 
  6. }, true

這里只做基本演示,實際環境中我們會關心更多的 Element 錯誤,如 css、img、woff 等,大家可以根據不同的場景自行添加。

*資源錯誤的使用場景更多依賴其他幾個維度,如:地域、運營商等,后續的篇幅中我們會具體講解。

 API

市面上主流的框架(如 Axios、jQuery.ajax 等)中,基本上所有的 API 請求都是基于xmlHttpRequest 或者 fetch,所以捕獲全局接口錯誤的方式就是封裝 xmlHttpRequest 或者 fetch。這里,我們的 SDK 仍然使用到上文提及的 AOP 思想,對 API 進行攔截。

1. XmlHttpRequest

  1. var xhr = window.XMLHttpRequest; 
  2. var _open = xhr.prototype.open
  3. var _send = xhr.prototype.send; 
  4. var attr = {}; 
  5. var openReplacement = function (method, url) { 
  6.     // 可以存儲method、url、時間打點等信息 
  7.     attr.duration = new Date().getTime(); 
  8.     _open.apply(this, arguments); 
  9. var sendReplacement = function () { 
  10.     methods.addEvent(this, 'readystatechange'function (attr) { 
  11.         // 可以存儲response的status、計算客戶端實際響應時間 
  12.         attr.status = this.status; 
  13.         attr.duration = new Date().getTime() - attr.duration; 
  14.         // 上報【API】事件 
  15.     }.bind(this, , JSON.parse(JSON.stringify(attr)))); 
  16.     _send.apply(this, arguments); 
  17. xmlhttp.prototype.open = openReplacement; 
  18. xmlhttp.prototype.send = sendReplacement; 

2. Fetch

  1. var _fetch = window.fetch
  2. window.fetch = function () { 
  3.     var attr = { 
  4.         method: arguments[1].method, 
  5.         url: arguments[0], 
  6.         duration: new Date().getTime() 
  7.     }; 
  8.  
  9.     return _fetch.apply(this, arguments).then(res => { 
  10.         attr.status = res.status; 
  11.         attr.duration = new Date().getTime() - attr.duration; 
  12.         // 上報【API】事件 
  13.         return res; 
  14.     }); 

需要注意的是,API 攔截一定要對 SDK 自己上報的 API 設置好忽略,否則將會導致循環上報問題。

 日志上報

為了監控前端應用是否正常運行,通常會在前端收集錯誤與性能等數據,最終將這些數據上報到服務端。因為日志上報并不是應用的主要功能邏輯,優先級比較低,所以我們在確保日志數據上報更高效的同時,還應該考慮如何盡可能地減少與其他關鍵操作的資源爭搶。

1. sendBeacon

navigator.sendBeacon() 方法主要用于滿足統計和診斷代碼的需要。這些代碼通常會在卸載文檔之前,嘗試通過 HTTP 將少量數據異步傳輸到 Web 服務器。它解決了日志上報在 unload 時成功率很低的問題。我們在埋點時有很多對離開頁面時上報的需求,因為 SendBeacon 是異步的,不會影響當前頁到下一個頁面的跳轉速度,可以更可靠地保障事件上報成功率,并且不影響路由切換。

  1. window.navigator.sendBeacon('上報事件的api''數據參數'

2. img.src

當瀏覽器不支持 navigator.sendBeacon 時,我們可以采用模擬圖片加載的方式發送日志上報事件,且不會存在跨域問題。

  1. var img = new Image(); 
  2. img.src = API + '?' + '數據參數' 

3. 關于 XmlHttpRequest

這里不推薦用 XmlHttpRequest。XHR 雖然支持異步請求,直接發送數據到后端,但是會受到跨域和同源的限制。而通過日志上報 API 跟業務是不在一個域下的,如果采用這種模式需要設置 Access-Control-Allow-Origin:* 跨域,非常不方便,并且在 unload 情況下上報發生的丟包率***。

總結來看,日志上報推薦采用 sendBeacon -> img.src。在不影響用戶路由切換和阻塞用戶的情況下丟包率可以控制在 10%-30%,具體要看用戶群體對應的環境。

小結

高效的前端數據采集對于搭建前端監控平臺來說非常關鍵。本文我們分享了馬蜂窩在保證數據采集及時、準確、全面等方面的一些思路和實踐。需要提示大家注意的是,文中涉及到的演示只做了核心代碼的關鍵描述,不具備生產使用,我們在實際使用中需要做好兼容及容錯。

本文也將作為馬蜂窩前端監控平臺系列文章的開篇,今后還將陸續推出埋點模式、數據處理和分析、報警以及監控平臺在具體業務中的應用等內容,歡迎大家持續關注。

本文作者:王崢,馬蜂窩大數據平臺前端技術專家。

(題圖來源于網絡)

【本文是51CTO專欄作者馬蜂窩技術的原創文章,作者微信公眾號馬蜂窩技術(ID:mfwtech)】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2018-05-08 14:58:07

戴爾

2015-09-30 14:22:44

Qlik數據

2023-11-24 11:20:04

functoolsPython

2016-06-30 16:54:49

UCloud愛數云計算

2025-04-24 08:40:00

JavaScript代碼return語句

2023-09-12 16:20:04

邊緣AI深度學習

2011-07-21 13:52:43

組策略網絡打印機

2017-11-02 10:23:48

冷熱分層存儲

2024-12-20 16:41:22

2016-09-29 13:44:23

數據中心

2022-06-10 14:09:18

前端監控異常數據

2017-12-21 14:36:10

大數據健身智慧

2013-04-03 09:49:48

LinkedIn大數據

2024-06-24 00:05:00

Python代碼

2010-12-23 15:55:00

上網行為管理

2018-10-23 15:20:29

SparkShuffleSpark SQL

2024-04-26 07:54:07

ZustandReact狀態管理庫

2015-04-02 12:42:26

HDFS分層存儲高效

2015-12-31 11:57:17

華為eLTE物聯網

2010-12-12 09:40:00

Android UI設
點贊
收藏

51CTO技術棧公眾號

亚洲第一黄色网| 国产精品久久久久天堂| 欧美性受xxxx黑人猛交| 国内精品久久99人妻无码| 午夜精品久久久久久久久久蜜桃| 国产亚洲精品精华液| 国产日韩av在线播放| 极品久久久久久| 欧美尿孔扩张虐视频| 欧美网站大全在线观看| 欧美另类videosbestsex日本| 天堂在线资源8| 日本美女一区二区三区视频| 欧美精品在线免费播放| 精品成人av一区二区三区| 免费成人高清在线视频| 亚洲一区电影777| 欧美精品尤物在线| 国产精品色综合| 国产欧美日韩亚洲一区二区三区| 伊人亚洲福利一区二区三区| 国产av一区二区三区传媒| 久久青青视频| 亚洲黄色尤物视频| 日本免费高清一区二区| 午夜免费福利视频| 日本色综合中文字幕| 欧美激情第1页| 人妻无码一区二区三区免费| 老汉色老汉首页av亚洲| 欧美一卡二卡三卡四卡| 日本男人操女人| 美足av综合网| 中文字幕第一页久久| 久久99国产精品| 国产黄色片网站| 麻豆国产91在线播放| 欧洲午夜精品久久久| 久草中文在线视频| 久久久久亚洲| 在线观看日韩专区| av无码av天天av天天爽| 亚洲伊人影院| 欧美一区二区在线免费观看| 国产一级特黄a大片免费| √8天堂资源地址中文在线| 中文字幕在线一区| 欧美一区二区三区四区夜夜大片 | sese一区| 久久理论电影网| 精品免费日产一区一区三区免费| 亚洲第一精品网站| 国产乱理伦片在线观看夜一区| 国产欧美日韩精品专区| 亚洲 小说区 图片区| 久久高清一区| 日本aⅴ大伊香蕉精品视频| 精品成人久久久| 在线亚洲欧美| 欧美一区二区三区精品电影| 日韩伦理在线视频| 国产日韩视频| 欧美最猛黑人xxxx黑人猛叫黄| 国产精品999在线观看| 日韩视频三区| 欧美一乱一性一交一视频| 日本最新中文字幕| 国产欧美精品| 国产精品成人免费电影| 最近中文字幕在线观看| 麻豆免费精品视频| 91精品国产综合久久香蕉最新版 | 欧美人与禽zozo性伦| 亚洲欧美手机在线| 精品中文视频| 精品国产精品一区二区夜夜嗨| a级片在线观看视频| 国产亚洲精品美女久久| 亚洲精品一区中文字幕乱码| 51妺嘿嘿午夜福利| 成人6969www免费视频| 色综合伊人色综合网| 亚洲国产123| 欧美精品一区二区三区久久久竹菊| 欧美成人免费全部观看天天性色| 久久香蕉精品视频| 麻豆久久精品| 国产精品青青在线观看爽香蕉| 国产精品久久久久久免费| 国产麻豆精品一区二区| 国产欧美韩日| 国模精品一区二区| 中文字幕视频一区| 日韩精品综合在线| 中文字幕这里只有精品| 在线观看91精品国产入口| 中文av字幕在线观看| av动漫精品一区二区| 日韩av在线免费观看| 丁香花五月婷婷| 亚洲一区在线| 91极品视频在线| 国产无遮挡又黄又爽又色视频| 麻豆精品久久久| 国产成人女人毛片视频在线| 美女欧美视频在线观看免费 | 99免费在线视频观看| 天堂a中文在线| 国产精品色婷婷久久58| av久久久久久| 成人不卡视频| 亚洲国产精品推荐| 永久av免费网站| 国产情侣一区| 91久久久久久久久| 欧美777四色影视在线| 亚洲日穴在线视频| av网站在线观看不卡| 国产精品日本一区二区三区在线| 日韩国产欧美区| 欧美一级片在线视频| 久久一区激情| 成人免费在线看片| 日本激情在线观看| 欧美日韩亚洲成人| 粗大的内捧猛烈进出视频| av永久不卡| 午夜剧场成人观在线视频免费观看| 中文字幕乱码在线观看| 99久久精品费精品国产一区二区| 国产日本欧美在线| 丝袜美腿一区| 日韩大片免费观看视频播放| 欧美激情精品久久| 久久av老司机精品网站导航| 欧美日韩系列| heyzo高清在线| 欧美一二三区在线观看| 91香蕉视频污在线观看| 肉丝袜脚交视频一区二区| 国产在线精品一区二区三区》 | 日韩大片在线免费观看| 欧美大荫蒂xxx| 亚洲视频一区在线播放| 国产亚洲1区2区3区| 免费观看日韩毛片| 欧美大胆a级| 久久久噜噜噜久久中文字免| 国产成人三级在线播放 | 精品久久久久久久一区二区蜜臀| av最新在线观看| 男男成人高潮片免费网站| 日本视频一区在线观看| 中文在线а√天堂| 亚洲人成电影网站色| 亚洲精品午夜国产va久久成人| gogogo免费视频观看亚洲一| 久艹在线免费观看| 久久精品色综合| 69国产精品成人在线播放| 天天插天天干天天操| 亚洲va在线va天堂| 搡老熟女老女人一区二区| 午夜在线精品| 色女孩综合网| 国产精品日本一区二区不卡视频 | 爱福利在线视频| 欧美成人一区二区三区在线观看| 欧美精品一区二区蜜桃| 粉嫩一区二区三区性色av| 日韩免费在线观看av| 爱爱精品视频| 欧美在线xxx| 精品久久久久一区二区三区| 欧美视频在线一区| 国产免费美女视频| 国产成人午夜高潮毛片| 亚洲国产精品成人天堂| 精品一区亚洲| 国产日韩在线亚洲字幕中文| 免费a在线看| 欧美www视频| 少妇一级淫片免费放中国| 中文字幕欧美激情一区| 99视频在线观看视频| 亚洲无线一线二线三线区别av| 欧美一区二区在线免费播放| 老妇女50岁三级| 不卡区在线中文字幕| 已婚少妇美妙人妻系列| 亚州av乱码久久精品蜜桃| 国产精品一区二区三区在线| 日本美女一区| 欧美床上激情在线观看| 视频国产一区二区三区| 欧美日韩在线综合| 美女视频黄免费| 久久亚洲免费视频| 51自拍视频在线观看| 99热这里只有精品8| 五码日韩精品一区二区三区视频| 欧美视频精品全部免费观看| 日本精品视频在线| www久久日com| 亚洲精品一区二区久| 国产女人18毛片18精品| 日韩欧美一区二区三区久久| 91插插插插插插| 久久这里只有精品6| 美女被艹视频网站| 视频在线观看91| 亚洲综合第一| 成人在线免费播放视频| 中文字幕在线播出| 1024亚洲合集| 免费成人深夜夜行p站| 国精产品一区一区三区mba视频 | 一个人看的视频www| 亚洲尤物影院| 91.com在线| 999精品色在线播放| 欧美黄色直播| 波多野结衣欧美| 91久久中文字幕| 激情开心成人网| 久久露脸国产精品| 成人在线app| 色哟哟网站入口亚洲精品| 欧美zozo| 国产偷国产偷亚洲清高网站| 亚洲精品久久久久久久久久久久久久| 欧美在线观看一区二区| 亚洲va在线观看| 亚洲超丰满肉感bbw| 九九热最新地址| 国产精品国产三级国产a| 免费看污片网站| 2022国产精品视频| 欧美xxxxx精品| 丁香婷婷综合色啪| 性色av浪潮av| 国产精品一区2区| 老司机午夜性大片| 青青草97国产精品免费观看 | 免费视频久久| 免费看国产曰批40分钟| 一区在线视频观看| 欧美国产视频一区| 国产真实久久| 日本大胆人体视频| 欧美午夜精品| 精品人妻人人做人人爽| 黄色免费成人| 国产在线播放观看| 一区二区三区四区五区在线| 国产 日韩 欧美在线| 日韩一级大片| 男人添女人下面高潮视频| 中文一区二区| 国产午夜福利在线播放| 麻豆91精品| 欧美日韩怡红院| 天堂久久久久va久久久久| 久久黄色免费看| 麻豆免费看一区二区三区| 成人亚洲免费视频| 国产一区欧美一区| 亚洲美女高潮久久久| 成人国产精品免费| 性欧美成人播放77777| 国产丝袜欧美中文另类| 婷婷丁香综合网| 亚洲欧美日韩综合aⅴ视频| 青青操视频在线播放| 亚洲成人777| av一级在线观看| 欧美日韩久久一区二区| 国产农村妇女毛片精品| 精品国产一区二区三区忘忧草| 四季av日韩精品一区| 亚洲美女av黄| 男人影院在线观看| 欧美日韩国产123| 色在线中文字幕| 国产精品毛片a∨一区二区三区|国| 婷婷久久免费视频| 国产精品一区二区三区在线| 在线日本制服中文欧美| 亚洲制服中文| 亚洲午夜激情在线| 北条麻妃在线一区| 国产精一品亚洲二区在线视频| 人妻 日韩 欧美 综合 制服| 日本一区二区三区四区| 欧美日韩成人免费观看| 欧美性xxxx在线播放| 一二三区中文字幕| 亚洲国产精品成人av| 成年人在线视频| 欧美国产日韩中文字幕在线| 日韩免费电影| 97自拍视频| 欧美欧美黄在线二区| 成人污网站在线观看| 久久亚洲欧洲| 最新版天堂资源在线| 国产精品毛片久久久久久| xxxxxx国产| 欧美一区二区三区电影| 精品福利视频导航大全| 久久久免费高清电视剧观看| 福利精品在线| 蜜桃网站成人| 午夜日韩福利| 在线免费观看视频黄| aaa欧美色吧激情视频| 日本黄色免费片| 色诱视频网站一区| 黑人精品一区二区三区| 精品国偷自产在线视频99| 久久91导航| 国产日韩欧美亚洲一区| 亚洲乱码精品| 男女污污的视频| 不卡的av电影在线观看| 黄色一级片中国| 欧美日韩你懂的| 国产黄在线观看免费观看不卡| 国内精品小视频在线观看| 亚洲成人毛片| 先锋影音亚洲资源| 午夜一级在线看亚洲| 一边摸一边做爽的视频17国产| 亚洲欧美国产三级| 一级片aaaa| 中文一区二区视频| 成人在线视频播放| 欧美日韩精品综合| 久久久精品午夜少妇| www.色多多| 懂色aⅴ精品一区二区三区蜜月| 性一交一乱一透一a级| 欧美成人h版在线观看| 国产亚洲高清一区| 天堂av在线中文| 国产综合色产在线精品| 91传媒免费观看| 欧美精选午夜久久久乱码6080| av影片在线看| 国产精品免费在线免费| 日韩片欧美片| 欧美在线aaa| 一区视频在线播放| 中文字幕网址在线| 中文字幕一区电影| 欧美电影在线观看网站| 亚洲一区二区三区加勒比| 久久爱www久久做| av黄色免费在线观看| 欧美一卡二卡在线| 麻豆福利在线观看| 豆国产97在线| 精品1区2区3区4区| 亚洲成人日韩在线| 91国偷自产一区二区使用方法| 免费福利在线视频| 国产精品美女无圣光视频| 色喇叭免费久久综合| 在线视频日韩欧美| 一区二区三区在线视频播放| 丰满熟妇乱又伦| 97avcom| 九九热线有精品视频99| 99视频在线视频| 伊人一区二区三区| 日本xxxxxwwwww| 日韩美女写真福利在线观看| 不卡中文字幕| 伊人av在线播放| 黑人狂躁日本妞一区二区三区 | 中文字幕免费观看| 日韩在线观看免费高清| 欧美日韩中出| 欧美日韩在线中文| 国产精品久久久久影院亚瑟| 亚洲不卡免费视频| 日韩av免费网站| 久久一区二区中文字幕| av av在线| 欧美色手机在线观看| 欧洲成人综合网| 欧美亚洲精品日韩| 国产精品18久久久久| 天天爱天天做天天爽| 欧美美女操人视频| 国产精品一国产精品| 欧美日韩一区二区区| 色丁香久综合在线久综合在线观看| av超碰免费在线| 色一情一乱一伦一区二区三欧美|