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

HTTP 中的 ETag 是如何生成的?

網(wǎng)絡(luò) 網(wǎng)絡(luò)管理
本文阿寶哥將介紹如何利用 ETag 和 If-None-Match 來實現(xiàn)緩存控制。此外,阿寶哥還將介紹 HTTP 中的 ETag 是如何生成的。不過在此之前,我們得先來簡單介紹一下 ETag。

[[401507]]

深入理解瀏覽器的緩存機制 這篇文章詳細(xì)介紹了瀏覽器緩存相關(guān)的內(nèi)容,本文阿寶哥將介紹如何利用 ETag 和 If-None-Match 來實現(xiàn)緩存控制。此外,阿寶哥還將介紹 HTTP 中的 ETag 是如何生成的。不過在此之前,我們得先來簡單介紹一下 ETag。

一、ETag 簡介

1.1 ETag 是什么

ETag(Entity Tag)是萬維網(wǎng)協(xié)議 HTTP 的一部分。它是 HTTP 協(xié)議提供的若干機制中的一種 Web 緩存驗證機制,并且允許客戶端進(jìn)行緩存協(xié)商。這使得緩存變得更加高效,而且節(jié)省帶寬。如果資源的內(nèi)容沒有發(fā)生改變,Web 服務(wù)器就不需要發(fā)送一個完整的響應(yīng)。

1.2 ETag 的作用

ETag 是一個不透明的標(biāo)識符,由 Web 服務(wù)器根據(jù) URL 上的資源的特定版本而指定。如果 URL 上的資源內(nèi)容改變,一個新的不一樣的 ETag 就會被生成。ETag 可以看成是資源的指紋,它們能夠被快速地比較,以確定兩個版本的資源是否相同。

需要注意的是 ETag 的比較只對同一個 URL 有意義 —— 不同 URL 上資源的 ETag 值可能相同也可能不同。

1.3 ETag 的語法

  1. ETag: W/"<etag_value>" 
  2. ETag: "<etag_value>" 

W/(可選):'W/'(大小寫敏感) 表示使用弱驗證器。弱驗證器很容易生成,但不利于比較。強驗證器是比較的理想選擇,但很難有效地生成。相同資源的兩個弱 Etag 值可能語義等同,但不是每個字節(jié)都相同。

"<etag_value>":實體標(biāo)簽唯一地表示所請求的資源。它們是位于雙引號之間的 ASCII 字符串(如 “2c-1799c10ab70” )。沒有明確指定生成 ETag 值的方法。通常是使用內(nèi)容的散列、最后修改時間戳的哈希值或簡單地使用版本號。比如,MDN 使用 wiki 內(nèi)容的十六進(jìn)制數(shù)字的哈希值。

1.4 ETag 的使用

在大多數(shù)場景下,當(dāng)一個 URL 被請求,Web 服務(wù)器會返回資源和其相應(yīng)的 ETag 值,它會被放置在 HTTP 響應(yīng)頭的 ETag 字段中:

  1. HTTP/1.1 200 OK 
  2. Content-Length: 44 
  3. Cache-Control: max-age=10 
  4. Content-Type: application/javascript; charset=utf-8 
  5. ETag: W/"2c-1799c10ab70" 

然后,客戶端可以決定是否緩存這個資源和它的 ETag。以后,如果客戶端想再次請求相同的 URL,將會發(fā)送一個包含已保存的 ETag 和 If-None-Match 字段的請求。

  1. GET /index.js HTTP/1.1 
  2. Host: localhost:3000 
  3. Connection: keep-alive 
  4. If-None-Match: W/"2c-1799c10ab70" 

