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

Swagger 全量注解應用指南:從@Tag到@SecurityScheme,全面掌握API設計

人工智能
從基礎的@Tag、@Operation到高級的@SecurityScheme、@Callback,每個注解都配有清晰的代碼示例和實際應用案例。包含全局配置、多安全方案、復雜響應結構、Webhook回調等企業級場景,幫助你構建專業級的API文檔系統。

本文是Swagger注解的完整參考指南,詳細解析了6大類40+個核心注解的使用方法和實戰場景。從基礎的@Tag、@Operation到高級的@SecurityScheme、@Callback,每個注解都配有清晰的代碼示例和實際應用案例。包含全局配置、多安全方案、復雜響應結構、Webhook回調等企業級場景,幫助你構建專業級的API文檔系統。

一、注解介紹

1. API 基本信息與分組注解

這些注解用于描述整個API或對接口進行分組,通常用在控制器類上。

注解

適用范圍

屬性

說明

示例

@Tag

name

: (必填)  標簽名稱。 description:標簽描述。

用于對API操作進行邏輯分組。一個控制器可以有多個標簽。在Swagger UI中顯示為不同的分類。

@Tag(name = "用戶管理", description = "用戶的增刪改查API")

@Hidden

類、方法

隱藏

被注解的類或方法,不會出現在生成的API文檔中。

@Hiddenpublic class InternalController { ... }

2. 接口操作注解 (Operation Annotations)

這些注解用于描述具體的HTTP接口,用在控制器方法上。

注解

適用范圍

屬性

說明

示例

@Operation

方法

summary

:操作摘要。 description:詳細描述。 method:指定HTTP方法(通常不需要,由@GetMapping等隱含)。 tags:覆蓋類級別的標簽,為該操作指定新的分組。

描述一個HTTP請求操作(如一個GET或POST端點),是方法上最重要的注解。

@Operation(summary = "創建用戶", description = "根據傳入的用戶信息創建一個新用戶")

@ApiResponse

方法

responseCode

: (必填)  HTTP狀態碼,如 "200", "404"。 description:響應的描述。 content:指定響應內容(使用@Content)。

聲明一個操作可能返回的響應。通常與@Operationresponses屬性一起使用,描述各種可能的返回結果。

@ApiResponse(responseCode = "404", description = "用戶不存在")

@ApiResponses

方法

value

:一個@ApiResponse注解的數組。

當需要聲明多個響應時,用它來包裹多個@ApiResponse

@ApiResponses(value = {@ApiResponse(responseCode = "200", ...),@ApiResponse(responseCode = "400", ...)})

@Callback

方法

name

:回調名稱。 callbackUrlExpression:回調URL表達式。

描述一個回調操作,用于Webhooks等異步通知場景,使用相對較少。

(略復雜,此處不展開示例)

3. 參數注解 (Parameter Annotations)

這些注解用于描述接口的入參,可以用在方法參數上。

注解

適用范圍

屬性

說明

示例

@Parameter

參數

description

:參數描述。 required:是否必填,默認為false。 example:提供示例值。 hidden:是否隱藏該參數。 schema:指定參數的schema(使用@Schema)。

描述一個操作參數,如@PathVariable@RequestParam@RequestHeader@CookieValue等。注意:@RequestBody參數通常不用此注解,而是用@Schema

public User getUserById(@Parameter(description = "用戶ID", example = "123", required = true)@PathVariable Long id) {...}

@Parameters

方法

value

:一個@Parameter注解的數組。

當需要在方法上為多個參數添加描述時,用它來包裹多個@Parameter

@Parameters({@Parameter(name = "id", description = "ID"),@Parameter(name = "name", description = "名稱")})

@RequestHeader

參數

@Parameter屬性相同。

它是@Parameter的一個特殊化,專門用于描述請求頭參數,會在UI上被單獨分組顯示。

@RequestHeader(@Parameter(description = "認證令牌", required = true)) String authToken

4. 請求體與內容注解 (Request Body & Content)

這些注解用于描述復雜的請求或響應內容。

注解

適用范圍

屬性

說明

示例

@RequestBody

參數

description

