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

18禁裸男晨勃露j毛免费观看 | 午夜国产福利一区二区| 欧美精品韩国精品| 色综合视频一区二区三区日韩| 国产一区二区在线免费观看| 欧美高跟鞋交xxxxhd| 在线黄色免费网站| 国产精品原创视频| 亚洲一区二区精品久久av| 免费看成人午夜电影| 国产裸体永久免费无遮挡| 夜夜爽av福利精品导航| 日韩中文字幕视频在线观看| 在线免费看黄色片| 日本精品久久| 欧美性感美女h网站在线观看免费| 亚洲精品一区国产精品| 欧美 日韩 国产 成人 在线| 肉色丝袜一区二区| 欧美激情综合亚洲一二区| 日本一卡二卡在线播放| 美女午夜精品| 91精品国产欧美一区二区18| 亚洲精品乱码久久久久久自慰| 亚洲伦理在线观看| 欧美aaaaaa午夜精品| 韩国精品美女www爽爽爽视频| 色噜噜噜噜噜噜| 老司机精品视频在线播放| 欧美一区二区三区日韩视频| 18岁视频在线观看| 超级白嫩亚洲国产第一| 亚洲精品第一国产综合野| 国产精品日韩在线| 国产一级一级片| 综合久久99| 中日韩美女免费视频网址在线观看 | 日韩欧美电影在线| 美女在线视频一区二区| 超碰国产一区| 香蕉乱码成人久久天堂爱免费| 国产av不卡一区二区| shkd中文字幕久久在线观看| 久久久久.com| 性色av一区二区三区| 麻豆changesxxx国产| 91久久国产| 色老头一区二区三区在线观看| 欧美亚一区二区三区| 久久365资源| 亚洲第一页中文字幕| 中文字幕久久久久久久| 欧美国产中文高清| 欧美一区二区三区的| 日韩欧美中文在线视频| 日本伊人久久| 天天综合日日夜夜精品| 青青青在线视频播放| 免费黄色在线视频网站| a在线播放不卡| 精品欧美国产| 天堂а在线中文在线无限看推荐| 本田岬高潮一区二区三区| 鬼打鬼之黄金道士1992林正英| www.黄色小说.com| 午夜在线观看免费一区| 欧洲日韩成人av| 天堂网视频在线| 日韩精品一卡二卡三卡四卡无卡| 国产精品国产三级国产aⅴ浪潮 | 欧美日韩激情一区二区三区| xxxx一级片| 亚洲综合伊人| 精品久久人人做人人爰| 一本加勒比波多野结衣| 成人av色网站| 欧美军同video69gay| 国产美女主播在线| 欧美a级在线观看| 一本久久精品一区二区| 国产日韩欧美久久| 日韩在线观看一区二区三区| 亚洲国产古装精品网站| 国产黄色网址在线观看| 欧美freesextv| 欧美激情精品久久久久| 日本免费在线观看视频| 久久成人免费网| 国产精品日韩欧美一区二区| 你懂的免费在线观看视频网站| 国产精品视频一二| 欧美狂野激情性xxxx在线观| 91精彩在线视频| 亚洲精品国产成人久久av盗摄 | 羞羞的视频在线观看| 精品久久久久久中文字幕| 日本中文字幕高清| 国产suv精品一区| 最近2019免费中文字幕视频三| 欧美日韩在线国产| 久久天堂精品| 99影视tv| 香蕉视频在线看| 337p粉嫩大胆噜噜噜噜噜91av| 日韩免费av电影| 久操av在线| 欧美日韩久久一区二区| 中文字幕乱码一区| 香蕉久久网站| 日韩美女主播视频| 亚洲乱码在线观看| 国产另类ts人妖一区二区| 久久国产精品一区二区三区| 欧美三级黄网| 日韩欧美高清在线视频| 男人女人拔萝卜视频| 欧美日韩激情在线一区二区三区| 欧美激情在线视频二区| 国产口爆吞精一区二区| 久久久亚洲高清| 久久这里只有精品23| 色综合视频一区二区三区44| 亚洲视频国产视频| 日本黄色片视频| 亚洲大片在线| 亚洲xxxxx| 亚洲成人影院麻豆| 欧美中文字幕一区| 久久久无码人妻精品一区| 黄色工厂这里只有精品| 91中文精品字幕在线视频| 成人影视在线播放| 色拍拍在线精品视频8848| 看全色黄大色黄女片18| 黄色欧美成人| 国产日韩欧美黄色| 天堂资源在线中文| 欧美性大战久久| 中文字幕av久久爽一区| 丝袜美腿亚洲色图| 日本高清一区| 校园春色亚洲色图| 欧美群妇大交群中文字幕| 免费看污片的网站| 日韩av免费大片| 日韩av网站免费在线| 一级做a爰片久久毛片美女图片| 国产精品自拍视频一区| 国产99久久久精品| 国产 高清 精品 在线 a| 精品51国产黑色丝袜高跟鞋| 欧美午夜精品一区二区蜜桃 | 在线观看视频一区二区三区| 久久久精品久久久| 亚洲天天综合网| 国产精品的网站| 超碰人人草人人| 国产午夜久久av| xvideos亚洲人网站| 91久久国语露脸精品国产高跟| 日本一区二区三区国色天香 | jizz久久久久久| 一区二区三区四区视频| 亚洲一区二区人妻| 亚洲品质自拍视频网站| 蜜臀aⅴ国产精品久久久国产老师 性活交片大全免费看 | 亚洲精品视频免费观看| 乳色吐息在线观看| 亚洲精品女人| 欧美精品亚洲| 成人影院在线免费观看| 久久亚洲精品网站| 日韩美女黄色片| 久久综合色综合88| 婷婷激情四射五月天| 亚洲激情五月| 国产视色精品亚洲一区二区| 韩国成人动漫| 日韩最新中文字幕电影免费看| www.国产视频| 日韩欧美国产网站| 我要看一级黄色录像| 成人午夜电影久久影院| 亚洲精品中文字幕无码蜜桃| 999国产精品视频| 成人xxxxx色| 国产日韩另类视频一区| 欧美成人免费小视频| 国内自拍视频在线播放| 日本一区二区三区视频视频| 手机在线播放av| 亚洲女同同性videoxma| 黄色www在线观看| 欧美日韩一区二区三区四区不卡 | 97色成人综合网站| 热久久视久久精品18亚洲精品| 日本在线视频站| 亚洲国产精品小视频| 亚洲ⅴ国产v天堂a无码二区| 韩日av一区二区| 欧美 日韩 国产在线观看| 色小子综合网| 久久99精品久久久久久久青青日本| 久久xxx视频| 性欧美视频videos6一9| 福利在线观看| 亚洲国产私拍精品国模在线观看| 五月婷婷丁香在线| 亚洲成av人片一区二区| 三级黄色免费观看| 久久久久久久久久久99999| 绯色av蜜臀vs少妇| 青青青伊人色综合久久| 久久亚洲中文字幕无码| 亚洲综合小说| 亚洲精品美女久久7777777| 免费福利视频一区| 亚洲自拍偷拍视频| 素人啪啪色综合| 欧美中文在线视频| 好久没做在线观看| 久久人人爽人人爽人人片亚洲| 精品视频一二区| 日韩av在线导航| 日韩精品手机在线| 亚洲精品免费在线观看| 精品久久久久久中文字幕人妻最新| 国产成人在线看| 伊人五月天婷婷| 麻豆精品一区二区| 黑人粗进入欧美aaaaa| 一区二区三区高清视频在线观看| 国产91在线亚洲| 亚洲色图插插| 欧美xxxx吸乳| 偷拍欧美精品| 麻豆中文字幕在线观看| 久久综合国产| 91香蕉视频网址| 久久免费av| 亚洲欧洲一区二区| 日产精品一区二区| 一区高清视频| 欧美顶级大胆免费视频| 一区二区三区在线视频111| 欧美日韩一区二区综合| 性欧美videosex高清少妇| 欧美一二区在线观看| 日韩精品欧美在线| 日韩国产一区二区三区| 一区二区三区四区在线视频| 99久久99久久精品国产片桃花 | 中文字幕人妻一区| 成人高清免费观看| 欧美无人区码suv| 久久这里只有精品首页| 亚洲精品国产91| 国产精品乱码一区二区三区软件 | 久久久国产精品久久久| 成人精品亚洲人成在线| 成人性生活免费看| 久久久青草青青国产亚洲免观| 日韩丰满少妇无码内射| 国产精品网站在线| 国产成人av免费在线观看| 一区二区免费在线播放| 日韩欧美大片在线观看| 一本一道波多野结衣一区二区| 无码人妻精品一区二区蜜桃色欲| 在线观看视频一区二区| 91尤物国产福利在线观看| 91精品国产一区二区三区蜜臀| 朝桐光av在线一区二区三区| 亚洲精品久久久久久久久久久久 | 日韩伦理一区二区三区| 欧美午夜欧美| 99久久九九| 国产曰肥老太婆无遮挡| 首页亚洲欧美制服丝腿| 天天做天天干天天操| 成人激情动漫在线观看| 精品国产成人亚洲午夜福利| 中文字幕一区二区不卡| 日本少妇激情舌吻| 欧美亚洲国产一区二区三区va| 99久久国产免费| 亚洲精品日韩在线| 欧美jizzhd欧美| 69**夜色精品国产69乱| 麻豆tv在线| 欧美激情在线狂野欧美精品| 日韩中文视频| 9a蜜桃久久久久久免费| 国产不卡一二三区| 蜜桃网站在线观看| 天堂成人免费av电影一区| 丰满人妻一区二区三区53视频| 91在线观看下载| 人妻久久一区二区| 欧美日韩国产一区在线| 91片黄在线观看喷潮| 亚洲精品国产精品乱码不99按摩 | 欧美国产禁国产网站cc| 欧美精品一区二区成人| 在线亚洲+欧美+日本专区| 亚洲av少妇一区二区在线观看| 国产香蕉一区二区三区在线视频 | 欧美女子与性| 欧美激情按摩在线| 伊人久久大香伊蕉在人线观看热v 伊人久久大香线蕉综合影院首页 伊人久久大香 | 欧美另类z0zxhd电影| 日韩黄色影片| 欧美精品在线免费| 欧美日韩激情电影| 精品视频第一区| 午夜精品av| 亚洲免费av一区| 国产午夜精品久久久久久免费视| 69av视频在线| 欧美日韩一区 二区 三区 久久精品| 天天色棕合合合合合合合| 少妇高潮久久久久久潘金莲| 亚洲妇女成熟| 韩国成人动漫在线观看| 亚洲精品97| 2025韩国理伦片在线观看| 久久人人超碰精品| 日韩欧美亚洲视频| 欧美成人vr18sexvr| 国产黄色小视频在线| 国产精品欧美日韩久久| 网红女主播少妇精品视频| 欧美日韩不卡在线视频| 国产精品影视在线观看| 欧美a级片免费看| 欧美伊人久久大香线蕉综合69| 三级av在线| 欧美性在线视频| 色婷婷精品视频| 成人毛片一区二区| 成人av在线一区二区| 久久久夜色精品| 欧美成人一区二区三区| 亚洲精品白浆| 成人91视频| 亚洲欧洲一区| 黄色在线观看av| 色综合久久88色综合天天免费| 婷婷亚洲一区二区三区| 欧美在线性爱视频| 一个色免费成人影院| 欧美性久久久久| 久久久91精品国产一区二区精品 | 午夜欧美性电影| 日韩综合一区二区| 国产综合精品久久久久成人av| 欧美午夜电影一区| 色三级在线观看| 91丨九色丨国产在线| 欧美午夜影院| 国产女人18毛片水真多18| 午夜精品福利久久久| 国自产拍在线网站网址视频| 国产精品r级在线| 久久福利影院| 樱花草www在线| 亚洲一卡二卡三卡四卡无卡久久| 天堂在线视频免费| 日本伊人精品一区二区三区介绍 | www 久久久| 免费一级淫片aaa片毛片a级| av成人动漫在线观看| 中文字幕在线观看视频免费| 正在播放欧美视频| 亚洲伊人影院| 国产福利视频在线播放| 国产精品欧美综合在线| 精品人妻久久久久一区二区三区| 久久久久久久亚洲精品| 小嫩嫩12欧美| 国产乱码一区二区三区四区| 亚洲一区二区三区在线看| 日韩精品视频无播放器在线看| 国产日韩欧美视频| 影音先锋久久| 国产一级淫片久久久片a级| 欧美一级理论片| 美女视频在线免费| 在线免费观看成人网| av中文字幕不卡| 中文字幕人妻精品一区| 久久人人爽人人| 久久精品国产68国产精品亚洲| 欧美性生交xxxxx| 欧美系列日韩一区| www.youjizz.com在线| 一区二区三区av| 99精品一区二区| av男人天堂网| 国产极品jizzhd欧美|