客戶端請求之后,服務(wù)器可能會比較客戶端的 ETag 和當(dāng)前版本資源的 ETag。如果 ETag 值匹配,這就意味著資源沒有改變,服務(wù)器便會發(fā)送回一個極短的響應(yīng),包含 HTTP “304 未修改” 的狀態(tài)。304 狀態(tài)碼告訴客戶端,它的緩存版本是最新的,可以直接使用它。

  1. HTTP/1.1 304 Not Modified 
  2. Cache-Control: max-age=10 
  3. ETag: W/"2c-1799c10ab70" 
  4. Connection: keep-alive 

二、ETag 實戰(zhàn)

2.1 創(chuàng)建 Koa 服務(wù)器

了解完 ETag 相關(guān)知識后,阿寶哥將基于 koa、koa-conditional-get、koa-etag 和 koa-static 這些庫來介紹一下,在實際項目中如何利用 ETag 響應(yīng)頭和 If-None-Match請求頭實現(xiàn)資源的緩存控制。

  1. // server.js 
  2. const Koa = require("koa"); 
  3. const path = require("path"); 
  4. const serve = require("koa-static"); 
  5. const etag = require("koa-etag"); 
  6. const conditional = require("koa-conditional-get"); 
  7.  
  8. const app = new Koa(); 
  9.  
  10. app.use(conditional()); // 使用條件請求中間件 
  11. app.use(etag()); // 使用etag中間件 
  12. app.use( // 使用靜態(tài)資源中間件 
  13.   serve(path.join(__dirname, "/public"), { 
  14.     maxage: 10 * 1000, // 設(shè)置緩存存儲的最大周期,單位為秒 
  15.   }) 
  16. ); 
  17.  
  18. app.listen(3000, () => { 
  19.   console.log("app starting at port 3000"); 
  20. }); 

在以上代碼中,我們使用了 koa-static 中間件來處理靜態(tài)資源,這些資源被保存在 public 目錄下。在該目錄下,阿寶哥創(chuàng)建了 index.html 和 index.js 兩個資源文件,文件中的內(nèi)容分別如下所示:

2.1.1 public/index.html

  1. <!DOCTYPE html> 
  2. <html lang="zh-cn"
  3. <head> 
  4.     <meta charset="UTF-8"
  5.     <meta http-equiv="X-UA-Compatible" content="IE=edge"
  6.     <meta name="viewport" content="width=device-width, initial-scale=1.0"
  7.     <title>ETag 使用示例</title> 
  8.     <script src="/index.js"></script> 
  9. </head> 
  10. <body> 
  11.     <h3>ETag 使用示例</h3> 
  12. </body> 
  13. </html> 

 2.1.2 public/index.js

  1. console.log("大家好,我是阿寶哥"); 

在啟動完服務(wù)器之后,我們打開 Chrome 開發(fā)者工具并切換到 Network 標(biāo)簽欄,然后在瀏覽器地址欄輸入 http://localhost:3000/ 地址,接著多次訪問該地址(地址欄多次回車)。下圖是阿寶哥多次訪問的結(jié)果:

2.2 ETag 和 If-None-Match

下面阿寶哥將以 index.js 為例,來分析上圖中與之對應(yīng)的 HTTP 報文。對于 index.html 文件,感興趣的小伙伴可以自行分析一下。接下來我們先來分析首次請求 index.js 文件的報文:

2.2.1 首次請求 — 請求報文

  1. GET /index.js HTTP/1.1 
  2. Host: localhost:3000 
  3. Connection: keep-alive 
  4. Pragma: no-cache 
  5. Cache-Control: no-cache 
  6. ... 

2.2.2 首次請求 — 響應(yīng)報文

  1. HTTP/1.1 200 OK 
  2. Content-Length: 44 
  3. Cache-Control: max-age=10 
  4. ETag: W/"2c-1799c10ab70" 
  5. ... 

在使用了 koa-static 和 koa-etag 中間件之后,index.js 文件首次請求的響應(yīng)報文中會包含 Cache-Control 和 ETag 的字段信息。

  • Cache-Control 描述的是一個相對時間,在進(jìn)行緩存命中的時候,都是利用客戶端時間進(jìn)行判斷,所以相比較 Expires,Cache-Control 的緩存管理更有效,安全一些。

