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

SpringBoot+ResponseBodyEmitter異步流式推送神技,非常強大!

開發 前端
簡單來說,它是 Spring 框架提供的一個異步響應發射器,允許我們像擠牙膏一樣,分批次把數據推送給客戶端,而不是一次性把整個牙膏管都扔過去。

兄弟們,當你正在開發一個在線考試系統,用戶提交試卷后需要等待后臺長時間的自動閱卷。這時候如果用傳統的同步接口,頁面就會像被施了定身咒一樣卡在那里,用戶只能對著空白頁面發呆,甚至懷疑是不是服務器跑路了。

再比如你做一個文件上傳功能,用戶上傳一個 10GB 的大文件,如果不能實時看到上傳進度,很可能會誤以為上傳失敗而反復點擊,導致服務器壓力倍增。

這些場景都指向一個核心問題:傳統同步接口的一次性響應模式已經無法滿足現代 Web 應用的實時交互需求。這時候,Spring Boot 提供的 ResponseBodyEmitter 就像一把倚天劍,幫我們劈開阻塞的迷霧。

一、ResponseBodyEmitter 到底是什么?

簡單來說,它是 Spring 框架提供的一個異步響應發射器,允許我們像擠牙膏一樣,分批次把數據推送給客戶端,而不是一次性把整個牙膏管都扔過去。這種特性在以下場景中尤其有用:

  • 實時日志監控:運維人員可以實時看到服務器日志滾動
  • AI 流式響應:類似 ChatGPT 的逐字輸出效果
  • 長任務進度條:文件上傳、視頻轉碼等耗時操作的實時反饋
  • 股票行情推送:金融系統的實時數據更新

用大白話講,它就像一個快遞員,每次只送一小包快遞,送完一包馬上通知你,而不是等所有快遞都打包好了再一次性送過來。這樣你可以更快地收到部分結果,不用干等。

二、ResponseBodyEmitter 的核心原理

1. 打破傳統 HTTP 響應模式

傳統 HTTP 響應就像一場單向的演講,服務器講完所有內容后就結束對話。而 ResponseBodyEmitter 則像一場脫口秀,演員(服務器)可以隨時拋出新梗(數據),觀眾(客戶端)可以實時互動。

具體來說,它通過 分塊傳輸編碼(Chunked Encoding) 實現流式輸出。服務器不再需要在響應頭中指定 Content-Length,而是把數據分成多個小塊,每個小塊都有自己的長度標識。客戶端收到一塊就處理一塊,就像吃火鍋時涮毛肚,燙一片吃一片,不用等整鍋燒開。

2. 線程管理的魔法

ResponseBodyEmitter 的 send () 方法是線程安全的,但它本身并不創建線程。我們需要自己啟動一個異步線程來處理耗時操作,避免阻塞主線程。這就像餐館里的服務員,主線程負責接單(接收請求),然后把訂單交給后廚(異步線程)處理,服務員可以繼續接待其他客人。

3. 連接生命周期的精準控制

  • complete():數據全部發送完畢,優雅地關閉連接
  • completeWithError():出現異常時終止連接并傳遞錯誤信息
  • onTimeout():設置超時回調,避免長連接占用資源

就像一場演唱會,主唱(服務器)會在結束時說 “謝謝大家”(complete ()),如果設備出故障會說 “抱歉,演出取消”(completeWithError ()),如果觀眾長時間沒反應會說 “再不走就關燈啦”(onTimeout ())。

三、實戰案例:打造實時日志監控系統

1. 準備工作

添加 Spring Boot Web 依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2. 控制器實現

