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

HTTP 中的 ETag 是如何生成的?

開(kāi)發(fā) 前端
本文將介紹如何利用 ETag 和 If-None-Match 來(lái)實(shí)現(xiàn)緩存控制。此外,還將介紹 HTTP 中的 ETag 是如何生成的。不過(guò)在此之前,我們得先來(lái)簡(jiǎn)單介紹一下 ETag。

 [[412708]]

本文將介紹如何利用 ETag 和 If-None-Match 來(lái)實(shí)現(xiàn)緩存控制。此外,還將介紹 HTTP 中的 ETag 是如何生成的。不過(guò)在此之前,我們得先來(lái)簡(jiǎn)單介紹一下 ETag。

一、ETag 簡(jiǎn)介

1.1 ETag 是什么

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

1.2 ETag 的作用

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

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

1.3 ETag 的語(yǔ)法 

  1. ETag: W/"<etag_value> 
  2. ETag: "<etag_value>
  •  W/(可選):'W/'(大小寫敏感) 表示使用弱驗(yàn)證器。弱驗(yàn)證器很容易生成,但不利于比較。強(qiáng)驗(yàn)證器是比較的理想選擇,但很難有效地生成。相同資源的兩個(gè)弱 Etag 值可能語(yǔ)義等同,但不是每個(gè)字節(jié)都相同。
  •  "<etag_value>":實(shí)體標(biāo)簽唯一地表示所請(qǐng)求的資源。它們是位于雙引號(hào)之間的 ASCII 字符串(如 “2c-1799c10ab70” )。沒(méi)有明確指定生成 ETag 值的方法。通常是使用內(nèi)容的散列、最后修改時(shí)間戳的哈希值或簡(jiǎn)單地使用版本號(hào)。比如,MDN 使用 wiki 內(nèi)容的十六進(jìn)制數(shù)字的哈希值。

1.4 ETag 的使用

在大多數(shù)場(chǎng)景下,當(dāng)一個(gè) URL 被請(qǐng)求,Web 服務(wù)器會(huì)返回資源和其相應(yīng)的 ETag 值,它會(huì)被放置在 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" 

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

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

