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

欧美日韩中文国产一区发布| 亚洲网在线观看| 日本道在线视频| 亚洲第一成年人网站| 亚洲激情婷婷| 亚洲人成绝费网站色www| 久久黄色片网站| 欧美人与性动交α欧美精品图片| 9人人澡人人爽人人精品| 国产精品27p| 欧美色图一区二区| 国产欧美高清视频在线| 日韩欧美亚洲另类制服综合在线| 男人日女人bb视频| 影院在线观看全集免费观看| 久久久亚洲高清| 亚洲已满18点击进入在线看片 | 三级无遮挡在线观看| 久久国产尿小便嘘嘘| 国产精品一二二区| 精品国产露脸精彩对白| 欧美性猛交久久久乱大交小说| mm1313亚洲国产精品美女| 久久一留热品黄| 91久久精品国产91久久性色tv | 777午夜精品视频在线播放| 欧美一级欧美一级| 麻豆免费在线观看| 国产午夜久久久久| 国内精品久久久久久久果冻传媒| 91麻豆视频在线观看| 美女网站久久| 午夜精品一区二区三区av| 久久久久亚洲av无码专区体验| 国产永久精品大片wwwapp| 日韩国产精品亚洲а∨天堂免| 超碰在线超碰在线| 精品国产黄a∨片高清在线| 狠狠躁夜夜躁人人躁婷婷91| 天堂8在线天堂资源bt| 欧美边添边摸边做边爱免费| 日本一区二区在线不卡| 欧美日韩精品免费看| 五月婷婷丁香花| 99在线视频精品| 国产精品入口免费| 亚洲乱码国产乱码精品精软件| 韩国午夜理伦三级不卡影院| 国产精品一区久久| 亚洲熟女乱色一区二区三区久久久| 母乳一区在线观看| 日本久久中文字幕| 国产精品久久久久久人| 国产麻豆综合| 日本欧美黄网站| 中文字幕激情小说| 亚洲三级网站| 国产69精品久久久久久| 天天综合网久久综合网| 久久精品天堂| 国产精品精品视频| 亚洲午夜无码久久久久| 麻豆精品蜜桃视频网站| 国产精品一区二区久久精品| 在线观看免费观看在线| 精东粉嫩av免费一区二区三区| 国产欧美韩国高清| 国产高中女学生第一次| 久久99精品视频| 毛片av一区二区| 在线观看久久久久久| 日本精品在线观看视频| 欧美中文一区二区| 日韩在线激情视频| 色老板免费视频| 综合一区在线| 国产69精品99久久久久久宅男| 欧美日韩亚洲国产另类| 国产专区一区| 午夜精品久久久久久久99黑人| 亚洲精品77777| 男人的天堂亚洲| 国产成人一区二区三区电影| 中文字幕av影视| 国产乱国产乱300精品| 国产66精品久久久久999小说| 好吊视频一区二区三区| 91亚洲精品久久久蜜桃网站| 日韩欧美99| 超碰在线最新| 亚洲成a人片综合在线| 国内外成人激情视频| 久久国产三级| 精品乱人伦一区二区三区| 真人bbbbbbbbb毛片| 成人一区二区| 欧美激情第一页xxx| 国产精品久免费的黄网站| 久久99精品久久久久久国产越南 | 亚洲品质视频自拍网| 国产中文字幕久久| 一区在线视频| 国产极品精品在线观看| 国产黄色片免费| 91理论电影在线观看| 少妇熟女一区二区| 国偷自产一区二区免费视频| 91精品视频网| 30一40一50老女人毛片| 无码一区二区三区视频| 欧美亚洲成人精品| 国产精品主播一区二区| 久久综合久久久久88| 福利网在线观看| 东京一区二区| 精品欧美乱码久久久久久1区2区| 日本成人免费视频| 在线成人黄色| 91午夜理伦私人影院| 欧美偷拍视频| 亚洲一区二区三区四区在线观看 | 欧美极品videos大乳护士| 欧美日韩精品一二三区| 美女又爽又黄视频毛茸茸| 中文字幕一区二区三三| 国产精品成人v| 无码精品视频一区二区三区| 亚洲欧美国产77777| 一个人www欧美| 1314成人网| blacked蜜桃精品一区| 国内精品久久久久久久| 国产日韩欧美视频在线观看| 欧美国产禁国产网站cc| 成人免费aaa| 亚洲网址在线观看| 久久久精品国产亚洲| 久久久精品毛片| 99久久久国产精品| 欧美狂野激情性xxxx在线观| 国产美女视频一区二区| 在线观看日韩www视频免费| a v视频在线观看| 国产v综合v亚洲欧| 国产又黄又爽免费视频| 国外成人福利视频| 国产一区二区三区在线观看网站 | 亚洲国产精品视频| 欧美熟妇另类久久久久久多毛| 日本欧美肥老太交大片| 国产精品444| 精品一二三区视频| 91福利精品视频| 韩国三级hd中文字幕| 视频一区视频二区中文字幕| 欧美日韩国产精品一卡| 666av成人影院在线观看| 国产精品一区免费视频| 欧美国产在线视频| 亚洲AV无码一区二区三区少妇| 亚洲美女屁股眼交| 无码国产精品一区二区高潮| 午夜精品久久久久99热蜜桃导演 | 久热精品视频在线| 在线视频这里只有精品| 天堂av在线电影| 欧美高清视频在线高清观看mv色露露十八| 亚洲综合av影视| 日本一区免费| 蜜桃视频在线观看免费视频| 欧美不卡一区二区三区四区| 在线视频一二三区| 极品盗摄国产盗摄合集| 日韩制服丝袜av| 麻豆蜜桃91| 国产不卡人人| 精品欧美一区二区久久| 国产一级淫片久久久片a级| 久久99精品久久久| 国产免费色视频| 国产亚洲精品精品国产亚洲综合| 国产亚洲精品久久久久久777| 精品国产免费观看| av不卡一区| 久久国产生活片100| 国产午夜精品在线| 是的av在线| 国产视频在线一区二区| 黄色在线视频网址| 国产日韩一级二级三级| 视色视频在线观看| 狠狠综合久久av一区二区老牛| 久久91精品国产91久久小草| 国产精品福利在线观看| a天堂中文在线| 欧美色国产精品| 免费视频网站www| 99精品欧美一区二区蜜桃免费| 精品久久一二三| 亚洲v天堂v手机在线| 成人在线视频福利| 第一av在线| 国产亚洲精品高潮| 国产精品嫩草影院精东| 亚洲精品日产精品乱码不卡| 一级黄色电影片| 视频一区视频二区中文| 好色先生视频污| 杨幂一区二区三区免费看视频| 成人午夜在线观看| rebdb初裸写真在线观看| 亚洲欧美在线磁力| 国产熟女一区二区三区四区| 一本色道久久综合亚洲91| 亚洲精品久久久久久国| 99精品欧美一区二区三区小说 | 日韩色淫视频| 欧美激情va永久在线播放| 色视频精品视频在线观看| 欧美三级乱人伦电影| 日本在线视频免费观看| 亚洲日本电影在线| 少妇特黄一区二区三区| 国精产品一区一区三区mba视频| 黄页网站在线观看视频| 五月婷婷激情视频| 国产一区二区三区在线观看免费视频 | 免费成人深夜蜜桃视频| 国产成人精品一区二| 国产一区视频免费观看| 国产精品a级| 亚洲高清在线播放| 国产精品三级| 国产福利久久精品| 99久久999| 国产999视频| 蜜桃视频www网站在线观看| 久久久精品一区二区三区| 嫩草研究院在线观看| 精品国产露脸精彩对白| www.黄色国产| 欧美日韩国产首页在线观看| 精品免费囯产一区二区三区| 亚洲一区二三区| 色欲av无码一区二区三区| 成人激情校园春色| 可以看的av网址| 久久99精品国产麻豆婷婷洗澡| 激情网站五月天| 久久久久久久波多野高潮日日| 妞干网在线播放| 亚洲国产精品成人| 综合色婷婷一区二区亚洲欧美国产| 亚洲三级网页| 久久精品日韩| 美女一区二区在线观看| 国产福利久久精品| 欧美一级全黄| 精品久久蜜桃| 国产精品xxx在线观看| 国产精品二区二区三区| 久久精品色综合| 国产精品青青草| 都市激情久久| 国产欧美丝袜| 精品一区在线| 色爱区成人综合网| 蜜桃av.com| 高清久久久久久| 日本性生活一级片| 成人小视频在线| 久久久老熟女一区二区三区91| 成人免费高清在线| 国产xxxx视频| 久久中文字幕电影| 女女互磨互喷水高潮les呻吟| 国产欧美日本一区视频| 大吊一区二区三区| 亚洲人妖av一区二区| 农村黄色一级片| 亚洲高清免费视频| 日本中文字幕免费观看| 精品久久中文字幕久久av| 精品国产免费观看| 欧美日韩免费不卡视频一区二区三区| 国产天堂第一区| 91精品国产综合久久福利| 国产日本精品视频| 精品亚洲男同gayvideo网站| 国产有码在线| www.色综合| 性爱视频在线播放| 琪琪亚洲精品午夜在线| 日韩一区二区三区免费视频| 成人信息集中地欧美| 欧美黄色一级| 欧洲精品久久| 天天久久综合| 成年人网站国产| 在线亚洲精品| 亚洲污视频在线观看| 国产美女在线精品| 好吊一区二区三区视频| 国产精品国产馆在线真实露脸| 麻豆影视在线播放| 91九色02白丝porn| 国产免费久久久| 亚洲人成电影网站色xx| 超碰在线观看免费| 18一19gay欧美视频网站| 综合久草视频| 九九久久99| 99精品全国免费观看视频软件| 日日噜噜夜夜狠狠久久丁香五月| 久久动漫亚洲| 超碰91在线播放| 久久这里只有精品视频网| 国产精品久久久免费看| 日本道免费精品一区二区三区| 国产视频第一页| 亚洲欧美日韩国产中文| 日韩av毛片| 国产欧美一区二区三区久久人妖| 粉嫩一区二区三区四区公司1| 一本一生久久a久久精品综合蜜| 国产免费成人| 亚洲美女高潮久久久| 国产精品青草久久| 18国产免费视频| 精品无码久久久久久国产| 中文字幕中文字幕在线十八区 | 亚洲免费成人| 国产永久免费网站| 2014亚洲片线观看视频免费| 久久精品一区二区三区四区五区| 在线视频欧美精品| 欧洲精品久久一区二区| 久久精品久久久久| 成人久久网站| 日本不卡免费新一二三区| 欧美福利专区| 少妇性l交大片| 久久人人爽人人爽| 日韩欧美高清在线观看| 欧美一级日韩一级| 成人在线影视| 国产一区视频在线| 成人毛片免费看| 天天综合网日韩| 国产欧美日韩在线| 亚洲精品中文字幕乱码三区91| 欧美精品一区二区精品网| 性欧美高清come| 国产乱码精品一区二区三区日韩精品 | 国产在线电影| 国产精品亚洲网站| 不卡一区2区| 久久亚洲一区二区三区明星换脸| 国产精品扒开腿做爽爽爽a片唱戏| 亚洲精品视频在线看| 国产精品玖玖玖| 久久高清视频免费| 999久久久精品一区二区| 中文字幕色呦呦| 国产剧情一区二区| 久久午夜无码鲁丝片午夜精品| 日韩三级视频中文字幕| 在线观看三级视频| 成人福利网站在线观看| 欧美一区激情| 日批视频免费看| 亚洲成人午夜电影| 免费黄色片在线观看| 国产不卡视频在线| 欧美熟乱15p| 色网站在线视频| 亚洲一卡二卡三卡四卡无卡久久| 亚洲乱码精品久久久久..| 2018国产精品视频| 教室别恋欧美无删减版| 欧美男女交配视频| 亚洲精品国产视频| 狠狠人妻久久久久久综合麻豆| 国色天香2019中文字幕在线观看| japansex久久高清精品| 黄色a级片免费看| 97久久超碰国产精品电影| 精品人妻无码一区二区性色 | 懂色一区二区三区| 国产欧美一区二区三区久久人妖 | 精品国偷自产一区二区三区| 成人黄色国产精品网站大全在线免费观看| 国产精彩视频在线| 亚洲国产精品系列| 日韩天堂在线| 日韩精品伦理第一区| 狠狠久久亚洲欧美| 天天操天天操天天操天天| 色777狠狠综合秋免鲁丝| 日韩精品中文字幕吗一区二区|