:請求體的描述。 required:是否必填。 content:指定請求體的媒體類型和結構(使用@Content)。

專門用于描述@RequestBody參數

。提供對請求體的詳細說明。

@RequestBody(description = "用戶信息", required = true, content = @Content(schema = @Schema(implementation = User.class))) User user

@Content

@RequestBody@ApiResponsecontent屬性一起使用

schema

:指定內容的schema(使用@Schema)。 mediaType:指定媒體類型,如 "application/json"。 examples:提供多個示例(使用@ExampleObject)。

定義請求或響應體的媒體類型和結構。

content = @Content(mediaType = "application/json", schema = @Schema(implementation = User.class))

@Schema

模型類

、模型屬性、參數

description

:描述。 example:提供示例值。 requiredMode:指定是否必須(Schema.RequiredMode.REQUIRED)。 implementation:指定關聯的類(用于在@Content中)。 allowableValues:限制允許的值。

這是最重要的模型注解

。用于描述DTO(數據傳輸對象)、VO(值對象)等模型,或修飾@RequestBody/響應體的結構。

@Schema(description = "用戶實體", requiredMode = Schema.RequiredMode.REQUIRED)public class User {@Schema(description = "用戶ID", example = "1")private Long id;}

5. 安全方案注解 (Security Annotations)

用于描述API的認證和授權方式。

注解

適用范圍

屬性

說明

示例

@SecurityScheme

(配置類)

type

:安全方案類型(如SecurityScheme.Type.HTTP)。 scheme:方案(如 "bearer")。 bearerFormat:承載格式(如 "JWT")。 name:方案名稱(用于@SecurityRequirement)。 in:ApiKey類型時,token的位置(SecurityScheme.In.HEADER)。

在配置類中定義全局的安全方案

,如JWT、OAuth2、ApiKey等。

見下方配置示例

@SecurityRequirement

、方法

name

:引用的安全方案名稱。 scopes:所需的OAuth作用域(數組)。

聲明一個操作或整個控制器需要哪些安全方案。在Swagger UI中會出現Authorize按鈕。

@SecurityRequirement(name = "bearerAuth")

安全配置示例:

@Configuration
@SecurityScheme( // 定義安全方案
  name = "bearerAuth",
  type = SecurityScheme.Type.HTTP,
  scheme = "bearer",
  bearerFormat = "JWT"
)
publicclass OpenApiConfig {}

@RestController
@SecurityRequirement(name = "bearerAuth") // 整個控制器都需要認證
@Tag(name = "Secure API")
class SecureController {
    @GetMapping("/secure")
    public String secureEndpoint() {
        return"This is secure!";
    }
}

二、swagger注解使用案例

1.  全局配置類 (OpenAPIConfig.java)

package com.example.config;

import io.swagger.v3.oas.annotations.enums.SecuritySchemeType;
import io.swagger.v3.oas.annotations.security.SecurityScheme;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@SecurityScheme( // 定義全局安全方案
    name = "bearerAuth",
    type = SecuritySchemeType.HTTP,
    scheme = "bearer",
    bearerFormat = "JWT",
    description = "JWT認證令牌,格式: Bearer {token}"
)
publicclass OpenAPIConfig {

    @Bean
    public OpenAPI customOpenAPI() {
        returnnew OpenAPI()
            .info(new Info()
                .title("企業級應用API文檔")
                .version("1.0.0")
                .description("""
                    這是企業級應用的完整API文檔,包含:
                    - 用戶管理系統
                    - 電商訂單系統  
                    - 文件服務系統
                    """)
                .contact(new Contact()
                    .name("技術支持")
                    .email("support@company.com")
                    .url("https://support.company.com"))
                .license(new License()
                    .name("Apache 2.0")
                    .url("https://www.apache.org/licenses/LICENSE-2.0")))
            .addSecurityItem(new SecurityRequirement().addList("bearerAuth")); // 全局安全要求
    }
}

2. 安全配置類

