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

SpringBoot 實戰:掃碼登錄全流程解析,輕松搞定多端免密認證!

開發 前端
掃碼登錄是現代應用中一種常見且便捷的登錄方式。本篇文章將基于Spring Boot實現掃碼登錄的完整流程,涵蓋二維碼生成、掃碼確認、登錄狀態管理等關鍵功能,前后端結合示例助你快速上手。

掃碼登錄是現代應用中一種常見且便捷的登錄方式。本篇文章將基于Spring Boot實現掃碼登錄的完整流程,涵蓋二維碼生成、掃碼確認、登錄狀態管理等關鍵功能,前后端結合示例助你快速上手。

目錄

  1. 項目結構與依賴配置
  2. 核心實體類設計
  3. 二維碼控制器 QRCodeController
  4. 二維碼服務 QRCodeService
  5. 用戶服務 UserService
  6. 登錄控制器 LoginController
  7. 手機端掃碼確認頁面示例
  8. PC端二維碼展示與輪詢思路(簡述)

項目結構與依賴配置

com.icoderoad
├── controller
│   ├── QRCodeController.java
│   └── LoginController.java
├── model
│   ├── QRCodeStatus.java
│   └── UserInfo.java
├── service
│   ├── QRCodeService.java
│   └── UserService.java
└── resources
    ├── templates
    │   └── scan.html   (手機掃碼確認頁面)
    └── application.yml

pom.xml中需包含:

<dependencies>
    <!-- Spring Boot Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- Lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <scope>provided</scope>
    </dependency>
    <!-- ZXing二維碼生成庫 -->
    <dependency>
        <groupId>com.google.zxing</groupId>
        <artifactId>core</artifactId>
        <version>3.5.1</version>
    </dependency>
    <dependency>
        <groupId>com.google.zxing</groupId>
        <artifactId>javase</artifactId>
        <version>3.5.1</version>
    </dependency>
</dependencies>

核心實體類設計

QRCodeStatus.java

package com.icoderoad.model;


import lombok.Data;


@Data
public class QRCodeStatus {
    public enum Status {
        NEW,        // 新生成,未掃描
        SCANNED,    // 已掃描
        CONFIRMED,  // 確認登錄
        CANCELLED   // 已取消
    }


    private String qrCodeId;
    private Status status;
    private UserInfo userInfo;  // 登錄確認后綁定用戶信息
}

UserInfo.java

package com.icoderoad.model;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;


@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserInfo {
    private String userId;
    private String username;
}

 二維碼控制器QRCodeController.java

package com.icoderoad.controller;


import com.icoderoad.model.QRCodeStatus;
import com.icoderoad.model.UserInfo;
import com.icoderoad.service.QRCodeService;
import com.icoderoad.service.UserService;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;


import javax.servlet.http.HttpServletRequest;
import java.util.Map;


@Slf4j
@RestController
@RequestMapping("/api/qrcode")
public class QRCodeController {


    @Autowired
    private QRCodeService qrCodeService;


    @Autowired
    private UserService userService;


    /**
     * 生成二維碼
     */
    @GetMapping("/generate")
    public ResponseEntity<QRCodeStatus> generateQRCode() {
        QRCodeStatus qrCodeStatus = qrCodeService.generateQRCode();
        log.info("Generated QR code: {}", qrCodeStatus.getQrCodeId());
        return ResponseEntity.ok(qrCodeStatus);
    }


    /**
     * 獲取二維碼圖片
     */
    @GetMapping(value = "/image/{qrCodeId}", produces = MediaType.IMAGE_PNG_VALUE)
    public ResponseEntity<byte[]> getQRCodeImage(@PathVariable String qrCodeId, HttpServletRequest request) {
        String baseUrl = request.getScheme() + "://" + request.getServerName();
        if (request.getServerPort() != 80 && request.getServerPort() != 443) {
            baseUrl += ":" + request.getServerPort();
        }


        byte[] qrCodeImage = qrCodeService.generateQRCodeImage(qrCodeId, baseUrl);
        if (qrCodeImage != null) {
            return ResponseEntity.ok()
                    .contentType(MediaType.IMAGE_PNG)
                    .body(qrCodeImage);
        } else {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
        }
    }