@RestController
@RequestMapping("/api/log")
public class LogController {
    private final Logger logger = LoggerFactory.getLogger(LogController.class);
    @GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public ResponseBodyEmitter streamLogs() {
        ResponseBodyEmitter emitter = new ResponseBodyEmitter(60000L); // 60秒超時
        // 啟動異步線程處理日志生成
        Executors.newSingleThreadExecutor().execute(() -> {
            try {
                for (int i = 1; i <= 10; i++) {
                    String logEntry = "[" + LocalDateTime.now() + "] 第" + i + "條日志\n";
                    emitter.send(logEntry); // 發送日志條目
                    Thread.sleep(1000); // 模擬日志生成延遲
                }
                emitter.complete(); // 日志發送完畢
            } catch (Exception e) {
                emitter.completeWithError(e); // 出現異常時終止
            }
        });
        // 設置超時回調
        emitter.onTimeout(() -> {
            logger.warn("日志流連接超時");
            emitter.completeWithError(new TimeoutException("連接超時"));
        });
        // 設置完成回調
        emitter.onCompletion(() -> logger.info("日志流連接已關閉"));
        return emitter;
    }
}

3. 前端接收數據

<!DOCTYPE html>
<html>
<head>
    <title>實時日志監控</title>
</head>
<body>
    <div id="log-container"></div>
    <script>
        const logContainer = document.getElementById('log-container');
        // 使用fetch API處理流式響應
        async function fetchLogStream() {
            const response = await fetch('/api/log/stream');
            if (!response.ok) throw new Error('請求失敗');
            const reader = response.body.getReader();
            const decoder = new TextDecoder('utf-8');
            while (true) {
                const { done, value } = await reader.read();
                if (done) break;
                const logText = decoder.decode(value, { stream: true });
                logContainer.innerHTML += `<div>${logText}</div>`;
            }
        }
        fetchLogStream().catch(error => console.error('日志流錯誤:', error));
    </script>
</body>
</html>

4. 效果演示

啟動應用后訪問http://localhost:8080/api/log/stream,頁面會每秒更新一條日志,就像在看一場實時的日志電影。這種體驗比傳統的輪詢方式不知道高到哪里去了!

四、核心方法深度解析

1. send(Object data)

  • 作用:向客戶端發送數據,可以多次調用
  • 注意事項:

數據類型可以是任意對象,但建議使用字符串或 JSON 格式

發送的數據會被自動序列化為 JSON,除非指定了 MIME 類型

如果連接已關閉,再次調用會拋出異常

2. complete()

  • 作用:終止響應流,釋放資源
  • 最佳實踐:

在 finally 塊中調用,確保即使出現異常也能關閉連接

避免在異步線程中遺漏調用,導致連接泄漏

3. onTimeout(Runnable callback)

  • 作用:設置超時回調
  • 參數:

timeout:超時時間(毫秒),默認 30 秒

callback:超時后執行的操作

4. onCompletion(Runnable callback)

  • 作用:設置完成回調
  • 觸發時機:

調用 complete () 后

所有數據發送完畢后

出現異常調用 completeWithError () 后

五、與其他技術的對比分析

1. vs SSE(Server-Sent Events)

特性

ResponseBodyEmitter

SSE

協議兼容性

任意 HTTP 客戶端

僅支持 SSE 兼容的客戶端

數據格式

任意格式

必須符合 SSE 規范(text/event-stream)

自動重連

不支持

支持

適用場景

通用流式傳輸

事件驅動型場景

結論:如果你需要瀏覽器自動重連或嚴格遵循 SSE 規范,選 SSE;否則 ResponseBodyEmitter 更靈活。

2. vs WebSocket

特性

ResponseBodyEmitter

WebSocket

連接性質

單向(服務器→客戶端)

雙向

協議

HTTP

專用 WebSocket 協議

實現復雜度

簡單

較高

適用場景

實時數據推送

實時聊天、多人協作

結論:如果需要雙向通信,WebSocket 是更好的選擇;否則 ResponseBodyEmitter 更輕量。

3. vs StreamingResponseBody

特性

ResponseBodyEmitter

StreamingResponseBody

數據發送方式

主動推送

被動寫入 OutputStream

異步支持

完全異步

部分異步(需手動管理線程)

靈活性

較低

適用場景

動態生成數據

靜態文件流式傳輸

結論:如果需要動態控制數據發送時機,選 ResponseBodyEmitter;否則 StreamingResponseBody 更簡單。

六、實際應用場景精講

1. AI 流式響應(如 ChatGPT 效果)

