精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

粉色视频免费看| eeuss中文| 91亚洲国产成人精品一区二区三| 亚洲成人一级片| 欧美黑人极品猛少妇色xxxxx| 深夜福利久久| 四虎国产精品免费| 国产视频久久久久| 国产精品xnxxcom| 欧美女人性生活视频| 国产精品美女久久久久久| 一区二区乱子伦在线播放| 国产欧美一区二区三区视频| 成人99免费视频| 男人影院在线观看| www国产精品内射老熟女| 色综合久久99| 国产精品自在线拍| 激情文学亚洲色图| 欧美午夜女人视频在线| 污视频网站在线免费| 日韩一区二区三区不卡视频| 亚洲成人精品视频在线观看| 仙踪林久久久久久久999| 夜夜躁日日躁狠狠久久av| 成人在线视频网址| 一区二区三区丝袜| 国产精品欧美一区二区三区不卡| 99久久精品免费视频| 91爱视频在线| 国产精品亚洲一区二区三区妖精| 日本在线免费播放| 粉色视频免费看| 麻豆成人在线看| 国产精品一区在线| 24小时免费看片在线观看 | 伊人网av在线| 91精品久久久久久综合乱菊| 乱一区二区av| 一区二区www| 国产精品12| 亚洲国产裸拍裸体视频在线观看乱了| 性欧美videoshd高清| 师生出轨h灌满了1v1| 精品三级在线观看| 国产农村妇女精品一区二区| 激情在线视频| 日本在线观看一区二区三区| 亚洲婷婷综合久久一本伊一区| 999精品嫩草久久久久久99| 卡通动漫亚洲综合| 久久久噜噜噜久久中文字免| 日本欧美一区二区三区| 国产又粗又猛又爽| 国产日本在线播放| 伊人青青综合网站| 成人丝袜高跟foot| 国产激情视频在线| 免费在线观看你懂的| 国内精品免费午夜毛片| 久久精品人人做人人爽人人| 国产在线69| 中文视频在线观看| 成人精品视频99在线观看免费| 午夜欧美大尺度福利影院在线看| 久久神马影院| 国产69久久| 先锋资源av在线| 欧美日本亚洲视频| 国产亚洲欧美中文| 亚洲免费福利一区| 亚洲欧美日韩成人在线| 成人啪啪18免费游戏链接| 91精品一区二区| 欧美久久久久免费| 93在线视频精品免费观看| 成人好色电影| 国产又黄又粗的视频| 日韩国产高清一区| 伊人久久精品视频| 国产精品女主播av| 天天精品视频| 黄av在线播放| 午夜免费激情视频| 无码粉嫩虎白一线天在线观看 | 国产女人18水真多18精品一级做| 亚洲丁香日韩| 午夜小视频免费| 国产毛片欧美毛片久久久| 欧美一区二区视频97| 欧美日韩在线观看视频| 老司机精品福利视频| 97超碰国产一区二区三区| 女女互磨互喷水高潮les呻吟| 婷婷久久青草热一区二区 | 国产乱码在线| 国产精品一区二区三区四| a级黄色一级片| 国产乱肥老妇国产一区二| 日韩欧美成人一区| 久久精品人人做人人综合| 国产剧情一区| 免费在线观看黄| 人妻精品一区二区三区| 91视频在线免费| 午夜精品一区二区三区视频免费看| 国产亚洲午夜高清国产拍精品| 999久久久国产999久久久| 亚洲av成人精品一区二区三区| 欧美精品生活片| 亚洲人成影院在线观看| 精品动漫3d一区二区三区免费版| youjizz在线视频| 日韩福利二区| 91黑丝高跟在线| 亚洲精品一区二区在线观看| 亚洲欧洲日产国产综合网| 国产亚洲精品bv在线观看| 欧美日韩成人影院| 亚洲国产精品久久久久爰性色| 黄色污在线观看| 91传媒在线免费观看| 69av一区二区三区| 亚洲欧美偷拍卡通变态| 精品综合免费视频观看| 亚洲精品一二三区区别| 亚洲福利合集| 在线观看爽视频| 成人在线高清视频| 一区二区日韩视频| 国产性生活网站| 醉酒壮男gay强迫野外xx| 毛片毛片毛片毛片毛片毛片毛片毛片毛片| 日韩av大全| 俄罗斯精品一区二区三区| 欧美在线精品免播放器视频| 色噜噜狠狠狠综合曰曰曰| 91精品国产手机| 欧美午夜精品伦理| 一区二区在线电影| 国产亚洲综合性久久久影院| 国产精品1区2区3区在线观看| 亚洲欧洲一区| 国产日韩一区二区三免费高清 | 99国产精品私拍| 91欧美日韩| 久久综合欧美| 黑人久久a级毛片免费观看| 国产成人免费| 视频午夜在线| 亚洲AV无码精品自拍| 在线观看免费视频一区| 日韩精品久久久久久免费| 久久久久无码国产精品不卡| 又嫩又硬又黄又爽的视频| 美国黄色一级毛片| 精品无码人妻少妇久久久久久| 一级在线免费视频| 日韩大片一区二区| 成人免费毛片播放| 亚洲精品乱码久久久久久蜜桃91| 国产激情美女久久久久久吹潮| 91中文精品字幕在线视频| 国产日韩欧美成人| 国产精品小说在线| 国产一区在线播放| 91精品美女在线| 99re在线播放| 国产自产精品| 奇米影视首页 狠狠色丁香婷婷久久综合 | 欧美精品一二三四| 欧美综合一区二区| 51精品秘密在线观看| 日韩久久免费av| 日韩久久午夜影院| 亚洲午夜精品视频| 欧美高清dvd| 91精品国产综合久久福利| 欧美xxx久久| 亚洲男女性事视频| 一区二区三区在线播放欧美| 久久人人爽人人爽爽久久| 精品久久久久av影院| 亚洲黄色在线看| 在线观看日韩视频| 欧美激情网友自拍| 国产成人精品免费久久久久 | 最近2019中文免费高清视频观看www99 | 精品国产一区二区三区忘忧草| 亚洲国产日韩一区| 久久精品亚洲一区| 日本一区二区在线播放| 国产一区二区在线免费| 欧美欧美一区二区| 成人91视频| 亚洲一区二区三区在线观看视频| 国产精品视频网站在线观看| 91色国产在线| 国产精品无码午夜福利| 久久综合加勒比| 国内老熟妇对白hdxxxx| 日韩a在线观看| 天天操天天干天天爱| 成人久久精品人妻一区二区三区| 国产h视频在线观看| 一个人看的www视频在线免费观看| 91精品在线免费视频| 日韩av在线中文字幕| 久久精品一区二区国产| 99re热视频精品| 欧美日韩国产中字| 国产丝袜视频一区| 欧美在线免费观看| 日韩精品大片| 天堂视频免费看| 九九热最新地址| 亚洲第一页视频| 2019中文字幕在线电影免费 | 在线成人av观看| 日韩在线麻豆| 日韩精品视频网站| 成人免费视频在线观看| 日韩欧美国产一区二区三区 | 牛牛精品成人免费视频| 99日韩精品| 欧美韩日一区二区三区| 欧美精品精品一区| 97成人在线视频| 天堂精品视频| 波多野结衣办公室双飞| 日产精品久久久久久久| 国产在线一在线二| 美国十次综合久久| 欧美一级网站| 国产麻豆精品久久一二三| 亚洲第一精品在线| 中文字幕综合在线| 国产伦精品一区二区三区照片91| 男女av免费观看| 澳门黄色一级片| 成年人视频在线观看免费| 亚洲国产视频二区| 日韩电影在线观看电影| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲人成绝费网站色www| 亚洲综合小说区| 在线观看av日韩| 中文字幕亚洲高清| 午夜羞羞小视频在线观看| 成人午夜国产| 久久久久久久综合色一本| 亚洲成年人在线| 风间由美久久久| 女教师高潮黄又色视频| 亚洲一区在线观| 国产精品久久久久久妇女| 亚洲欧美久久| 欧美性感美女h网站在线观看免费| 欧美乱大交xxxxx| 国产日产欧美一区二区| 9999热视频| 天堂8中文在线| 韩国av一区| 亚洲成人精品一区| 97在线观看视频国产| 国产黄视频在线| 波多野结衣在线观看一区| 四虎4545www精品视频| 日本sm残虐另类| 欧美精品vⅰdeose4hd| 成人写真视频福利网| 欧美性猛交xx| 四虎精品在永久在线观看 | 午夜激情在线播放| 老司机午夜精品视频在线观看| 91久久精品日日躁夜夜躁欧美| 国产精品毛片a∨一区二区三区|国 | 日韩欧美综合在线| 国产精品免费一区二区三区观看| 18禁一区二区三区| 久香视频在线观看| 91精品蜜臀一区二区三区在线| 亚洲日本丝袜连裤袜办公室| 欧美精品日韩www.p站| 日本a级片免费观看| 亚洲天堂网视频| 人妖一区二区三区| 国产精品美女久久福利网站| 欧美日本高清一区| 一级黄色特级片| 午夜一区在线观看| 亚洲最新av| 在线这里只有精品| 成人一区二区在线| 日韩一级片大全| 成人av色网站| www欧美成人18+| 久久久久久久国产精品视频| 中文字幕av专区| 蜜桃视频在线入口www| 欧美激情日韩| 不卡的av在线| 色在人av网站天堂精品| 日本黄色的视频| 成年人视频在线看| 老**午夜毛片一区二区三区| 亚洲精品乱码久久久久久金桔影视 | 日韩av女优在线观看| 99精品国产一区二区三区2021| 国产精品麻豆99久久久久久| 国产欧美日韩91| 黄色精品视频在线观看| 青草综合视频| 亚洲欧美在线观看| 91在线观看免费| 色欲人妻综合网| 一区二区网站| 香蕉影视欧美成人| 久久大片网站| 啪啪小视频网站| 97色伦图片97综合影院| 91精品在线一区二区| 四虎4hu永久免费入口| 你懂的网站在线| 久久精品卡一| 日韩专区在线观看| 日韩av在线播放不卡| 日本黄视频在线观看| 久久国产精品久久w女人spa| 在线精品91av| 少妇高潮一69aⅹ| 午夜av不卡| 亚洲人xxxx| 麻豆av一区二区| 精品一区在线视频| 免费一区二区| 日韩视频免费观看高清完整版 | 国严精品久久久久久亚洲影视| 亚洲av中文无码乱人伦在线视色| 欧美精选一区二区三区| 日韩视频中午一区| 日韩肉感妇bbwbbwbbw| 精品丝袜在线| 亚洲综合偷拍欧美一区色| 日韩欧美亚洲日产国| 天天射天天色天天干| 国产在线精品一区二区不卡了 | 欧美网站一区二区| 免费观看国产精品视频| 午夜av在线播放| 国产精品麻豆网站| 日韩欧美亚洲日产国| 噜噜噜在线观看播放视频| 成人高清免费观看| 国产在线一区二| 天天色天天操天天射| 成人中文字幕在线| 国产99视频精品免费视频36| 国产片高清在线观看| 免费在线观看不卡| 国产精品久久久久免费a∨| 亚洲天堂一区在线| 久久三级视频| 日本成熟性欧美| 黄色污污视频软件| 久久精品国产色蜜蜜麻豆| 国产免费观看久久黄| 91九色蝌蚪91por成人| 青椒成人免费视频| 成人妇女淫片aaaa视频| 一级片在线免费观看视频| 久久精品国产77777蜜臀| 91中文在线观看| 色婷婷av一区二区三区之红樱桃| 97超碰欧美中文字幕| 亚洲mv在线看| 91视频欧美| 色播五月激情综合网| 国产性生活一级片| 牛牛精品成人免费视频| 久久精品国产91精品亚洲| 69av.com| 久久成人免费| 亚洲影视九九影院在线观看| 日韩一级在线播放| 日本一区二区三区在线不卡| 五月天激情图片| 3d欧美精品动漫xxxx无尽| 欧美一区二区精品久久911| 一级国产黄色片| 欧美成人亚洲| 日本久久久久久久久| 99在线观看免费| 国产欧美在线观看一区| 日韩视频一二三| 国产69精品久久久久按摩| 欧美成人aa大片| 91精品一区二区三区蜜桃| 老司机免费视频久久| 久久国产手机看片|