    /**
     * 掃描二維碼
     */
    @PostMapping("/scan")
    public ResponseEntity<String> scanQRCode(@RequestBody Map<String, String> request) {
        String qrCodeId = request.get("qrCodeId");
        if (qrCodeId == null) {
            return ResponseEntity.badRequest().body("QR code ID is required");
        }


        boolean updated = qrCodeService.updateQRCodeStatus(qrCodeId, QRCodeStatus.Status.SCANNED);
        if (!updated) {
            return ResponseEntity.badRequest().body("Invalid QR code");
        }


        log.info("QR code scanned: {}", qrCodeId);
        return ResponseEntity.ok("Scanned successfully");
    }


    /**
     * 確認登錄
     */
    @PostMapping("/confirm")
    public ResponseEntity<String> confirmLogin(@RequestBody ConfirmLoginRequest request) {
        if (request.getQrCodeId() == null || request.getUserId() == null) {
            return ResponseEntity.badRequest().body("QR code ID and user ID are required");
        }


        UserInfo userInfo = userService.login(request.getUserId());
        if (userInfo == null) {
            return ResponseEntity.badRequest().body("User not found");
        }


        boolean confirmed = qrCodeService.confirmLogin(request.getQrCodeId(), userInfo);
        if (!confirmed) {
            return ResponseEntity.badRequest().body("Invalid QR code or status");
        }


        log.info("Login confirmed: {}, user: {}", request.getQrCodeId(), request.getUserId());
        return ResponseEntity.ok("Login confirmed successfully");
    }


    /**
     * 取消登錄
     */
    @PostMapping("/cancel")
    public ResponseEntity<String> cancelLogin(@RequestBody Map<String, String> request) {
        String qrCodeId = request.get("qrCodeId");
        if (qrCodeId == null) {
            return ResponseEntity.badRequest().body("QR code ID is required");
        }


        boolean cancelled = qrCodeService.cancelLogin(qrCodeId);
        if (!cancelled) {
            return ResponseEntity.badRequest().body("Invalid QR code");
        }


        log.info("Login cancelled: {}", qrCodeId);
        return ResponseEntity.ok("Login cancelled successfully");
    }


    /**
     * 獲取二維碼狀態
     */
    @GetMapping("/status/{qrCodeId}")
    public ResponseEntity<QRCodeStatus> getQRCodeStatus(@PathVariable String qrCodeId) {
        QRCodeStatus qrCodeStatus = qrCodeService.getQRCodeStatus(qrCodeId);
        if (qrCodeStatus == null) {
            return ResponseEntity.badRequest().body(null);
        }


        return ResponseEntity.ok(qrCodeStatus);
    }


    @Data
    public static class ConfirmLoginRequest {
        private String qrCodeId;
        private String userId;
    }
}

二維碼服務 QRCodeService.java

package com.icoderoad.service;


import com.icoderoad.model.QRCodeStatus;
import com.icoderoad.model.UserInfo;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import org.springframework.stereotype.Service;


import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;


@Service
public class QRCodeService {


    private final Map<String, QRCodeStatus> qrCodeStatusMap = new ConcurrentHashMap<>();


    /**
     * 生成新的二維碼ID和狀態
     */
    public QRCodeStatus generateQRCode() {
        String qrCodeId = UUID.randomUUID().toString();
        QRCodeStatus status = new QRCodeStatus();
        status.setQrCodeId(qrCodeId);
        status.setStatus(QRCodeStatus.Status.NEW);
        qrCodeStatusMap.put(qrCodeId, status);
        return status;
    }