@RestController
@RequestMapping("/api/ai")
public class AiController {
    @GetMapping("/chat")
    public ResponseBodyEmitter chatWithAi() {
        ResponseBodyEmitter emitter = new ResponseBodyEmitter();
        Executors.newSingleThreadExecutor().execute(() -> {
            try {
                String[] aiResponse = {
                    "你好!我是AI助手。",
                    "今天有什么可以幫你的?",
                    "我可以回答問題、提供建議,或者陪你聊天。"
                };
                for (String message : aiResponse) {
                    Thread.sleep(1000); // 模擬AI思考時間
                    emitter.send(message);
                }
                emitter.complete();
            } catch (Exception e) {
                emitter.completeWithError(e);
            }
        });
        return emitter;
    }
}

前端效果:文字像打字機一樣逐字出現,用戶體驗更自然。

2. 實時股票行情推送

@RestController
@RequestMapping("/api/stock")
public class StockController {
    private final Map<String, ResponseBodyEmitter> emitters = new ConcurrentHashMap<>();
    @GetMapping("/subscribe/{symbol}")
    public ResponseBodyEmitter subscribe(@PathVariable String symbol) {
        ResponseBodyEmitter emitter = new ResponseBodyEmitter(30000L);
        // 保存發射器以便后續推送數據
        emitters.put(symbol, emitter);
        // 模擬實時行情更新
        Executors.newSingleThreadExecutor().execute(() -> {
            try {
                while (true) {
                    double price = Math.random() * 100; // 隨機生成股價
                    emitter.send("{\"symbol\":\"" + symbol + "\",\"price\":" + price + "}");
                    Thread.sleep(5000); // 每5秒更新一次
                }
            } catch (Exception e) {
                emitter.completeWithError(e);
                emitters.remove(symbol);
            }
        });
        return emitter;
    }
    // 推送消息給所有訂閱者
    public void pushStockUpdate(String symbol, double price) {
        ResponseBodyEmitter emitter = emitters.get(symbol);
        if (emitter != null) {
            try {
                emitter.send("{\"symbol\":\"" + symbol + "\",\"price\":" + price + "}");
            } catch (Exception e) {
                emitter.completeWithError(e);
                emitters.remove(symbol);
            }
        }
    }
}

3. 長任務進度條

@RestController
@RequestMapping("/api/task")
public class TaskController {
    @PostMapping("/start")
    public ResponseBodyEmitter startLongTask() {
        ResponseBodyEmitter emitter = new ResponseBodyEmitter();
        Executors.newSingleThreadExecutor().execute(() -> {
            try {
                for (int i = 1; i <= 100; i++) {
                    Thread.sleep(100); // 模擬任務執行
                    emitter.send("{\"progress\":" + i + "}");
                }
                emitter.complete();
            } catch (Exception e) {
                emitter.completeWithError(e);
            }
        });
        return emitter;
    }
}

前端可以根據接收到的 progress 字段更新進度條,讓用戶實時了解任務狀態。

七、常見問題與解決方案

1. 連接超時問題

  • 現象:客戶端長時間收不到數據,連接自動斷開
  • 解決方案:

設置合理的超時時間:new ResponseBodyEmitter(60000L)

在異步線程中定期發送心跳包

使用 onTimeout 回調處理超時邏輯

2. 數據亂序問題

  • 現象:客戶端接收到的數據順序與發送順序不一致
  • 解決方案:

在數據中添加時間戳或序列號

確保異步線程按順序發送數據

使用線程安全的隊列管理待發送數據

3. 資源泄漏問題

  • 現象:服務器連接數不斷增加,最終導致內存溢出
  • 解決方案:

確保在 finally 塊中調用 complete () 或 completeWithError ()

使用 WeakHashMap 管理 Emitter 實例

設置合理的超時時間并在超時后清理資源

4. 瀏覽器緩存問題

  • 現象:刷新頁面后數據未更新
  • 解決方案:

在響應頭中添加Cache-Control: no-cache

在請求 URL 中添加隨機參數:/api/log/stream?timestamp=${new Date().getTime()}