@Configuration
@SecuritySchemes({ // 使用 @SecuritySchemes 包裹多個 @SecurityScheme
    @SecurityScheme(
        name = "JWT",
        type = SecuritySchemeType.HTTP,
        scheme = "bearer",
        bearerFormat = "JWT",
        description = "JWT認證令牌"
    ),
    @SecurityScheme(
        name = "APIKey",
        type = SecuritySchemeType.APIKEY,
        in = SecuritySchemeIn.HEADER,
        paramName = "X-API-KEY",
        description = "API密鑰認證"
    ),
    @SecurityScheme(
        name = "OAuth2",
        type = SecuritySchemeType.OAUTH2,
        flows = @OAuthFlows( // 使用 @OAuthFlows 和 @OAuthFlow
            authorizationCode = @OAuthFlow(
                authorizationUrl = "https://example.com/oauth/authorize",
                tokenUrl = "https://example.com/oauth/token",
                scopes = {
                    @OAuthScope(name = "read", description = "讀取權限"),
                    @OAuthScope(name = "write", description = "寫入權限")
                }
            )
        )
    ),
    @SecurityScheme(
        name = "BasicAuth",
        type = SecuritySchemeType.HTTP,
        scheme = "basic",
        description = "基礎認證"
    )
})
publicclass SecurityConfig {
}

3. 控制器

@RestController
@RequestMapping("/api/v1/comprehensive")
@Tag(name = "綜合演示API", description = "展示所有Swagger注解的用法")
@SecurityRequirement(name = "JWT")
publicclass ComprehensiveController {

    // 1. 演示所有參數類型
    @PostMapping("/all-params/{pathVar}")
    @Operation(summary = "所有參數類型演示")
    @Parameters({
        @Parameter(name = "pathVar", description = "路徑參數", in = ParameterIn.PATH, example = "123"),
        @Parameter(name = "queryParam", description = "查詢參數", in = ParameterIn.QUERY, example = "value"),
        @Parameter(name = "X-Custom-Header", description = "頭部參數", in = ParameterIn.HEADER, example = "header-value"),
        @Parameter(name = "sessionId", description = "Cookie參數", in = ParameterIn.COOKIE, example = "session-123")
    })
    public ResponseEntity<String> allParameterTypes(
        @PathVariable String pathVar,
        @RequestParam String queryParam,
        @RequestHeader("X-Custom-Header") String customHeader,
        @CookieValue("sessionId") String sessionId) {
        
        return ResponseEntity.ok("Success");
    }

    // 2. 演示數組和復雜Schema
    @PostMapping("/batch-create")
    @Operation(summary = "批量創建項目")
    public ResponseEntity<String> batchCreate(
        @io.swagger.v3.oas.annotations.parameters.RequestBody(
            description = "批量創建請求",
            content = @Content(
                mediaType = "application/json",
                array = @ArraySchema( // 使用 @ArraySchema
                    schema = @Schema(implementation = User.class),
                    minItems = 1,
                    maxItems = 100
                ),
                examples = @ExampleObject(
                    value = """
                        [
                          {"username": "user1", "email": "user1@example.com"},
                          {"username": "user2", "email": "user2@example.com"}
                        ]
                        """
                )
            )
        )
        @RequestBody List<@Valid User> users) {
        
        return ResponseEntity.ok("Batch created");
    }

    // 3. 演示多安全方案
    @GetMapping("/sensitive-data")
    @Operation(summary = "獲取敏感數據")
    @SecurityRequirement(name = "JWT") // 方法級別安全要求
    @SecurityRequirement(name = "APIKey") // 多個安全要求
    public ResponseEntity<Map<String, String>> getSensitiveData() {
        return ResponseEntity.ok(Map.of("data", "sensitive information"));
    }

    // 4. 演示復雜響應
    @GetMapping("/complex-response")
    @Operation(summary = "復雜響應結構")
    @ApiResponses({
        @ApiResponse(
            responseCode = "200",
            description = "成功響應",
            content = {
                @Content(
                    mediaType = "application/json",
                    schema = @Schema(implementation = ComplexResponse.class),
                    examples = {
                        @ExampleObject(
                            name = "success_example",
                            summary = "成功示例",
                            value = """
                                {
                                  "status": "SUCCESS",
                                  "data": {
                                    "users": [
                                      {"id": 1, "name": "John"},
                                      {"id": 2, "name": "Jane"}
                                    ],
                                    "metadata": {
                                      "page": 1,
                                      "total": 2
                                    }
                                  }
                                }
                                """
                        ),
                        @ExampleObject(
                            name = "error_example",
                            summary = "錯誤示例",
                            value = """
                                {
                                  "status": "ERROR",
                                  "message": "數據不存在"
                                }
                                """
                        )
                    }
                ),
                @Content(
                    mediaType = "application/xml",
                    schema = @Schema(implementation = ComplexResponse.class)
                )
            }
        ),
        @ApiResponse(
            responseCode = "403",
            description = "權限不足",
            content = @Content(schema = @Schema(implementation = ErrorResponse.class))
        )
    })
    public ResponseEntity<ComplexResponse> getComplexResponse() {
        return ResponseEntity.ok(new ComplexResponse());
    }

    // 5. 演示隱藏特定端點
    @GetMapping("/internal/stats")
    @io.swagger.v3.oas.annotations.Hidden // 隱藏內部端點
    public ResponseEntity<String> getInternalStats() {
        return ResponseEntity.ok("Internal statistics");
    }
}