    /**
     * 根據二維碼ID生成二維碼圖片字節
     */
    public byte[] generateQRCodeImage(String qrCodeId, String baseUrl) {
        String qrContent = baseUrl + "/mobile/scan?qrCodeId=" + qrCodeId;
        QRCodeWriter writer = new QRCodeWriter();
        try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
            BitMatrix bitMatrix = writer.encode(qrContent, BarcodeFormat.QR_CODE, 250, 250);
            MatrixToImageWriter.writeToStream(bitMatrix, "PNG", baos);
            return baos.toByteArray();
        } catch (WriterException | IOException e) {
            e.printStackTrace();
            return null;
        }
    }


    /**
     * 更新二維碼狀態
     */
    public boolean updateQRCodeStatus(String qrCodeId, QRCodeStatus.Status status) {
        QRCodeStatus qrCodeStatus = qrCodeStatusMap.get(qrCodeId);
        if (qrCodeStatus == null) return false;
        qrCodeStatus.setStatus(status);
        return true;
    }


    /**
     * 確認登錄,綁定用戶信息
     */
    public boolean confirmLogin(String qrCodeId, UserInfo userInfo) {
        QRCodeStatus qrCodeStatus = qrCodeStatusMap.get(qrCodeId);
        if (qrCodeStatus == null || qrCodeStatus.getStatus() != QRCodeStatus.Status.SCANNED) return false;
        qrCodeStatus.setStatus(QRCodeStatus.Status.CONFIRMED);
        qrCodeStatus.setUserInfo(userInfo);
        return true;
    }


    /**
     * 取消登錄
     */
    public boolean cancelLogin(String qrCodeId) {
        QRCodeStatus qrCodeStatus = qrCodeStatusMap.get(qrCodeId);
        if (qrCodeStatus == null) return false;
        qrCodeStatus.setStatus(QRCodeStatus.Status.CANCELLED);
        return true;
    }


    /**
     * 獲取二維碼狀態
     */
    public QRCodeStatus getQRCodeStatus(String qrCodeId) {
        return qrCodeStatusMap.get(qrCodeId);
    }
}

用戶服務 UserService.java

package com.icoderoad.service;


import com.icoderoad.model.UserInfo;
import org.springframework.stereotype.Service;


import java.util.HashMap;
import java.util.Map;


@Service
public class UserService {


    private final Map<String, UserInfo> userMap = new HashMap<>();


    public UserService() {
        userMap.put("user1", new UserInfo("user1", "Alice"));
        userMap.put("user2", new UserInfo("user2", "Bob"));
    }


    /**
     * 模擬登錄:根據用戶ID獲取用戶信息
     */
    public UserInfo login(String userId) {
        return userMap.get(userId);
    }


    /**
     * 驗證token,簡易模擬,token即為userId
     */
    public UserInfo validateToken(String token) {
        return userMap.get(token);
    }


    /**
     * 獲取所有測試用戶
     */
    public Map<String, UserInfo> getAllUsers() {
        return userMap;
    }
}

登錄控制器 LoginController.java

package com.icoderoad.controller;


import com.icoderoad.model.UserInfo;
import com.icoderoad.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;


@Slf4j
@RestController
@RequestMapping("/api/login")
public class LoginController {


    @Autowired
    private UserService userService;


    /**
     * 模擬用戶登錄,返回token(這里直接用userId代替token)
     */
    @PostMapping
    public String login(@RequestParam String userId) {
        UserInfo user = userService.login(userId);
        if (user == null) {
            return "登錄失敗,用戶不存在";
        }
        // 這里可改為JWT等token
        return user.getUserId();
    }
}

手機端掃碼確認頁面示例(scan.html)

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8" />
    <title>掃碼確認登錄</title>
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <link  rel="stylesheet" />
    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
</head>
<body class="p-3">


<h3>掃碼確認登錄</h3>


<div id="qrCodeId" class="mb-3"></div>


<div class="mb-3">
    <label for="userSelect" class="form-label">選擇用戶</label>
    <select id="userSelect" class="form-select"></select>
</div>


<button id="confirmBtn" class="btn btn-success me-2">確認登錄</button>
<button id="cancelBtn" class="btn btn-danger">取消登錄</button>


<div id="msg" class="mt-3"></div>