客戶端請(qǐng)求之后,服務(wù)器可能會(huì)比較客戶端的 ETag 和當(dāng)前版本資源的 ETag。如果 ETag 值匹配,這就意味著資源沒(méi)有改變,服務(wù)器便會(huì)發(fā)送回一個(gè)極短的響應(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 實(shí)戰(zhàn)

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

了解完 ETag 相關(guān)知識(shí)后,將基于 koa、koa-conditional-get、koa-etag 和 koa-static 這些庫(kù)來(lái)介紹一下,在實(shí)際項(xiàng)目中如何利用 ETag 響應(yīng)頭和 If-None-Match 請(qǐng)求頭實(shí)現(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. const app = new Koa();  
  8. app.use(conditional()); // 使用條件請(qǐng)求中間件  
  9. app.use(etag()); // 使用etag中間件  
  10. app.use( // 使用靜態(tài)資源中間件  
  11.   serve(path.join(__dirname, "/public"), {  
  12.     maxage: 10 * 1000, // 設(shè)置緩存存儲(chǔ)的最大周期,單位為秒  
  13.   })  
  14. );  
  15. app.listen(3000, () => {  
  16.   console.log("app starting at port 3000");  
  17. }); 

在以上代碼中,我們使用了 koa-static 中間件來(lái)處理靜態(tài)資源,這些資源被保存在 public 目錄下。在該目錄下,創(chuàng)建了 index.html 和 index.js 兩個(gè)資源文件,文件中的內(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

console.log("大家好,");

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

2.2 ETag 和 If-None-Match

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

2.2.1 首次請(qǐng)求 — 請(qǐng)求報(bào)文 

  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 首次請(qǐng)求 — 響應(yīng)報(bào)文 

  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 文件首次請(qǐng)求的響應(yīng)報(bào)文中會(huì)包含 Cache-Control 和 ETag 的字段信息。

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

2.2.3 10s內(nèi) — 請(qǐng)求報(bào)文 

  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" 

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

2.2.6 10s后 — 請(qǐng)求報(bào)文 

  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. ... 

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

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

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

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

三、如何生成 ETag

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

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

由以上代碼可知,在 koa-etag 中間件內(nèi)部會(huì)先通過(guò) getResponseEntity 函數(shù)來(lái)獲取響應(yīng)實(shí)體對(duì)象,然后再調(diào)用 setETag 函數(shù)來(lái)生成 ETag。而 setETag 函數(shù)的實(shí)現(xiàn)很簡(jiǎn)單,在 setETag 函數(shù)內(nèi)部,會(huì)通過(guò) etag 這個(gè)第三方庫(kù)來(lái)生成 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 這個(gè)庫(kù)對(duì)外提供了一個(gè) etag 函數(shù)來(lái)創(chuàng)建 ETag,該函數(shù)的簽名如下: 

  1. etag(entity, [options]) 
  •  entity:用于生成 ETag 的實(shí)體,類型支持 Strings,Buffers 和 fs.Stats。除了 fs.Stats 對(duì)象之外,默認(rèn)將生成 strong ETag。
  •  options:配置對(duì)象,支持通過(guò) options.weak 屬性來(lái)配置生成 weak ETag。

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

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

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

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

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

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

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

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

四、ETag vs Last-Modified

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

  •  精確度上,Etag 要優(yōu)于 Last-Modified。Last-Modified 的時(shí)間單位是秒,如果某個(gè)文件在 1 秒內(nèi)被改變多次,那么它們的 Last-Modified 并沒(méi)有體現(xiàn)出來(lái)修改,但是 Etag 每次都會(huì)改變,從而確保了精度;此外,如果是負(fù)載均衡的服務(wù)器,各個(gè)服務(wù)器生成的 Last-Modified 也有可能不一致。
  •  性能上,Etag 要遜于 Last-Modified,畢竟 Last-Modified 只需要記錄時(shí)間,而 ETag 需要服務(wù)器通過(guò)消息摘要算法來(lái)計(jì)算出一個(gè)hash 值。
  •  優(yōu)先級(jí)上,在資源新鮮度校驗(yàn)時(shí),服務(wù)器會(huì)優(yōu)先考慮 Etag。即如果條件請(qǐng)求的請(qǐng)求頭同時(shí)攜帶 If-Modified-Since 和 If-None-Match 字段,則會(huì)優(yōu)先判斷資源的 ETag 值是否發(fā)生變化。

五、總結(jié)

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

 

責(zé)任編輯:龐桂玉 來(lái)源: 前端大全
相關(guān)推薦

2021-05-26 05:18:51

HTTP ETag Entity Tag

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ò)存儲(chǔ)

2017-11-17 09:13:31

Java注解

2024-09-30 08:43:33

HttpgolangTimeout

2021-01-18 05:13:04

TomcatHttp

2020-03-17 23:08:32

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

2022-05-18 08:00:00

JavaScriptFetch數(shù)據(jù)

2011-11-03 16:32:57

Dart

2022-04-14 09:01:39

React源碼Flow

2009-08-04 13:31:35

C#自定義事件

2021-08-06 09:21:26

Linux內(nèi)核 Coredump

2012-08-27 09:10:05

JVMJava
點(diǎn)贊
收藏

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

亚洲国产精品成人一区二区| 国产精品欧美一区喷水| 欧美激情亚洲综合一区| 亚洲精品久久一区二区三区777| 中文在线字幕免费观看| 床上的激情91.| 国产精品99久久久久久白浆小说| 疯狂撞击丝袜人妻| 蜜臀av一区| 欧美日韩五月天| 成人在线国产视频| 波多野结衣在线影院| 国产麻豆午夜三级精品| 欧美在线激情视频| 欧美黑人猛猛猛| 一道本一区二区三区| 欧美一区二区三区视频| 精品www久久久久奶水| 在线观看av免费| 国产精品私人自拍| 国产欧美一区二区三区不卡高清| 中文字幕在线观看欧美| 在线 亚洲欧美在线综合一区| 在线看片第一页欧美| 国产免费一区二区三区最新6| 亚洲精品aaa| 欧美午夜视频一区二区| 欧美国产综合在线| 免费在线午夜视频| 国产色91在线| 久久精品日产第一区二区三区精品版| 国产免费一区二区三区最新不卡| 日精品一区二区三区| 韩日精品中文字幕| 国产亚洲自拍av| 一区二区三区四区日韩| 视频在线一区二区| 国产传媒第一页| 久久a级毛片毛片免费观看| 欧美一三区三区四区免费在线看 | 国产极品人妖在线观看| 中文字幕在线视频一区| 日韩成人在线资源| 男人av在线| 91丨porny丨最新| 国产综合18久久久久久| 亚洲免费成人在线| 懂色av一区二区在线播放| 91精品久久久久久久久久久久久| 亚洲av人无码激艳猛片服务器| 国产精品日韩欧美一区| 97超级碰在线看视频免费在线看 | 777xxx欧美| 日本人69视频| 久久精品黄色| 4438亚洲最大| 奇米777在线视频| 美女精品视频在线| 精品美女被调教视频大全网站| 午夜诱惑痒痒网| 久久天堂久久| 精品久久久久久久久久久院品网| 折磨小男生性器羞耻的故事| 99ri日韩精品视频| 亚洲精品美女视频| 美女脱光内衣内裤| 日韩大片在线播放| 久久亚洲电影天堂| 久久精品国产av一区二区三区| 欧美日韩1区2区3区| 久久久噜噜噜久久| 国产一级18片视频| 奇米四色…亚洲| 91香蕉电影院| 人妻妺妺窝人体色www聚色窝| 99riav久久精品riav| 欧美污视频久久久| 日本三级视频在线播放| 亚洲精品高清视频在线观看| 被灌满精子的波多野结衣| 美女露胸视频在线观看| 91福利资源站| 中文字幕在线视频一区二区| 国产精品丝袜在线播放| 亚洲成人亚洲激情| 黄色片在线观看免费| 久久久久国产精品| 国内精品久久久久久影视8| 无码人妻精品一区二区三区不卡 | 日日夜夜免费精品| 亚洲xxxxx性| 亚洲三区在线播放| 中文字幕亚洲成人| 成人在线观看你懂的| 国产成人a视频高清在线观看| 欧美一区二区三区白人| 国产亚洲无码精品| 性欧美69xoxoxoxo| 欧美亚洲视频在线观看| 国产一区二区视频免费观看 | 91精品蜜臀在线一区尤物| 国产人成视频在线观看| 欧美先锋资源| 91精品成人久久| 国产精品羞羞答答在线| 久久免费视频一区| 亚洲精品天堂成人片av在线播放| 成人香蕉视频| 日韩免费性生活视频播放| 少妇久久久久久久久久| 欧美片第1页综合| 国产精品欧美一区二区| 欧美一级淫片aaaaaa| 国产精品入口麻豆九色| 国产综合av在线| 96sao精品免费视频观看| 精品亚洲国产成av人片传媒| 欧美日韩黄色网| 日日嗨av一区二区三区四区| 国产日韩欧美精品| 国产激情在线视频| 在线观看精品一区| 无码人妻aⅴ一区二区三区| 99视频精品全部免费在线视频| 欧美一级淫片播放口| 亚洲免费国产视频| 亚洲人精品一区| 日韩大片一区二区| 亚洲精品蜜桃乱晃| 98精品国产自产在线观看| 国产高清视频免费| 中文字幕一区av| 在线观看高清免费视频| 国产成人1区| 日韩av观看网址| 亚洲三级黄色片| 精品久久久久久久久中文字幕| 国产成人av免费观看| 亚洲色图88| 亚洲一区二区三区四区视频| 免费在线观看av片| 欧美精品一二三区| 日韩在线不卡av| 久久99国产精品久久99果冻传媒| 色狠狠久久av五月综合|| 欧美无毛视频| 国产一区二区三区在线免费观看| 国产午夜性春猛交ⅹxxx| 91丨九色丨尤物| 亚洲中文字幕无码不卡电影| 色哟哟精品丝袜一区二区| 午夜伦理精品一区| 无码精品人妻一区二区| 欧美视频国产精品| av中文字幕免费观看| 久久伊人亚洲| 亚洲看片网站| 国产电影一区| 福利在线播放| 日本黄色一区二区| 日韩一区二区a片免费观看| 日日夜夜一区二区| 亚洲在线观看一区| 国产激情综合| 久久久久久久久久婷婷| 手机亚洲第一页| 在线国产亚洲欧美| 懂色av蜜臀av粉嫩av永久| 久久99精品国产麻豆不卡| 黄色污污在线观看| 风间由美中文字幕在线看视频国产欧美 | 亚洲国产一二三| 99久久免费看精品国产一区| 国产亚洲网站| 亚洲三区在线观看| 久久伦理中文字幕| 欧美亚洲视频在线观看| 91免费在线| 日韩欧美国产电影| 国产乱国产乱老熟| 中文字幕中文字幕中文字幕亚洲无线 | 伊人在线视频观看| 成年人网站91| 午夜免费高清视频| 欧美日一区二区在线观看 | 成人亚洲综合天堂| 日韩欧美成人一区| 国产91精品看黄网站在线观看| 国产精品色哟哟网站| 精品人妻二区中文字幕| 久久永久免费| 91国在线高清视频| 精品国产123区| 91蜜桃网站免费观看| 都市激情亚洲综合| 欧美成人午夜视频| 免费在线稳定资源站| 日韩一级视频免费观看在线| 日本va欧美va国产激情| 日韩毛片在线免费观看| 一起草在线视频| 国产在线精品免费| caopor在线视频| 在线播放日韩| 经典三级在线视频| 欧州一区二区| 久久精品国产第一区二区三区最新章节| 日韩在线激情| 国产精品69av| av中文字幕在线看| 久久精品电影网站| 邻家有女韩剧在线观看国语| 欧美成va人片在线观看| 亚洲熟女乱色一区二区三区久久久| 五月天激情综合| 在线免费观看亚洲视频| 欧美精彩视频一区二区三区| 在线免费观看污视频| 国产在线不卡视频| 9久久婷婷国产综合精品性色 | 日韩电影一区二区三区| 亚洲精品中文综合第一页| 欧美精选一区二区三区| 亚洲天堂免费观看| 99热这里只有精品5| 日本二三区不卡| 久久免费视频精品| 一本色道久久88精品综合| 国产suv一区二区三区| 91蜜桃在线观看| 超级砰砰砰97免费观看最新一期| 日韩一区精品字幕| 亚洲 欧美 日韩 国产综合 在线 | 国产大片中文字幕在线观看| 亚洲国产欧美另类| 国产91丝袜在线播放| 久久九九国产视频| 国产情侣一区| 国产精品久久久久9999爆乳| 婷婷六月综合| 亚洲一区综合| 凹凸成人精品亚洲精品密奴| 久久另类ts人妖一区二区| 亚洲伊人成人网| 亚洲男人的天堂在线观看| 妖精视频在线观看免费| 日本一区二区免费在线观看视频 | 91国视频在线| 国产日本精品| 欧美私人情侣网站| 丝袜a∨在线一区二区三区不卡| 日本www在线播放| 久久九九电影| 国产嫩草在线观看| 免费在线观看日韩欧美| 九九九九九国产| 国产在线观看一区二区| 激情成人在线观看| 国产超碰在线一区| 亚洲成av人片在线观看无| 成年人国产精品| 亚洲成人av免费在线观看| 97国产一区二区| a级大片免费看| 国产一区二区看久久| 日韩高清一二三区| 99久久国产综合精品女不卡| 国产成人av免费观看| www.久久精品| 人成免费在线视频| 亚洲免费视频成人| 中文字幕一区二区三区手机版| 亚洲国产成人高清精品| 国产精品久免费的黄网站| 在线观看日韩电影| 国产夫绿帽单男3p精品视频| 亚洲精品在线电影| 国产视频精品久久| 久久亚洲精品国产亚洲老地址| 超免费在线视频| 日韩av片永久免费网站| 自拍偷拍亚洲| 精品日本一区二区| 成人影院在线| 欧美久久久久久久久久久久久久| 国产视频久久| 涩涩网站在线看| 99久久精品国产导航| 日本 欧美 国产| 黄色一区二区在线| 一区二区国产欧美| 亚洲国产精品久久久久久| 日本黄在线观看| 欧美成人激情视频| 国产日韩另类视频一区| 99久久精品久久久久久ai换脸| 亚洲小说图片| 大陆极品少妇内射aaaaaa| 亚久久调教视频| 九九九久久久久久久| 久久精品人人做人人综合| 欧美日韩在线国产| 欧美天堂亚洲电影院在线播放| 亚洲国产日韩在线观看| 丝袜一区二区三区| 蜜臀久久精品| 99re在线观看视频| 水蜜桃精品av一区二区| 欧美不卡在线播放| 国产麻豆精品在线| 我想看黄色大片| 午夜不卡av在线| 99在线精品视频免费观看软件 | 国产视频精品视频| 国产精品每日更新在线播放网址| 国产精品成人av久久| 欧美军同video69gay| 免费av在线电影| 韩国视频理论视频久久| 激情不卡一区二区三区视频在线| 日本电影一区二区三区| 亚洲精品三级| 一级全黄裸体片| 亚洲男人的天堂一区二区| 在线观看免费观看在线| 亚洲人成亚洲人成在线观看| 激情视频网站在线播放色| 成人av播放| 欧美69视频| 91aaa精品| 18成人在线视频| 97超碰中文字幕| 色久欧美在线视频观看| 素人一区二区三区| 欧美在线一区二区三区四区| 性色一区二区| 免费看黄色aaaaaa 片| 亚洲成a人在线观看| 丰满熟妇人妻中文字幕| 久久91亚洲精品中文字幕| 欧美第一在线视频| 女女同性女同一区二区三区按摩| 美女精品自拍一二三四| 天天舔天天操天天干| 欧美在线综合视频| av资源网站在线观看| 国产精品尤物福利片在线观看| 国产精品一区2区3区| 午夜免费高清视频| 中文字幕欧美三区| 亚洲中文字幕一区二区| 色婷婷久久av| 国产精品一区二区三区四区在线观看| 在线免费观看成人网| 美美哒免费高清在线观看视频一区二区| 欧美日韩生活片| 7777精品久久久大香线蕉| 春暖花开成人亚洲区| 日韩免费中文字幕| 日韩理论电影大全| 亚洲自拍第三页| 亚洲成a人v欧美综合天堂| 手机av免费在线观看| 国产97免费视| 国产精品久久久久蜜臀 | 天堂av一区| 国产av国片精品| 久久亚洲综合av| 中国女人真人一级毛片| 久久精品人人做人人爽| 日韩在线亚洲| 大肉大捧一进一出好爽视频| 久久久91精品国产一区二区三区| 在线免费a视频| 欧美韩国理论所午夜片917电影| 国产精品久久久久av蜜臀| 日韩av黄色网址| 国产精品午夜久久| www.中文字幕| 国产91在线播放九色快色| 91精品天堂福利在线观看| 涩视频在线观看| 在线视频综合导航| 91麻豆一二三四在线| 美女视频久久| 国产在线一区二区综合免费视频| 日韩aaaaaa| yellow中文字幕久久| 欧美绝顶高潮抽搐喷水合集| 亚洲一级片网站| 亚洲成va人在线观看| 欧美激情黑人| 国内精品**久久毛片app| 另类中文字幕网| 午夜精品久久久久久久久久久久久蜜桃| 中文字幕欧美日韩精品| 国产精品qvod| 午夜免费一级片| 色成人在线视频| 国产丝袜视频在线播放|