4. 模型類

@Data
@Schema(
    description = "用戶實體",
    requiredProperties = {"username", "email"}, // 必需屬性
    accessMode = Schema.AccessMode.READ_WRITE
)
publicclass User {
    
    @Schema(
        description = "用戶ID",
        example = "1",
        accessMode = Schema.AccessMode.READ_ONLY,
        minimum = "1"
    )
    private Long id;

    @Schema(
        description = "用戶名",
        example = "john_doe",
        minLength = 3,
        maxLength = 50,
        pattern = "^[a-zA-Z0-9_]+$"
    )
    private String username;

    @Schema(
        description = "郵箱地址",
        example = "john@example.com",
        format = "email",
        maxLength = 100
    )
    private String email;

    @Schema(
        description = "用戶年齡",
        example = "25",
        minimum = "0",
        maximum = "150",
        exclusiveMinimum = true,
        exclusiveMaximum = true
    )
    private Integer age;

    @Schema(
        description = "用戶狀態",
        example = "ACTIVE",
        allowableValues = {"ACTIVE", "INACTIVE", "SUSPENDED"},
        defaultValue = "ACTIVE"
    )
    private String status;

    @Schema(
        description = "標簽列表",
        example = "["vip", "new_user"]",
        maxItems = 10
    )
    private List<String> tags;

    @Schema(
        description = "元數據",
        example = "{"key": "value"}",
        additionalProperties = Schema.AdditionalPropertiesValue.TRUE
    )
    private Map<String, Object> metadata;

    @Schema(
        description = "創建時間",
        example = "2023-10-01T12:00:00",
        accessMode = Schema.AccessMode.READ_ONLY
    )
    private LocalDateTime createdAt;
}

@Data
@Schema(description = "復雜響應結構")
class ComplexResponse {
    
    @Schema(
        description = "響應狀態",
        example = "SUCCESS",
        allowableValues = {"SUCCESS", "ERROR"}
    )
    private String status;

    @Schema(
        description = "響應數據",
        oneOf = {User.class, Product.class} // 使用 oneOf
    )
    private Object data;

    @Schema(
        description = "分頁信息",
        allOf = {Pagination.class} // 使用 allOf
    )
    private Object pagination;
}

@Data
@Schema(description = "分頁信息")
class Pagination {
    @Schema(description = "當前頁碼", example = "1")
    privateint page;
    
    @Schema(description = "每頁大小", example = "20")
    privateint size;
    
    @Schema(description = "總記錄數", example = "100")
    privatelong total;
}

@Data
@Schema(description = "錯誤響應")
class ErrorResponse {
    @Schema(description = "錯誤代碼", example = "403")
    privateint code;
    
    @Schema(description = "錯誤信息", example = "權限不足")
    private String message;
    
    @Schema(description = "時間戳", example = "2023-10-01T12:00:00")
    private LocalDateTime timestamp;
}

5. 回調控制器