<script>
    const urlParams = new URLSearchParams(window.location.search);
    const qrCodeId = urlParams.get('qrCodeId');


    document.getElementById('qrCodeId').innerText = "二維碼ID:" + qrCodeId;


    const userSelect = document.getElementById('userSelect');
    const msgDiv = document.getElementById('msg');


    // 模擬請求獲取所有用戶
    const users = {
        "user1": "Alice",
        "user2": "Bob"
    };


    for (const [id, name] of Object.entries(users)) {
        const option = document.createElement('option');
        option.value = id;
        option.textContent = name;
        userSelect.appendChild(option);
    }


    document.getElementById('confirmBtn').onclick = () => {
        const userId = userSelect.value;
        axios.post('/api/qrcode/confirm', {qrCodeId, userId})
            .then(res => {
                msgDiv.innerHTML = `<div class="alert alert-success">${res.data}</div>`;
            })
            .catch(err => {
                msgDiv.innerHTML = `<div class="alert alert-danger">確認失敗: ${err.response.data}</div>`;
            });
    };


    document.getElementById('cancelBtn').onclick = () => {
        axios.post('/api/qrcode/cancel', {qrCodeId})
            .then(res => {
                msgDiv.innerHTML = `<div class="alert alert-warning">${res.data}</div>`;
            })
            .catch(err => {
                msgDiv.innerHTML = `<div class="alert alert-danger">取消失敗: ${err.response.data}</div>`;
            });
    };
</script>


</body>
</html>

訪問該頁面示例:http://localhost:8080/mobile/scan?qrCodeId=xxx-xxx-xxx

PC端二維碼展示與輪詢思路簡述

  • PC端訪問 /api/qrcode/generate 生成二維碼ID
  • PC端通過 /api/qrcode/image/{qrCodeId} 獲取二維碼圖片并展示
  • 手機端掃碼后訪問 /api/qrcode/scan 告訴服務器已掃描
  • 手機端確認登錄后訪問 /api/qrcode/confirm 完成登錄綁定用戶信息
  • PC端通過輪詢 /api/qrcode/status/{qrCodeId} 獲取二維碼登錄狀態變化,及時反饋用戶登錄結果

總結

本文詳細介紹了基于Spring Boot實現掃碼登錄的完整流程,包括二維碼生成、掃碼確認、狀態管理等核心邏輯。示例代碼清晰,服務層職責分明,便于擴展和維護.

責任編輯:武曉燕 來源: 路條編程
相關推薦

2025-06-09 07:11:56

2023-07-27 08:44:49

2024-10-28 09:38:15

2025-04-25 08:30:00

前端后端用戶登錄

2021-01-06 10:09:05

Spring Boothttps sslhttps

2022-01-14 14:50:14

SpringBootymlJava

2022-01-13 17:24:04

SpringBootYml監聽器

2020-03-08 15:39:41

微信掃碼登陸二維碼

2025-06-26 02:11:00

2024-08-12 16:28:37

LinuxSSH密鑰

2025-07-02 08:00:00

防抖SpringBoot開發

2021-10-26 10:29:45

掃碼登錄功能

2025-01-02 10:10:51

2023-03-09 08:12:08

免登錄實Python腳本

2020-01-30 10:00:44

Linux公鑰私鑰

2025-05-28 08:35:00

Nacos服務訂閱流程開發

2025-03-11 08:34:22

2022-06-10 06:55:21

JustAuthSpring
點贊
收藏

51CTO技術棧公眾號