2.2.3 10s內(nèi) — 請求報文

  1. GET /index.js HTTP/1.1 
  2. Host: localhost:3000 
  3. Connection: keep-alive 
  4. Pragma: no-cache 
  5. Cache-Control: no-cache 
  6. ... 

2.2.4 10s內(nèi) — 響應(yīng)信息(General)

  1. Request URL: http://localhost:3000/index.js 
  2. Request Method: GET 
  3. Status Code: 200 OK (from memory cache) 
  4. Remote Address: [::1]:3000 
  5. Referrer Policy: strict-origin-when-cross-origin 

2.2.5 10s內(nèi) — 響應(yīng)信息(Response Headers)

  1. Cache-Control: max-age=10 
  2. Connection: keep-alive 
  3. Content-Length: 44 
  4. ETag: W/"2c-1799c10ab70" 

由于我們設(shè)置了 index.js 資源文件的最大緩存時間為 10s,所以在 10s 內(nèi)瀏覽器會直接從緩存中讀取文件的內(nèi)容。需要注意的是,此時的狀態(tài)碼為:Status Code: 200 OK (from memory cache)。

2.2.6 10s后 — 請求報文

  1. GET /index.js HTTP/1.1 
  2. Host: localhost:3000 
  3. Connection: keep-alive 
  4. If-None-Match: W/"2c-1799c10ab70" 
  5. Referer: http://localhost:3000/ 
  6. ... 

因為 10s 之后,緩存已經(jīng)過期了,而且在 index.js 文件首次請求的響應(yīng)報文中也返回了 ETag 字段。所以此時瀏覽器會發(fā)起 If-None-Match 條件請求。這類請求可以用來驗證緩存的有效性,省去不必要的控制手段。

2.2.7 10s后 — 響應(yīng)報文

  1. HTTP/1.1 304 Not Modified 
  2. Cache-Control: max-age=10 
  3. ETag: W/"2c-1799c10ab70" 
  4. Connection: keep-alive 
  5. ... 

因為文件的內(nèi)容未發(fā)生改變,所以 10s 后的響應(yīng)報文的狀態(tài)碼為 304 Not Modified。此外,響應(yīng)報文中也返回了 ETag 字段??吹竭@里,有一些小伙伴可能會有疑惑 —— ETag 到底是如何生成的?接下來,阿寶哥將帶大家一起來揭開 koa-etag 中間件背后的秘密。

三、如何生成 ETag