@RestController
@RequestMapping("/api/v1/webhook")
@Tag(name = "Webhook管理", description = "Webhook回調接口")
publicclass WebhookController {

    @PostMapping("/subscribe")
    @Operation(summary = "訂閱Webhook")
    @Callbacks({
        @Callback(
            name = "onEvent",
            callbackUrlExpression = "http://localhost:8080/api/v1/webhook/event",
            operation = @Operation(
                method = "POST",
                description = "事件回調",
                requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody(
                    content = @Content(
                        schema = @Schema(implementation = WebhookEvent.class)
                    )
                ),
                responses = @ApiResponse(
                    responseCode = "200",
                    description = "回調處理成功"
                )
            )
        )
    })
    public String subscribeWebhook() {
        return"Subscription created";
    }
}

@Schema(description = "Webhook事件")
class WebhookEvent {
    @Schema(description = "事件類型", example = "user.created")
    private String type;
    
    @Schema(description = "事件數據")
    private Object data;
    
    @Schema(description = "時間戳", example = "2023-10-01T12:00:00")
    private String timestamp;
}

6. Swagger注解總結

這個完整的案例包含了所有核心的Swagger注解:

6.1. 基本信息與分組

  • @Tag - API分組
  • @Hidden - 隱藏API

6.2. 接口操作

  • @Operation - 操作描述
  • @ApiResponse - 單個響應
  • @ApiResponses - 多個響應
  • @Callback / @Callbacks - 回調操作

6.3. 參數描述

  • @Parameter - 參數描述
  • @Parameters - 多個參數
  • 所有 in 類型:PATH, QUERY, HEADER, COOKIE

6.4. 請求體與內容

  • @RequestBody - 請求體描述
  • @Content - 內容類型
  • @Schema - 數據模型
  • @ArraySchema - 數組結構
  • @ExampleObject - 示例對象

6.5. 安全方案

  • @SecurityScheme - 安全方案定義
  • @SecuritySchemes - 多個安全方案
  • @SecurityRequirement - 安全要求
  • 所有安全類型:HTTP, APIKEY, OAUTH2, OPENIDCONNECT
  • @OAuthFlows / @OAuthFlow / @OAuthScope - OAuth2流程

6.6. Schema高級特性

  • oneOf / allOf - 組合模式
  • accessMode - 訪問模式
  • requiredMode - 必需模式
  • allowableValues - 允許值
  • format - 數據格式
  • pattern - 正則模式
  • minimum / maximum - 數值范圍
  • minLength / maxLength - 長度限制
  • minItems / maxItems - 數組限制
責任編輯:武曉燕 來源: Solomon肖哥談架構
相關推薦

2024-07-09 09:33:18

2023-10-30 08:53:36

Python輸入輸出

2025-07-17 12:59:56

2025-09-02 01:33:00

2025-06-04 08:20:00

Compressor前端開發

2023-06-28 11:49:56

Linux命令

2024-01-11 11:25:22

2012-05-14 11:07:27

2015-06-25 13:06:48

大數據從選擇到應用

2024-03-01 01:25:40

結構化日志可讀性

2023-10-27 08:42:56

Python字典

2024-11-27 15:49:46

字符串Python

2024-09-06 17:45:55

Linux磁盤

2019-04-01 15:28:53

設計師APP搜索框

2025-06-05 02:45:00

2025-07-28 09:05:00

su 命令Linux運維

2025-08-05 07:34:59

2023-10-17 09:36:32

Spark大數據

2017-06-20 15:39:58

Koa2 應用動態Swagger文檔

2025-07-17 13:52:57

通配符Linux命令行
點贊
收藏

51CTO技術棧公眾號