八、性能優化技巧

1. 線程池管理

  • 推薦做法:
private final ExecutorService executor = Executors.newFixedThreadPool(10);
@GetMapping("/stream")
public ResponseBodyEmitter stream() {
    ResponseBodyEmitter emitter = new ResponseBodyEmitter();
    executor.submit(() -> {
        // 異步任務邏輯
    });
    return emitter;
}

使用固定大小的線程池避免頻繁創建銷毀線程。

2. 批量發送數據

  • 場景:需要發送大量小數據塊
  • 優化方法:
StringBuilder buffer = new StringBuilder();
for (int i = 0; i < 100; i++) {
    buffer.append("數據塊").append(i).append("\n");
    if (i % 10 == 0) { // 每10個數據塊發送一次
        emitter.send(buffer.toString());
        buffer.setLength(0);
    }
}

減少 send () 調用次數,降低網絡開銷。

3. 壓縮傳輸數據

  • 配置方法:
@Bean
public FilterRegistrationBean<HttpEncodingFilter> httpEncodingFilter() {
    FilterRegistrationBean<HttpEncodingFilter> registrationBean = new FilterRegistrationBean<>();
    HttpEncodingFilter filter = new HttpEncodingFilter();
    filter.setForceEncoding(true);
    filter.setEncoding("gzip");
    registrationBean.setFilter(filter);
    registrationBean.addUrlPatterns("/*");
    return registrationBean;
}

使用 Gzip 壓縮減少數據傳輸量。

九、總結

ResponseBodyEmitter 就像 Spring Boot 送給 Java 開發者的一件神器,它讓我們能夠輕松實現高效的異步流式推送。通過本文的學習,你應該已經掌握了以下核心技能:

  • 理解異步流式推送的必要性和應用場景
  • 掌握 ResponseBodyEmitter 的核心方法和使用技巧
  • 學會與其他技術的對比分析和選型策略
  • 了解常見問題的解決方案和性能優化技巧

最后,我想說的是,技術的價值不在于它有多復雜,而在于它能解決什么問題。ResponseBodyEmitter 或許不是最耀眼的技術,但它在提升用戶體驗、優化系統性能方面的作用卻不可小覷。希望本文能幫助你在實際項目中更好地運用這門神技,讓你的應用程序更加流暢、高效!

責任編輯:武曉燕 來源: 石杉的架構筆記
相關推薦

2025-03-10 00:00:11

Spring框架數據

2025-09-02 09:32:33

Spring工具項目

2025-03-10 08:44:17

2024-05-09 08:08:32

SpringBinderJava

2009-12-29 10:41:30

Ubuntu 9.10

2025-02-10 08:43:31

Java異步編程

2020-05-21 15:53:59

遠程調試工具

2022-02-25 15:32:45

SpringBoot代碼優化

2024-03-06 08:13:33

FutureJDKCallable

2024-09-03 08:26:59

Spring格式模板

2010-12-09 10:54:32

2021-09-07 07:53:43

工具

2023-05-10 10:35:14

服務器代碼

2024-10-14 09:20:09

異步流式接口

2025-04-22 07:48:56

2021-12-31 13:25:44

PythonPipe代碼

2025-03-26 00:00:00

Spring服務器推送技術

2024-06-05 10:31:50

2024-09-05 08:58:37

2021-02-05 07:28:11

SpringbootNettyWebsocke
點贊
收藏

51CTO技術棧公眾號