在前面的示例中,我們使用了 koa-etag 中間件來實現(xiàn)資源的緩存控制。其實該中間件的實現(xiàn)并不復(fù)雜,具體如下所示:

  1. // https://github.com/koajs/etag/blob/master/index.js 
  2. const calculate = require('etag'); 
  3. // 省略部分代碼 
  4.  
  5. module.exports = function etag (options) { 
  6.   return async function etag (ctx, next) { 
  7.     await next() 
  8.     const entity = await getResponseEntity(ctx) 
  9.     setEtag(ctx, entity, options) 
  10.   } 

由以上代碼可知,在 koa-etag 中間件內(nèi)部會先通過 getResponseEntity 函數(shù)來獲取響應(yīng)實體對象,然后再調(diào)用 setETag 函數(shù)來生成 ETag。而 setETag 函數(shù)的實現(xiàn)很簡單,在 setETag 函數(shù)內(nèi)部,會通過 etag 這個第三方庫來生成 ETag。

  1. // https://github.com/koajs/etag/blob/master/index.js 
  2. function setEtag (ctx, entity, options) { 
  3.   if (!entity) return 
  4.   ctx.response.etag = calculate(entity, options) 

etag 這個庫對外提供了一個 etag 函數(shù)來創(chuàng)建 ETag,該函數(shù)的簽名如下:

  1. etag(entity, [options]) 

entity:用于生成 ETag 的實體,類型支持 Strings,Buffers 和 fs.Stats。除了 fs.Stats 對象之外,默認(rèn)將生成 strong ETag。

options:配置對象,支持通過 options.weak 屬性來配置生成 weak ETag。

了解完 etag 函數(shù)的參數(shù)之后,我們來看一下該函數(shù)的具體實現(xiàn):

  1. function etag (entity, options) { 
  2.   if (entity == null) { 
  3.     throw new TypeError('argument entity is required'
  4.   } 
  5.  
  6.   // 支持fs.Stats對象 
  7.   // isstats 函數(shù)的判斷規(guī)則:當(dāng)前對象是否包含ctime、mtime、ino和size這些屬性 
  8.   var isStats = isstats(entity) 
  9.   var weak = options && typeof options.weak === 'boolean' 
  10.     ? options.weak 
  11.     : isStats 
  12.  
  13.   // 參數(shù)校驗 
  14.   if (!isStats && typeof entity !== 'string' && !Buffer.isBuffer(entity)) { 
  15.     throw new TypeError('argument entity must be string, Buffer, or fs.Stats'
  16.   } 
  17.  
  18.   // 生成ETag標(biāo)簽 
  19.   var tag = isStats 
  20.     ? stattag(entity) // 處理fs.Stats對象 
  21.     : entitytag(entity) 
  22.  
  23.   return weak 
  24.     ? 'W/' + tag 
  25.     : tag 

在 etag 函數(shù)內(nèi)部會根據(jù) entity 的類型,執(zhí)行不同的生成邏輯。如果 entity 是 fs.Stats 對象,則會調(diào)用 stattag 函數(shù)來創(chuàng)建 ETag。

  1. function stattag (stat) { 
  2.   // mtime:Modified Time,是在寫入文件時隨文件內(nèi)容的更改而更改,是指文件內(nèi)容最后一次被修改的時間。 
  3.   var mtime = stat.mtime.getTime().toString(16) 
  4.   var size = stat.size.toString(16) 
  5.  
  6.   return '"' + size + '-' + mtime + '"' 

而如果 entity 參數(shù)非 fs.Stats 對象,則會調(diào)用 entitytag 函數(shù)來生成 ETag。其中 entitytag 函數(shù)的具體實現(xiàn)如下:

  1. function entitytag (entity) { 
  2.   if (entity.length === 0) { 
  3.     return '"0-2jmj7l5rSw0yVb/vlWAYkK/YBwk"' 
  4.   } 
  5.  
  6.   // 計算實體對象的哈希值 
  7.   var hash = crypto 
  8.     .createHash('sha1'
  9.     .update(entity, 'utf8'
  10.     .digest('base64'
  11.     .substring(0, 27) 
  12.  
  13.   // 計算實體對象的長度 
  14.   var len = typeof entity === 'string' 
  15.     ? Buffer.byteLength(entity, 'utf8'
  16.     : entity.length 
  17.  
  18.   return '"' + len.toString(16) + '-' + hash + '"' 

對于非 fs.Stats 對象來說,在 entitytag 函數(shù)內(nèi)部會使用 sha1 消息摘要算法來生成 hash 值并以 base64 格式輸出,而實際的生成的 hash 值會取前 27 個字符。此外,由以上代碼可知,最終的 ETag 將由實體的長度和哈希值兩部分組成。

需要注意的是,生成 ETag 的算法并不是固定的, 通常是使用內(nèi)容的散列、最后修改時間戳的哈希值或簡單地使用版本號。

四、ETag vs Last-Modified

其實除了 ETag 字段之外,大多數(shù)情況下,響應(yīng)頭中還會包含 Last-Modified 字段。它們之間的區(qū)別如下:

精確度上,Etag 要優(yōu)于 Last-Modified。Last-Modified 的時間單位是秒,如果某個文件在 1 秒內(nèi)被改變多次,那么它們的 Last-Modified 并沒有體現(xiàn)出來修改,但是 Etag 每次都會改變,從而確保了精度;此外,如果是負(fù)載均衡的服務(wù)器,各個服務(wù)器生成的 Last-Modified 也有可能不一致。

性能上,Etag 要遜于 Last-Modified,畢竟 Last-Modified 只需要記錄時間,而 ETag 需要服務(wù)器通過消息摘要算法來計算出一個hash 值。

優(yōu)先級上,在資源新鮮度校驗時,服務(wù)器會優(yōu)先考慮 Etag。即如果條件請求的請求頭同時攜帶 If-Modified-Since 和 If-None-Match 字段,則會優(yōu)先判斷資源的 ETag 值是否發(fā)生變化。

五、總結(jié)

本文阿寶哥首先介紹了 ETag 的相關(guān)基礎(chǔ)知識,然后以 Koa 為例詳細(xì)介紹了 ETag 和 If-None-Match 是如何實現(xiàn)緩存控制的。此外,阿寶哥還分析了 koa-etag 中間件內(nèi)部依賴的 etag 第三方庫是如何為指定的實體生成 ETag 對象。最后,阿寶哥列舉了 ETag 與 Last-Modified 之間的主要區(qū)別。

如果你還想進(jìn)一步了解瀏覽器的緩存機制,你可以閱讀 深入理解瀏覽器的緩存機制 這篇文章。在后續(xù)的文章中,阿寶哥將介紹如何實現(xiàn)資源的新鮮度檢測,感興趣的小伙伴不要錯過喲。

 

責(zé)任編輯:姜華 來源: 全棧修仙之路
相關(guān)推薦

2021-07-23 15:55:31

HTTPETag前端

2023-03-06 07:25:09

http響應(yīng)頭ETag

2021-07-27 14:50:15

axiosHTTP前端

2019-12-13 09:14:35

HTTP2協(xié)議

2019-04-08 15:11:12

HTTP協(xié)議Web

2019-07-02 08:24:07

HTTPHTTPSTCP

2018-03-05 19:20:49

LinuxWordPressHTTP

2010-05-07 12:20:38

負(fù)載均衡etag

2023-09-19 22:41:30

控制器HTTP

2022-09-16 00:11:45

PyTorch神經(jīng)網(wǎng)絡(luò)存儲

2017-11-17 09:13:31

Java注解

2021-01-18 05:13:04

TomcatHttp

2024-09-30 08:43:33

HttpgolangTimeout

2020-03-17 23:08:32

數(shù)據(jù)Elasticsear存儲

2022-05-18 08:00:00

JavaScriptFetch數(shù)據(jù)

2022-04-14 09:01:39

React源碼Flow

2011-11-03 16:32:57

Dart

2024-12-16 17:02:58

MySQLInnoDB數(shù)據(jù)庫

2012-08-27 09:10:05

JVMJava

2009-08-04 13:31:35

C#自定義事件
點贊
收藏

51CTO技術(shù)棧公眾號

久久久久网址| 97免费中文视频在线观看| 中文字幕免费高清在线| 欧美jizz18性欧美| 国产乱码精品一品二品| 国模精品视频一区二区| www在线观看免费视频| 国产成人精品一区二区三区视频| 亚洲欧美电影院| 久久久亚洲综合网站| 国产一区二区波多野结衣| 红桃视频国产一区| 亚洲一级片在线看| 中文字幕人妻无码系列第三区| 手机在线观看av网站| 国产精品夫妻自拍| 另类视频在线观看+1080p| 国产女人爽到高潮a毛片| 性色av一区二区怡红| 北条麻妃久久精品| 成人乱码一区二区三区av| 777午夜精品电影免费看| 亚洲午夜三级在线| 免费看啪啪网站| 免费看男男www网站入口在线| 国产大片一区二区| 国产精品亚洲激情| 日韩av一二三区| 午夜性色一区二区三区免费视频| 中文日韩电影网站| 素人fc2av清纯18岁| 国产精品网站在线看| 欧美丰满一区二区免费视频 | 国产一区白浆| 九色精品美女在线| 中文字幕无码日韩专区免费 | 亚洲免费小视频| 欧美xxxx日本和非洲| 91嫩草国产线观看亚洲一区二区| 在线观看欧美黄色| 免费在线观看毛片网站| 国产不卡人人| 黄网站色欧美视频| 99热亚洲精品| 1区2区3区在线| 亚洲一区二区三区国产| 公共露出暴露狂另类av| 免费看美女视频在线网站| 亚洲国产高清在线观看视频| 欧美一级片免费观看| 四虎在线免费观看| 久久综合国产精品| 久久青青草原一区二区| 亚洲人妻一区二区三区| 99视频精品全部免费在线| 国产私拍一区| 亚洲人在线观看视频| 久久一二三国产| 麻豆蜜桃91| 韩国三级在线观看久| 国产亚洲精品超碰| 亚洲成人a**址| 天天综合视频在线观看| 《视频一区视频二区| 一区二区三区不卡在线| 成人在线视频亚洲| 亚洲影院在线观看| 亚洲美免无码中文字幕在线| 黄色软件视频在线观看| 欧美性猛交xxxx黑人猛交| 欧美精品第三页| 久久69成人| 日韩一区二区高清| 亚洲精品第二页| 亚洲成aⅴ人片久久青草影院| 亚洲精品少妇网址| 亚欧精品视频一区二区三区| 午夜影院欧美| 欧美激情一二三| 亚洲免费在线视频观看| 欧美a级一区二区| 96国产粉嫩美女| 亚洲aⅴ在线观看| 国产精品午夜电影| 欧美日韩中文字幕在线播放 | 天天综合网91| 欧美激情图片区| 日韩精品一区二区亚洲av| 蜜臀av一区二区在线免费观看| 91影视免费在线观看| 手机看片1024国产| 国产欧美一区二区在线观看| 国产对白在线播放| 日韩精品极品| 日韩一级大片在线| 粉嫩av蜜桃av蜜臀av| 外国成人免费视频| 欧洲一区二区视频| 国产乱人乱偷精品视频| av一本久道久久综合久久鬼色| 亚洲成人自拍视频| 91精品国产黑色瑜伽裤| 欧美日韩一区二区电影| 中文字幕99页| 91亚洲国产高清| 欧美亚洲在线观看| www.久久伊人| 国产精品天美传媒| 91成人在线观看喷潮教学| 日日夜夜亚洲精品| 亚洲欧美成人一区二区在线电影| 中日韩一级黄色片| 麻豆九一精品爱看视频在线观看免费| 91久久国产精品91久久性色| 丝袜+亚洲+另类+欧美+变态| 亚洲欧美另类在线| 香港日本韩国三级网站| 精品国产乱子伦一区二区| 日韩在线播放av| 69xxxx国产| 99麻豆久久久国产精品免费| 欧美h视频在线观看| 欧美日韩五码| 亚洲精品视频在线播放| 国产无码精品一区二区| 精品一区二区免费看| 欧美日韩一区二区视频在线| 98色花堂精品视频在线观看 | 欧美另类自拍| 天天色综合成人网| av漫画在线观看| 你懂的国产精品| 成人性教育视频在线观看| 大地资源中文在线观看免费版| 午夜视频一区在线观看| 蜜臀aⅴ国产精品久久久国产老师| 97精品视频在线看| 国产狼人综合免费视频| 国产视频精品久久| 欧美视频国产精品| 免费看黄色aaaaaa 片| 伊人久久久大香线蕉综合直播 | 亚洲精品一二三| 欧美精品久久久久久久久25p| 国产欧美一区| 国产精品久久99久久| 国产亚洲依依| 在线观看日韩一区| 久久精品在线观看视频| 人人精品人人爱| 亚洲一区二区三区在线观看视频| 青青热久免费精品视频在线18| 国产亚洲精品久久久久久| 男人天堂视频在线| 中文字幕免费不卡在线| www亚洲成人| 偷偷www综合久久久久久久| 成人高清视频观看www| 久草免费在线| 日韩欧美的一区| 精品一级少妇久久久久久久| 成人久久久精品乱码一区二区三区 | 午夜一区在线观看| 狠狠色噜噜狠狠狠狠97| 黄色性生活一级片| 日韩中文字幕1| 正在播放91九色| 亚洲乱码一区| 日本亚洲欧洲色| jyzzz在线观看视频| 欧美精品免费视频| 久久久久久久福利| 91蜜桃婷婷狠狠久久综合9色| 日本黄色三级大片| 日本一区二区免费高清| 91天堂在线观看| 波多野结衣久久| 在线观看国产成人av片| av网站在线免费看| 精品久久久免费| 波兰性xxxxx极品hd| 丰满少妇久久久久久久| 丁香啪啪综合成人亚洲| 天天av综合| 精品国产免费久久久久久尖叫 | 99国产一区| 日韩精品无码一区二区三区| 高清一区二区三区av| 97激碰免费视频| 免费黄色在线| 亚洲黄页视频免费观看| 在线视频你懂得| 午夜婷婷国产麻豆精品| 精品欧美aⅴ在线网站| 懂色av粉嫩av浪潮av| 成人免费高清在线观看| 性猛交ⅹ×××乱大交| 激情丁香综合| 在线看成人av电影| 欧美大奶一区二区| 国产在线观看不卡| 密臀av在线播放| 精品中文字幕乱| 99免在线观看免费视频高清| 精品国产精品网麻豆系列 | 成人欧美大片| 欧美国产中文字幕| 91社区在线| 日韩av在线精品| 精品久久国产视频| 欧美性视频一区二区三区| 国产小视频在线观看免费| 中文字幕精品三区| 日本黄色网址大全| 国产精品1024| 在线观看免费不卡av| 国产毛片一区| 无码人妻少妇伦在线电影| 香蕉视频国产精品| 欧美成人一区二区在线| 成人自拍在线| 亚洲一区二区三区毛片| 欧美成人免费全部网站| 欧美一区二三区| 久久香蕉av| 欧美日韩国产二区| 黄色的网站在线观看| 中文字幕日韩专区| 国产鲁鲁视频在线观看免费| 日韩成人av网| 免费成人在线看| 日韩精品专区在线影院重磅| 国产一区二区在线播放视频| 欧美在线观看18| 无码人妻精品一区二区三区蜜桃91 | 大j8黑人w巨大888a片| 欧美日韩1区| 欧洲精品视频在线| 欧美在线网址| 成人在线观看毛片| 欧美在线精品一区| 成人短视频在线观看免费| 一个色综合网| 欧美日韩午夜爽爽| 黑人一区二区| 国产黄色激情视频| 激情国产一区| 久久精品视频16| 亚洲经典三级| 国内自拍在线观看| 久久久精品网| 日本美女高潮视频| 奇米四色…亚洲| 日本黄色福利视频| 精品亚洲porn| 日韩av福利在线观看| 成人一级片在线观看| 亚洲精品激情视频| 91丝袜国产在线播放| 女女互磨互喷水高潮les呻吟| 国产欧美日韩三级| www.99re6| 亚洲最新视频在线播放| 日韩成人免费在线视频| 日韩欧美在线视频| 国产99免费视频| 欧美一区日本一区韩国一区| 午夜精品小视频| 国产视频丨精品|在线观看| 国产尤物视频在线| 久久亚洲国产成人| 欧美韩日亚洲| 国产97在线|亚洲| 国产精品一区二区精品视频观看| 性做久久久久久久免费看| 一区二区亚洲精品国产| 成年网站在线| 久久精品视频免费播放| 色呦呦久久久| 欧美在线欧美在线| 91成人在线| 91免费看蜜桃| 妖精视频一区二区三区| 一本一道久久久a久久久精品91 | 国产成人精品免费一区二区| 中文字幕在线视频播放| 国产日韩亚洲欧美综合| 天天天天天天天天操| 亚洲成精国产精品女| 精品一区二三区| 精品少妇一区二区三区| 麻豆影视在线| 九九热精品在线| 偷拍中文亚洲欧美动漫| 97人人干人人| 日韩影院二区| 久色视频在线播放| 激情久久五月天| 久久久久国产精品区片区无码| 国产精品青草久久| 豆国产97在线 | 亚洲| 欧美亚洲愉拍一区二区| 男人的天堂a在线| 日韩中文有码在线视频| 草草在线视频| 97人人模人人爽人人少妇| 波多野结衣的一区二区三区| 日本精品久久久久久久久久| 蜜桃av一区二区| 爱爱的免费视频| 亚洲一区二区三区视频在线| 一区二区三区www污污污网站| 亚洲精品成人久久电影| 91网在线看| 国产免费一区二区三区香蕉精| 人体久久天天| 国产91在线亚洲| 激情综合一区二区三区| 日本二区在线观看| 婷婷丁香久久五月婷婷| 精品人妻无码一区二区| www.久久撸.com| 四虎成人在线| 农村寡妇一区二区三区| 亚洲国产高清一区二区三区| 亚洲综合123| 中文字幕一区二区三区不卡 | 久久久国产精品无码| 亚洲影院久久精品| 精品国自产在线观看| 日韩小视频网址| 国产成+人+综合+亚洲欧美| 日韩精品一线二线三线| 久久激情综合| 91网站免费视频| 日韩欧亚中文在线| 无码国产精品一区二区色情男同| 久久久久久久一| 第一区第二区在线| 欧美不卡在线播放| 成人免费观看av| 国产又色又爽又黄的| 精品中文视频在线| 深夜成人影院| 日韩一区不卡| 免费看黄色91| 午夜激情福利电影| 91精品蜜臀在线一区尤物| 顶级网黄在线播放| 超碰97在线资源| 亚洲美女色禁图| 国产男男chinese网站| 一本色道久久加勒比精品| 天堂成人在线| 国产成人黄色av| 日韩免费在线| 被黑人猛躁10次高潮视频| 亚洲精品美腿丝袜| 国产综合在线播放| 1769国内精品视频在线播放| 中文字幕亚洲影视| 91国产精品视频在线观看| 国产精品久线在线观看| av片免费播放| 久久噜噜噜精品国产亚洲综合| 欧美sss在线视频| 国产精品天天av精麻传媒| 国产精品久久午夜| 午夜精品久久久久久久99热黄桃 | 欧美一区二区激情| 久久综合色综合88| 久久精品国产亚洲av麻豆蜜芽| 日韩有码片在线观看| youjizz亚洲| 成人免费视频久久| 亚洲激情中文1区| 无码国产精品96久久久久| 国产精品久久久久久久久借妻| 亚洲天堂一区二区三区四区| 久久久男人的天堂| 日本韩国欧美一区| xvideos国产在线视频| 精品国产二区在线| 久久99精品久久久久久国产越南| www.av视频在线观看| 亚洲色图第一页| 欧洲精品99毛片免费高清观看| 啊啊啊一区二区| 亚洲少妇最新在线视频| 亚洲欧美色视频| 91在线|亚洲| 日韩电影在线观看网站| 中文字幕av播放| 亚洲欧美中文日韩在线v日本| 97久久精品一区二区三区的观看方式| 亚洲精品无码国产| 国产精品色婷婷久久58| 日韩在线视频第一页| 成人免费福利在线| 欧美一级久久|