91夜夜揉人人捏人人添红杏| 亚洲精品资源在线| 91九色国产ts另类人妖| 精品人妻一区二区三区浪潮在线 | 国内在线观看一区二区三区| 日韩一二在线观看| 久久久久久久9| 天天操天天操天天操| 麻豆成人精品| 日韩精品久久久久久久玫瑰园 | 国产欧美一级| 一区二区欧美亚洲| 极品粉嫩美女露脸啪啪| 日本高清视频在线观看| 国产真实乱子伦精品视频| 欧美激情视频给我| 极品粉嫩小仙女高潮喷水久久| 日韩电影av| 成人免费一区二区三区在线观看 | 极品国产人妖chinesets亚洲人妖| 午夜激情综合网| 精品国产乱码久久久久软件| 国产精品第6页| 在线国产一区二区| 日韩精品视频免费在线观看| 无罩大乳的熟妇正在播放| www.在线播放| caoporn国产精品| 国产精品影片在线观看| 国产在线观看成人| 欧美精品一区二区三区中文字幕| 日韩亚洲欧美一区二区三区| 欧美 国产 小说 另类| mm1313亚洲国产精品美女| 久久午夜羞羞影院免费观看| 91在线视频精品| 中文字幕在线观看视频网站| 91综合久久| 日韩av一区二区在线观看| 中文字幕12页| 中文字幕色婷婷在线视频| 日韩理论片在线| 久久99精品久久久久久久青青日本 | 亚洲成**性毛茸茸| av亚洲天堂网| 怡红院成人在线| 亚洲成a人片在线观看中文| 天天久久人人| 香港一级纯黄大片| 国产一区二区三区香蕉| 国产精品va在线播放我和闺蜜| 91九色丨porny丨极品女神| 日韩影视在线观看| 欧美一区二区在线免费播放| 99视频在线视频| 九色porny丨入口在线| 一区二区三区在线高清| 亚洲永久激情精品| 国产在线观看黄| 2021中文字幕一区亚洲| www 成人av com| 国产美女精品视频国产| 美女看a上一区| 日本高清视频精品| 亚洲国产成人精品综合99| 久久中文字幕av| 一区二区欧美在线| xxx在线播放| 日韩在线麻豆| 精品亚洲国产成av人片传媒 | 天天色天天射天天综合网| 国产精品久久毛片a| 亚洲精品在线观看免费| 国产鲁鲁视频在线观看免费| 久久精品亚洲国产奇米99| 免费一区二区三区| 国产99视频在线| 国产麻豆视频一区二区| 91系列在线观看| 99久久免费国产精精品| 狠狠色狠狠色合久久伊人| 国产精品视频导航| 91麻豆成人精品国产| 老司机精品视频一区二区三区| 91超碰中文字幕久久精品| 中文在线观看免费网站| 亚洲三级视频| 国内外成人免费激情在线视频| 日韩av在线天堂| 一本色道久久综合| 91干在线观看| 国内自拍视频在线播放| 免费在线观看精品| 国产精品精品久久久久久| 人人妻人人爽人人澡人人精品 | 伊人成人222| 九九99久久精品在免费线bt| 日韩免费高清av| 女人被狂躁c到高潮| 少妇精品久久久一区二区三区| 亚洲图片欧美日产| 久草视频在线资源站| 久久在线精品| av蓝导航精品导航| 番号集在线观看| 亚洲在线中文字幕| 国产精品视频分类| 欧美sss在线视频| 精品国产欧美一区二区五十路| a v视频在线观看| 国产乱码精品一区二区三| 人偷久久久久久久偷女厕| 亚洲男同gay网站| 欧美四级电影网| 中文字幕一区三区久久女搜查官| 亚州av乱码久久精品蜜桃 | 久久精品97| 亚洲精品久久久久中文字幕二区| 国产精品成人69xxx免费视频| 欧美色一级片| 91视频九色网站| 成人免费高清在线播放| 狠狠综合久久av一区二区小说| 无套内谢丰满少妇中文字幕| 日韩成人精品一区二区| 2024亚洲男人天堂| 狠狠躁日日躁夜夜躁av| 亚洲欧洲av在线| 99re精彩视频| 国产亚洲一区| 欧洲中文字幕国产精品| 性生交生活影碟片| 亚洲人成精品久久久久久| 免费看a级黄色片| 婷婷国产精品| 性欧美xxxx交| 乱精品一区字幕二区| 亚洲欧美视频在线观看视频| 亚洲77777| 欧美偷拍综合| 国产精品日韩久久久久| av中文字幕在线| 91久久精品一区二区| 国产激情在线免费观看| 久久成人免费| 日本在线成人一区二区| 欧美成人ⅴideosxxxxx| 亚洲美女中文字幕| 伦av综合一区| 国产视频视频一区| 国产精品一区二区羞羞答答| 日韩精品久久| 成人激情电影一区二区| 日本蜜桃在线观看| 91精品国产色综合久久不卡电影 | 日本一区视频| 欧美日韩激情视频| 国产美女精品久久| 日本91福利区| 欧美日韩一区二区三区电影| 日韩三级网址| 欧美高清视频在线播放| 黄色片一区二区三区| 亚洲一区二区三区爽爽爽爽爽| 日本一级大毛片a一| 99re国产精品| 日本一区二区三区在线观看视频| 日韩精品视频网| 视频一区二区三| 日韩午夜电影免费看| 久久偷看各类女兵18女厕嘘嘘| 国产女人18毛片水18精| 一区二区三区四区不卡视频| 中文在线字幕观看| 国产欧美高清| 亚洲激情电影在线| 国产专区精品| 欧美国产精品人人做人人爱| 少妇喷水在线观看| 色噜噜久久综合| 精品国产大片大片大片| 国产精品小仙女| 5月婷婷6月丁香| 不卡在线一区二区| 99在线热播| 成人天堂yy6080亚洲高清| 久久精品国产久精国产一老狼| 空姐吹箫视频大全| 色诱视频网站一区| 放荡的美妇在线播放| av毛片久久久久**hd| 91n.com在线观看| 国产精品大片| 日本一区视频在线观看| 4438全国亚洲精品观看视频| 国产精品69av| 美足av综合网| 伊人久久久久久久久久| 成人小说亚洲一区二区三区| 欧美性大战久久久久久久蜜臀| 卡通动漫亚洲综合| 久久午夜羞羞影院免费观看| 毛毛毛毛毛毛毛片123| 老司机精品视频网站| 黄色网在线视频| 日本a口亚洲| 国产区二精品视| 亚洲精品aa| 欧美专区第一页| 91亚洲天堂| 伊人一区二区三区久久精品| 国产综合视频在线| 欧美日韩午夜影院| 亚洲天堂一区在线观看| 亚洲一区成人在线| 超碰人人人人人人人| 91蝌蚪porny| 挪威xxxx性hd极品| 国产真实乱偷精品视频免| 成人中文字幕av| 国产欧美短视频| 大陆av在线播放| 亚洲国产不卡| 亚洲精品一区二区三| 自拍亚洲一区| 精品国产综合| 国产精品qvod| 91大片在线观看| 国产精品日本一区二区三区在线 | 国产91欧美| 欧美一级在线亚洲天堂| 成人女同在线观看| 欧美xxxx18性欧美| 超碰免费在线播放| 中文字幕亚洲一区二区三区| 蜜桃视频在线入口www| 日韩电影网在线| 亚洲欧美另类视频| 欧美r级在线观看| 国内精品国产成人国产三级| 在线播放91灌醉迷j高跟美女| 久久这里只有精品9| 一本久久a久久免费精品不卡| 日韩人妻无码一区二区三区99 | 亚洲色成人www永久网站| 精品日本美女福利在线观看| av资源免费观看| 精品国产乱码久久久久酒店| 日韩av在线天堂| 欧美日韩一区二区三区| 久久青青草原亚洲av无码麻豆| 激情成人在线视频| 久久国产视频精品| 色哦色哦哦色天天综合| 中文字幕黄色av| 欧美精品三级日韩久久| 国产美女裸体无遮挡免费视频 | 天堂网av在线播放| 亚洲国模精品一区| 欧美精品久久久久久久久久丰满| 精品伊人久久97| 黄网站在线观看| 中文字幕在线观看亚洲| 黄色片免费在线观看| 久久国产精品免费视频| 女人天堂av在线播放| 韩国三级日本三级少妇99| 韩国成人二区| 国产精品第七十二页| 福利一区和二区| 亚洲xxxxx| 欧美黄色录像| 色阁综合av| 欧美a级一区| 欧美日韩在线一| 日本亚洲天堂网| 久久久久久国产精品日本| 成人美女视频在线观看18| 扒开jk护士狂揉免费| 国产精品视频九色porn| 九九视频在线免费观看| 色综合天天性综合| 91影院在线播放| 亚洲第一网站男人都懂| 国产三级电影在线| 欧美成人精品xxx| 蜜桃视频m3u8在线观看| 国产精品一区二区三区免费视频| 99re8这里有精品热视频免费| 免费观看成人高| 亚洲网色网站| 那种视频在线观看| 国产精品一区二区不卡| 人人妻人人澡人人爽人人精品 | 天天爽夜夜爽夜夜爽精品| 欧美日韩国产综合一区二区三区| 可以免费看毛片的网站| 自拍偷拍亚洲区| а√天堂资源官网在线资源| 国产精品视频一| 久久精品色播| 一级黄色免费在线观看| 日韩网站在线| 亚洲一二区在线观看| 久久精子c满五个校花| 免费在线观看国产精品| 欧美在线视频日韩| 人妻一区二区三区四区| 日韩专区中文字幕| 永久免费毛片在线播放| 91免费版黄色| 成人羞羞视频播放网站| 浮妇高潮喷白浆视频| 国产一区二区成人久久免费影院| 日韩精品电影一区二区| 一区二区三区日韩| 一区二区三区免费观看视频| 亚洲免费电影在线观看| eeuss鲁一区二区三区| 91久久精品国产91性色| 欧美一区二区三| 国产又黄又大又粗视频| 床上的激情91.| 国产一区二区三区在线视频观看| 欧美性受xxxx黑人xyx性爽| 欧美理论在线观看| 91精品国产色综合久久不卡98口| 天堂精品久久久久| 天天爱天天做天天操| 蜜乳av一区二区三区| 人妻少妇无码精品视频区| 欧美日韩亚洲高清| 韩国av永久免费| 久久久久久亚洲| 日韩在线观看一区二区三区| 美女黄色片网站| 黑人巨大精品欧美一区| а天堂中文在线资源| 欧美一a一片一级一片| 欧美精品久久久久久久久久丰满| 欧美孕妇与黑人孕交| 日韩大尺度在线观看| 国产精品网站免费| 99在线精品免费| 日韩女同强女同hd| 亚洲国产一区自拍| 蜜臀久久精品| 免费试看一区| 久久在线精品| 大胸美女被爆操| 欧美日韩一区小说| 欧美午夜电影一区二区三区| 成人乱人伦精品视频在线观看| 99久久精品费精品国产风间由美| 99re精彩视频| 亚洲欧美日韩在线播放| jlzzjlzz亚洲女人18| 欧美极品少妇全裸体| 欧美绝顶高潮抽搐喷水合集| 精品欧美一区免费观看α√| 99re这里只有精品6| 国产午夜麻豆影院在线观看| 国产亚洲欧美日韩一区二区| 久久亚洲精品人成综合网| 中文字幕日韩一区二区三区不卡| 国产真实乱对白精彩久久| 免费在线看黄网址| 亚洲精品国产精品国自产观看浪潮| 中文字幕资源网在线观看免费| 日本高清不卡一区二区三| 理论电影国产精品| 久久久久久欧美精品se一二三四| 精品一区二区电影| 成人国产一区| 大地资源网在线观看免费官网| 成人激情免费电影网址| 麻豆成人免费视频| www.99久久热国产日韩欧美.com| 日韩视频一二区| 欧美日韩激情视频在线观看| 国产精品素人视频| 亚洲av无码乱码国产麻豆| 欧美一级片久久久久久久| 91亚洲国产成人久久精品| 中文字幕第九页| 欧美亚洲动漫制服丝袜| 手机av免费在线| 欧美午夜精品久久久久久蜜| 九色综合狠狠综合久久| 日本中文字幕在线免费观看| 这里只有精品在线观看| 99re热精品视频| 国产色视频在线播放| 亚洲动漫第一页| 日韩理伦片在线| 精品欧美一区二区在线观看视频 | 国产精品久久| 无码少妇一区二区| 日韩视频在线永久播放| 成人在线爆射|