不卡的av网站| 全球成人免费直播| 五月天精品一区二区三区| 91久久精品www人人做人人爽| 91n在线视频| 精品视频在线播放一区二区三区| 亚洲精品视频一区| 国产欧美欧洲| 久久午夜精品视频| 99久久久成人国产精品| 亚洲欧美国产毛片在线| caoporen国产精品| 毛片在线免费视频| 国产欧美亚洲精品a| 欧美三级在线视频| 男女h黄动漫啪啪无遮挡软件| 亚洲毛片欧洲毛片国产一品色| 亚洲黄色天堂| 亚洲成人亚洲激情| 色多多视频在线播放| a视频在线免费看| 成人黄色大片在线观看 | 午夜宅男在线视频| 国产一二区在线观看| 成人黄色大片在线观看| 国产91九色视频| 搜索黄色一级片| 秋霞影视一区二区三区| 欧美羞羞免费网站| 国产欧美久久久久| 国产大片在线免费观看| 国产精品白丝jk黑袜喷水| 欧美诱惑福利视频| 男女男精品视频网站| 国产精品欧美大片| 欧美无乱码久久久免费午夜一区| 欧美黑人在线观看| 欧美18xxxxx| 国产综合久久久久久鬼色| 午夜精品久久久久久99热软件| 精品成人无码一区二区三区| 天堂精品久久久久| 欧美日韩一级视频| 国产黄色一级网站| 天堂аⅴ在线地址8| 91在线云播放| 999国产在线| 中文字幕a级片| 国产精品乱看| 欧美激情精品在线| 五月天综合视频| 国产精品主播在线观看| 91麻豆精品91久久久久久清纯 | 国产 xxxx| 动漫一区二区三区| 欧美色网一区二区| 日本免费不卡一区二区| 调教一区二区| 国产精品久久影院| 日日夜夜精品网站| 你懂的视频在线观看| www.亚洲色图.com| 国产精品xxx在线观看www| 国产精品无码在线播放| 免费人成在线不卡| 日本精品久久久久影院| 91蜜桃视频在线观看| 欧美激情91| 久久这里有精品视频| 亚洲一二三四五六区| 第九色区aⅴ天堂久久香| 亚洲片在线资源| 亚洲黄色免费在线观看| a级日韩大片| 日韩视频免费观看高清完整版在线观看 | 亚洲成人看片| 色综合久久中文字幕| 2022亚洲天堂| 欧美黑人疯狂性受xxxxx野外| 激情成人在线视频| 女性女同性aⅴ免费观女性恋| 欧美激情网站| 色婷婷精品大在线视频| 国产玉足脚交久久欧美| xxx.xxx欧美| 亚洲第一主播视频| 少妇高潮喷水在线观看| 欧美办公室脚交xxxx| 亚洲午夜久久久久久久久电影院| 91视频 - 88av| 爱看av在线| 欧美丝袜一区二区三区| 欧美成人免费高清视频| 欧美日韩尤物久久| 欧美日韩黄视频| 99999精品| 6080亚洲理论片在线观看| 亚洲电影免费观看高清| 日韩片在线观看| 国产亚洲一卡2卡3卡4卡新区| 有码中文亚洲精品| 一二三四在线观看视频| 中文字幕日韩欧美精品高清在线| 欧美日韩福利视频| 中文字幕在线观看免费视频| 亚洲一区二区三区高清不卡| 国产精品第一页在线| 一级aaaa毛片| 成人永久免费视频| 国产伦精品一区二区三区视频孕妇 | 色狠狠一区二区| 天天干天天玩天天操| 一本色道69色精品综合久久| 亚洲国产精品人人爽夜夜爽| 99久久99久久精品免费| 欧美激情视频一区二区三区在线播放| 国产69精品久久久久99| 久久黄色精品视频| 黄色资源网久久资源365| 国产精品精品软件视频| wwwww在线观看免费视频| 中文字幕一区二区三区四区不卡| 国产精品av免费观看| 欧美黑人巨大xxxxx| 日韩精品在线看片z| 波多野结衣一二三区| 日韩久久综合| 欧美亚洲日本黄色| 国产肥老妇视频| 99久久er热在这里只有精品15| 亚洲人成网站在线播放2019| heyzo在线欧美播放| 欧美日韩第一区日日骚| 在线观看亚洲免费视频| 国产精品久久久久9999赢消| 欧洲美女免费图片一区| 99精品久久久久久中文字幕| av一区二区久久| 欧美亚洲视频一区| 春暖花开亚洲一区二区三区| 亚洲精品在线电影| 国产高潮国产高潮久久久91| 久久成人亚洲| 国产日韩欧美精品| 91中文在线| 欧美性xxxxxxxx| 国产艳俗歌舞表演hd| 欧美日韩福利| 91精品啪aⅴ在线观看国产| 国产视频二区在线观看| 精品日本高清在线播放| www.四虎精品| 91精品久久久久久久久久不卡| 国产精品av在线播放| 无码国产精品一区二区免费16| 亚洲精品美国一| 国产又粗又猛大又黄又爽| 99久久九九| 国产伦精品免费视频| 欧美xxx.com| 欧美性xxxx极品hd欧美风情| 第四色在线视频| 在线观看的日韩av| 国产精华一区二区三区| 精品精品导航| 69久久99精品久久久久婷婷 | 97成人在线观看| 国产精品国产三级国产a | 久久精品国语| 日本精品一区二区三区视频 | 久久综合久久网| 欧美中文高清| 欧美高清一级大片| 不卡的日韩av| 亚洲国产综合色| 欧产日产国产精品98| 亚洲中字黄色| 欧美午夜视频在线| 精品视频一区二区三区四区五区| 亚洲人成在线电影| 日韩 欧美 综合| 91亚洲精品乱码久久久久久蜜桃| 91九色在线观看视频| 岛国av一区| 69av在线播放| yw193.com尤物在线| 欧美偷拍一区二区| 成年人免费视频播放| 国产乱人伦偷精品视频不卡| 天天爱天天做天天操| 美女日韩一区| 97精品在线视频| 天天插天天干天天操| 色香蕉成人二区免费| 国产一二三四区在线| 久久伊人亚洲| 大地资源第二页在线观看高清版| 日韩精品视频中文字幕| 国内精品久久久久久影视8| 手机看片一区二区| 在线区一区二视频| 你懂得在线观看| 成人综合激情网| 无码专区aaaaaa免费视频| 国产精品一区二区av交换| 国产精品免费观看在线| 尤物视频在线看| 精品视频在线观看日韩| 97人妻精品视频一区| 中文字幕在线免费不卡| 能看毛片的网站| 亚洲欧美网站| 一道本在线观看视频| 青青一区二区| 成人精品久久久| 欧美一级鲁丝片| 在线国产精品播放| 丰满大乳国产精品| 欧美亚洲综合另类| 国产精品成人av久久| 久久这里只有精品首页| 在线免费看污网站| 久久性色av| 日韩精品综合在线| 日韩欧美高清| 快播亚洲色图| 综合中文字幕| 国产一区二区丝袜| 国产在线视频欧美一区二区三区| 久草免费在线观看| 亚洲午夜久久久影院| 五月婷婷在线观看视频| 日韩精品一区二区三区中文不卡 | 国产有色视频色综合| 99久热在线精品视频观看| 国产精品老女人视频| 夜鲁夜鲁夜鲁视频在线播放| 欧美精品第一页在线播放| 18视频在线观看网站| 久久精品欧美视频| 米奇777四色精品人人爽| 国产一区二区三区久久精品| 天堂在线视频网站| 亚洲精品国产精品国自产在线 | 中文字幕一区二区三区四区欧美| 午夜精品久久久久久久蜜桃app| 久久久久久欧美精品se一二三四 | 成年人免费高清视频| 亚洲超丰满肉感bbw| 国产在线一二区| 亚洲成人在线免费| 在线看成人av| 午夜一区二区三区视频| 999这里只有精品| 日韩欧美在线视频观看| 老熟妇仑乱一区二区av| 日本道精品一区二区三区| 日本精品入口免费视频| 在线欧美一区二区| 国产精品久久久久久在线| 欧美一区二区三级| 免费av网站在线播放| 亚洲福利影片在线| 免费在线毛片| 在线观看国产精品91| 色视频在线免费观看| 久久国产精品视频| 国产黄色大片在线观看| 欧美一区二区三区四区在线| 日本久久免费| 国产专区欧美专区| 日韩在线视频一区二区三区 | 精品国产123区| 亚洲啪啪av| 欧美日本久久| 六月丁香婷婷激情| 久久国产福利国产秒拍| 久久久久久国产精品日本| 成人毛片老司机大片| 欧美熟妇一区二区| 日韩一区在线看| 日韩高清精品免费观看| 91成人看片片| 国产草草影院ccyycom| 亚洲国产精品系列| www.91在线| 欧美激情一区二区三区久久久| 色综合亚洲图丝熟| 国产欧美精品一区二区三区-老狼 国产欧美精品一区二区三区介绍 国产欧美精品一区二区 | 视频精品导航| 91传媒在线免费观看| 日韩一级电影| 二级片在线观看| 国产毛片一区| 在线免费看污网站| 91婷婷韩国欧美一区二区| 蜜桃av免费观看| 亚洲成av人片在线观看无码| 最新在线中文字幕| 亚洲成人亚洲激情| 欧美a免费在线| 98视频在线噜噜噜国产| 成人51免费| 日本午夜精品一区二区| 亚洲天堂男人| 亚洲天堂国产视频| 久久男人中文字幕资源站| 全程偷拍露脸中年夫妇| 欧美日韩一区精品| 欧美一区二区三区激情| 精品国产拍在线观看| 东京一区二区| 国内精品二区| 欧美天堂亚洲电影院在线观看| 天天碰免费视频| av亚洲精华国产精华精| 欧美日韩精品一区二区三区视频播放| 在线亚洲一区二区| 少妇一区二区三区四区| 久久伊人精品天天| 欧美91在线|欧美| 欧美日韩喷水| 中日韩男男gay无套| 欧美老女人bb| 亚洲欧美国产三级| 国产精品无码天天爽视频| 国产一区二区日韩| 不卡av播放| 久久涩涩网站| 亚洲欧洲一区二区天堂久久| 手机在线免费毛片| 亚洲婷婷综合久久一本伊一区| 在线观看免费中文字幕| 亚洲欧洲在线视频| 成人免费直播| 欧美极品一区二区| 亚洲在线网站| 美女脱光内衣内裤| 欧美午夜无遮挡| 免费在线国产| 日本中文字幕不卡免费| 日韩三级毛片| 国产xxxxx视频| 国产三级一区二区三区| 中文字幕精品无| 国产亚洲精品一区二区| 欧美成人app| 中文精品视频一区二区在线观看| 美女网站在线免费欧美精品| 波多野结衣家庭教师在线观看| 精品视频123区在线观看| www.中文字幕久久久| 国产噜噜噜噜噜久久久久久久久| 日韩一区二区在线| 五月六月丁香婷婷| 亚洲精品第1页| 国产77777| 4388成人网| 欧美日韩高清| av亚洲天堂网| 亚洲色图制服诱惑| 性一交一乱一精一晶| 久久久久久久久久久久久久久久久久av | 蜜桃传媒一区二区亚洲av| 精品欧美aⅴ在线网站| 四虎电影院在线观看| 国产成+人+综合+亚洲欧洲| 精品国产一区二区三区久久久蜜臀| 欧美亚洲日本在线观看| 亚洲国产精品成人久久综合一区| 中文字幕乱码人妻无码久久| 久久精品91久久香蕉加勒比| 日韩欧洲国产| 国产无套内射久久久国产| 国产欧美视频在线观看| 97人妻精品一区二区三区动漫| 欧美成人精品一区| 亚洲人成网www| 久久久久久久久久久久久久久国产| 亚洲黄网站在线观看| 天堂√在线中文官网在线| 国产成人综合久久| 国产精品久久| 无码人妻aⅴ一区二区三区69岛| 欧美精品v国产精品v日韩精品| 国产www视频在线观看| 日本不卡一区二区三区视频| 精品中文字幕一区二区| 国产在线视频第一页| 亚洲香蕉伊综合在人在线视看| 精品三级国产| 蜜臀av午夜一区二区三区| 综合自拍亚洲综合图不卡区| 国精产品乱码一区一区三区四区| 国产福利精品av综合导导航| 你懂的网址国产 欧美| 久久精品国产亚洲AV熟女| 欧美一区2区视频在线观看| 在线看片福利| www.avtt|