性活交片大全免费看| 色之综合天天综合色天天棕色| 26uuu成人网| 这里视频有精品| 亚洲五码中文字幕| 欧美一区二区三区成人久久片| 国产精品第6页| 一区二区三区四区电影| 亚洲国产成人精品女人久久久 | 国产精品一区专区欧美日韩| 狂野欧美性猛交| 亚洲综合影院| 色94色欧美sute亚洲线路二| 正在播放一区二区三区| 成人免费视频国产免费麻豆| 日韩电影网1区2区| 久久久久久久爱| 大胸美女被爆操| 欧美aaaaa级| 欧美日韩国产成人在线91| 黄页网站在线观看视频| 成人免费视频| 成人丝袜视频网| 国产啪精品视频网站| 日韩高清免费av| 色喇叭免费久久综合网| 日韩电影中文字幕在线| 日日干日日操日日射| 色黄视频在线观看| 一区二区三区日韩在线观看| 日韩国产一区久久| 少妇喷水在线观看| 国产一区二区三区美女| 国产精品国产自产拍高清av水多| 久久婷婷综合国产| 国产国产精品| 夜夜嗨av一区二区三区免费区| 催眠调教后宫乱淫校园| 国产精品亚洲欧美一级在线 | 黄页网站大全在线观看| 麻豆av在线免费看| 中文字幕不卡的av| 欧美男人的天堂| 亚洲 欧美 激情 小说 另类| 国产精品一区二区你懂的| 国产精品视频区1| 久久国产乱子伦精品| 久久大逼视频| 国内精久久久久久久久久人| 午夜写真片福利电影网| 欧美韩国日本在线观看| 在线播放日韩精品| 日本免费www| 极品美女一区二区三区| 亚洲免费中文字幕| 波多野结衣福利| 亚洲+变态+欧美+另类+精品| 欧美精品一区二区三区在线播放 | 亚洲成人a级片| 欧美无砖专区一中文字| 亚洲性生活网站| 秋霞国产精品| 欧美日韩免费一区二区三区视频| 免费男同深夜夜行网站| 性欧美hd调教| 欧美在线视频不卡| 少妇一级淫免费放| 色综合视频一区二区三区44| 欧美男男青年gay1069videost| 人人干人人干人人| 91成人app| 欧美一区二区播放| 中文字幕99页| 青青草这里只有精品| 日韩激情在线视频| 国产色视频一区二区三区qq号| 婷婷综合福利| 亚洲跨种族黑人xxx| 成人免费网站黄| 精品国产91久久久久久浪潮蜜月| 中文字幕亚洲无线码在线一区| 正在播放国产对白害羞| 我不卡伦不卡影院| 欧美激情一区二区三区成人 | 日韩欧美在线播放| xxx国产在线观看| 日本精品一区二区三区在线观看视频| 日韩欧美国产电影| 在线免费观看日韩av| 精品国产123区| 欧美成人免费小视频| 激情五月色婷婷| 日韩电影在线一区二区三区| 国产热re99久久6国产精品| 国产哺乳奶水91在线播放| 成人精品鲁一区一区二区| 欧美理论一区二区| 成人无遮挡免费网站视频在线观看| 亚洲一级不卡视频| 97公开免费视频| 日韩视频一区二区三区四区| 日韩国产一区三区| 国产精品久久久精品四季影院| 亚洲日本激情| 国产主播精品在线| 无码精品人妻一区二区| 国产精品国产精品国产专区不片| www.激情网| 成人网ww555视频免费看| 欧美精品1区2区3区| 中文字幕av观看| 99热国内精品| 日韩**中文字幕毛片| av手机免费看| 欧美激情一区二区在线| www插插插无码视频网站| av在线日韩| 亚洲国产日韩精品在线| 91大神福利视频| 中文久久精品| 97自拍视频| 毛片激情在线观看| 欧美日韩免费一区| 日本少妇一级片| 日韩综合一区| 国产激情综合五月久久| 六月婷婷综合网| 亚洲你懂的在线视频| 欧美日韩亚洲自拍| 台湾色综合娱乐中文网| 欧美精品福利在线| 国产视频手机在线| 中文字幕在线不卡| 91热这里只有精品| 亚洲免费福利一区| 国内精品免费午夜毛片| 97人妻一区二区精品免费视频 | 麻豆91蜜桃| 成人超碰在线| 日韩视频一区二区三区在线播放 | 国产精品一区二区99| 久久男人av资源网站| 国产乱淫av片免费| ...xxx性欧美| 日本高清一区二区视频| 日韩在线第七页| 国产精品久久久| 你懂的在线观看视频网站| 红桃av永久久久| 91精品小视频| 久久成人国产| 手机看片福利永久国产日韩| 日韩中文影院| 一本色道久久综合狠狠躁篇的优点| 羞羞影院体验区| 91美女在线视频| 麻豆av免费在线| 九九热线有精品视频99| 国产成人在线播放| 91精品国产综合久久久久久豆腐| 欧美撒尿777hd撒尿| 精品国产国产综合精品| 国产精品自拍网站| 亚洲国产精品无码观看久久| 韩国女主播一区二区三区| 韩国v欧美v日本v亚洲| 日韩精品123| 在线观看免费一区| 国产色无码精品视频国产| 国产高清在线观看免费不卡| 久草免费福利在线| 亚洲人成网77777色在线播放| 日韩av电影手机在线| 91在线高清| 欧美一区二区三区公司| 久久精品欧美一区二区| 99免费精品视频| 无码人妻丰满熟妇区五十路百度| 亚洲丝袜啪啪| 国产精品国语对白| 在线播放麻豆| 精品剧情v国产在线观看在线| 国产亚洲小视频| 2022国产精品视频| 亚洲黄色a v| 欧美日本二区| 久久久久成人精品免费播放动漫| 亚洲欧美一区二区三区| 国产一区二区三区久久精品 | 秋霞成人午夜伦在线观看| 深夜福利成人| 亚洲影视资源| 欧美精品电影在线| 亚洲欧美黄色片| 日本韩国一区二区三区| 老司机成人免费视频| 成人性生交大片免费看视频在线| 国产黄视频在线| 93在线视频精品免费观看| 97久草视频| 超碰一区二区| 精品国产一区二区三区久久久| 免费激情视频网站| 色婷婷精品久久二区二区蜜臀av| 伊人久久久久久久久久久久久久| 成人动漫在线一区| 少妇高清精品毛片在线视频| 在线成人直播| 久久久99国产精品免费| 欧美亚洲综合视频| 97国产在线视频| 国产三区在线观看| 亚洲免费人成在线视频观看| 一区二区日韩视频| 午夜电影网一区| 男的操女的网站| www精品美女久久久tv| 午夜剧场高清版免费观看| 亚洲三级电影在线观看| 日韩av高清在线播放| 在线视频亚洲欧美中文| 国产精品免费在线免费 | 欧美亚洲视频在线看网址| 无遮挡的视频在线观看| 亚洲精品720p| 国产麻豆免费观看| 欧美性极品xxxx娇小| 日韩av毛片在线观看| www日韩大片| 久久久久中文字幕亚洲精品| 精品一区二区三区在线播放视频| 91成人在线观看喷潮教学| 亚洲成人二区| 亚洲欧美99| 国产成人精品福利| 国产富婆一区二区三区| 96sao精品免费视频观看| 国产97在线观看| 免费v片在线观看| 免费97视频在线精品国自产拍| 成人精品福利| 日韩精品在线观看网站| h狠狠躁死你h高h| 91精品在线免费| 伊人免费在线观看高清版| 色一区在线观看| 影音先锋亚洲天堂| 亚洲地区一二三色| 在线免费观看亚洲视频| 1024成人网色www| 国产精品无码无卡无需播放器| 26uuu久久天堂性欧美| 久久久久亚洲av片无码v| 精品在线亚洲视频| 色乱码一区二区三区在线| 视频一区国产视频| 国产免费毛卡片| 亚洲黄色大片| 国产精品久久中文字幕| 国产欧美三级| 两根大肉大捧一进一出好爽视频| 在线成人www免费观看视频| 黄色三级中文字幕| 9色国产精品| 日韩精品―中文字幕| 99国产精品久久久久久久成人热| 妞干网在线观看视频| 中国女人久久久| 国产高清精品在线观看| 亚洲免费大片| 中文字幕国产传媒| 久久精品国产精品亚洲精品| 亚洲一区精品视频在线观看| 日韩影院精彩在线| 日本美女视频一区| 国产另类ts人妖一区二区| 潘金莲一级淫片aaaaaaa| 99麻豆久久久国产精品免费优播| 成年人的黄色片| wwww国产精品欧美| 亚洲av熟女国产一区二区性色 | 激情无码人妻又粗又大| 亚洲日本欧美天堂| 久草网站在线观看| 精品欧美aⅴ在线网站| 在线精品免费视| 欧美在线观看一二区| 国产99视频在线| 日韩成人在线播放| 国产毛片在线看| 色综合久久天天综线观看| aa国产成人| 国产精品久久久av久久久| 国产精品久久久久久久久免费高清| 91亚洲精品久久久| 极品国产人妖chinesets亚洲人妖| 久久综合毛片| 欧美1区2区| 免费黄色福利视频| 极品少妇一区二区三区精品视频 | gogo大胆日本视频一区| xxx在线播放| 椎名由奈av一区二区三区| 精品国产xxx| 欧美精品乱码久久久久久按摩 | 涩涩av在线| 国产精品成人免费电影| 亚洲不卡在线| 日韩精品一区二区三区四区五区| 亚洲区综合中文字幕日日| 国产精品又粗又长| 日本视频中文字幕一区二区三区| 99精品一区二区三区无码吞精| 国产日韩欧美精品综合| 久草免费新视频| 欧美日韩综合一区| 你懂得在线网址| 欧美国产中文字幕| av在线不卡精品| 久久99精品久久久久久久久久 | 伊人久久综合一区二区| 国产精品丝袜高跟| 国产99久久久国产精品成人免费 | 日本黄色录像片| 国产精品久久久久久久久免费桃花 | 成人开心激情| 国产一区二区三区四区hd| 欧美精品不卡| www.这里只有精品| 久久一二三国产| 国产极品美女高潮无套嗷嗷叫酒店 | 日韩亚洲不卡在线| 亚洲区国产区| 在线观看你懂的视频| 亚洲欧洲综合另类在线| 国产三级理论片| 亚洲欧美中文日韩在线v日本| gogo在线高清视频| 亚洲japanese制服美女| 成人毛片免费看| 无码aⅴ精品一区二区三区浪潮 | 51国产成人精品午夜福中文下载| 大胆日韩av| 成人亚洲视频在线观看| 91在线观看污| 日韩精品在线免费看| 日韩免费性生活视频播放| av免费网站在线观看| 国产有码在线一区二区视频| 国产精品一区二区99| 免费看日本毛片| 久久综合色一综合色88| 日本一二三区不卡| 亚洲国产成人精品久久| 天堂√8在线中文| 久久99久久精品国产| 亚洲激情婷婷| 精品人妻一区二区三区香蕉| 欧美日韩国产精品一区二区不卡中文| 亚洲第一页视频| 91精品国产91久久久久| 欧美美女在线直播| 精品国产一二三四区| 国产偷国产偷亚洲高清人白洁| 久久久精品福利| 亚洲跨种族黑人xxx| av成人在线观看| 夜夜春亚洲嫩草影视日日摸夜夜添夜| 日本少妇一区二区| 精品一区二区三区蜜桃在线| 欧美在线视频全部完| 日本成人在线播放| 国产欧美一区二区三区久久| 一本到12不卡视频在线dvd| 日本黄色www| 亚洲蜜臀av乱码久久精品| 日本xxxxwww| 69视频在线免费观看| 琪琪久久久久日韩精品| 在线观看av网页| 亚洲青青青在线视频| 国产精品人人爽| 97激碰免费视频| 蜜桃国内精品久久久久软件9| 激情网站五月天| 亚洲美女一区二区三区| 亚洲精品一区二区三区蜜桃| 久久久久久网址| 欧美一区电影| 日本女人黄色片| 日韩欧美精品网址| 生活片a∨在线观看| 99在线热播| 人禽交欧美网站| 麻豆亚洲av熟女国产一区二| 亚洲黄色在线观看| 亚洲成人1区| 每日在线更新av| 国产精品久久久久精k8| 日本成人一区|