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

SpringBoot 如何統一后端返回格式?老鳥們都是這樣玩的!

開發 架構
今天我們來聊一聊在基于SpringBoot前后端分離開發模式下,如何友好的返回統一的標準格式以及如何優雅的處理全局異常。

[[411637]]

大家好,我是飄渺。

今天我們來聊一聊在基于SpringBoot前后端分離開發模式下,如何友好的返回統一的標準格式以及如何優雅的處理全局異常。

首先我們來看看為什么要返回統一的標準格式?

為什么要對SpringBoot返回統一的標準格式

在默認情況下,SpringBoot的返回格式常見的有三種:

第一種:返回 String

  1. @GetMapping("/hello"
  2. public String getStr(){ 
  3.   return "hello,javadaily"

此時調用接口獲取到的返回值是這樣:

  1. hello,javadaily 

第二種:返回自定義對象

  1. @GetMapping("/aniaml"
  2. public Aniaml getAniaml(){ 
  3.   Aniaml aniaml = new Aniaml(1,"pig"); 
  4.   return aniaml; 

此時調用接口獲取到的返回值是這樣:

  1.   "id": 1, 
  2.   "name""pig" 

第三種:接口異常

  1. @GetMapping("/error"
  2. public int error(){ 
  3.     int i = 9/0; 
  4.     return i; 

此時調用接口獲取到的返回值是這樣:

  1.   "timestamp""2021-07-08T08:05:15.423+00:00"
  2.   "status": 500, 
  3.   "error""Internal Server Error"
  4.   "path""/wrong" 

基于以上種種情況,如果你和前端開發人員聯調接口她們就會很懵逼,由于我們沒有給他一個統一的格式,前端人員不知道如何處理返回值。

還有甚者,有的同學比如小張喜歡對結果進行封裝,他使用了Result對象,小王也喜歡對結果進行包裝,但是他卻使用的是Response對象,當出現這種情況時我相信前端人員一定會抓狂的。

所以我們項目中是需要定義一個統一的標準返回格式的。

定義返回標準格式

一個標準的返回格式至少包含3部分:

  1. status 狀態值:由后端統一定義各種返回結果的狀態碼
  2. message 描述:本次接口調用的結果描述
  3. data 數據:本次返回的數據。
  1.   "status":"100"
  2.   "message":"操作成功"
  3.   "data":"hello,javadaily" 

當然也可以按需加入其他擴展值,比如我們就在返回對象中添加了接口調用時間

4.timestamp: 接口調用時間

定義返回對象

  1. @Data 
  2. public class ResultData<T> { 
  3.   /** 結果狀態 ,具體狀態碼參見ResultData.java*/ 
  4.   private int status; 
  5.   private String message; 
  6.   private T data; 
  7.   private long timestamp ; 
  8.  
  9.  
  10.   public ResultData (){ 
  11.     this.timestamp = System.currentTimeMillis(); 
  12.   } 
  13.  
  14.  
  15.   public static <T> ResultData<T> success(T data) { 
  16.     ResultData<T> resultData = new ResultData<>(); 
  17.     resultData.setStatus(ReturnCode.RC100.getCode()); 
  18.     resultData.setMessage(ReturnCode.RC100.getMessage()); 
  19.     resultData.setData(data); 
  20.     return resultData; 
  21.   } 
  22.  
  23.   public static <T> ResultData<T> fail(int code, String message) { 
  24.     ResultData<T> resultData = new ResultData<>(); 
  25.     resultData.setStatus(code); 
  26.     resultData.setMessage(message); 
  27.     return resultData; 
  28.   } 
  29.  

定義狀態碼

  1. public enum ReturnCode { 
  2.     /**操作成功**/ 
  3.     RC100(100,"操作成功"), 
  4.     /**操作失敗**/ 
  5.     RC999(999,"操作失敗"), 
  6.     /**服務限流**/ 
  7.     RC200(200,"服務開啟限流保護,請稍后再試!"), 
  8.     /**服務降級**/ 
  9.     RC201(201,"服務開啟降級保護,請稍后再試!"), 
  10.     /**熱點參數限流**/ 
  11.     RC202(202,"熱點參數限流,請稍后再試!"), 
  12.     /**系統規則不滿足**/ 
  13.     RC203(203,"系統規則不滿足要求,請稍后再試!"), 
  14.     /**授權規則不通過**/ 
  15.     RC204(204,"授權規則不通過,請稍后再試!"), 
  16.     /**access_denied**/ 
  17.     RC403(403,"無訪問權限,請聯系管理員授予權限"), 
  18.     /**access_denied**/ 
  19.     RC401(401,"匿名用戶訪問無權限資源時的異常"), 
  20.     /**服務異常**/ 
  21.     RC500(500,"系統異常,請稍后重試"), 
  22.  
  23.     INVALID_TOKEN(2001,"訪問令牌不合法"), 
  24.     ACCESS_DENIED(2003,"沒有權限訪問該資源"), 
  25.     CLIENT_AUTHENTICATION_FAILED(1001,"客戶端認證失敗"), 
  26.     USERNAME_OR_PASSWORD_ERROR(1002,"用戶名或密碼錯誤"), 
  27.     UNSUPPORTED_GRANT_TYPE(1003, "不支持的認證模式"); 
  28.  
  29.  
  30.  
  31.     /**自定義狀態碼**/ 
  32.     private final int code; 
  33.     /**自定義描述**/ 
  34.     private final String message; 
  35.  
  36.     ReturnCode(int code, String message){ 
  37.         this.code = code; 
  38.         this.message = message; 
  39.     } 
  40.  
  41.  
  42.     public int getCode() { 
  43.         return code; 
  44.     } 
  45.  
  46.     public String getMessage() { 
  47.         return message; 
  48.     } 

統一返回格式

  1. @GetMapping("/hello"
  2. public ResultData<String> getStr(){ 
  3.  return ResultData.success("hello,javadaily"); 

此時調用接口獲取到的返回值是這樣:

  1.   "status": 100, 
  2.   "message""hello,javadaily"
  3.   "data"null
  4.   "timestamp": 1625736481648, 
  5.   "httpStatus": 0 

這樣確實已經實現了我們想要的結果,我在很多項目中看到的都是這種寫法,在Controller層通過ResultData.success()對返回結果進行包裝后返回給前端。

看到這里我們不妨停下來想想,這樣做有什么弊端呢?

最大的弊端就是我們后面每寫一個接口都需要調用ResultData.success()這行代碼對結果進行包裝,重復勞動,浪費體力;

而且還很容易被其他老鳥給嘲笑。

所以呢我們需要對代碼進行優化,目標就是不要每個接口都手工制定ResultData返回值。

高級實現方式

要優化這段代碼很簡單,我們只需要借助SpringBoot提供的ResponseBodyAdvice即可。

ResponseBodyAdvice的作用:攔截Controller方法的返回值,統一處理返回值/響應體,一般用來統一返回格式,加解密,簽名等等。

先來看下ResponseBodyAdvice的源碼:

  1. public interface ResponseBodyAdvice<T> { 
  2.   /** 
  3.   * 是否支持advice功能 
  4.   * true 支持,false 不支持 
  5.   */ 
  6.     boolean supports(MethodParameter var1, Class<? extends HttpMessageConverter<?>> var2); 
  7.  
  8.    /** 
  9.   * 對返回的數據進行處理 
  10.   */ 
  11.     @Nullable 
  12.     T beforeBodyWrite(@Nullable T var1, MethodParameter var2, MediaType var3, Class<? extends HttpMessageConverter<?>> var4, ServerHttpRequest var5, ServerHttpResponse var6); 

我們只需要編寫一個具體實現類即可

  1. /** 
  2.  * @author jam 
  3.  * @date 2021/7/8 10:10 上午 
  4.  */ 
  5. @RestControllerAdvice 
  6. public class ResponseAdvice implements ResponseBodyAdvice<Object> { 
  7.     @Autowired 
  8.     private ObjectMapper objectMapper; 
  9.  
  10.     @Override 
  11.     public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) { 
  12.         return true
  13.     } 
  14.  
  15.     @SneakyThrows 
  16.     @Override 
  17.     public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) { 
  18.         if(o instanceof String){ 
  19.             return objectMapper.writeValueAsString(ResultData.success(o)); 
  20.         }         
  21.         return ResultData.success(o); 
  22.     } 

需要注意兩個地方:

  • @RestControllerAdvice注解

@RestControllerAdvice是@RestController注解的增強,可以實現三個方面的功能:

  1. 全局異常處理
  2. 全局數據綁定
  3. 全局數據預處理
  • String類型判斷
  1. if(o instanceof String){ 
  2.   return objectMapper.writeValueAsString(ResultData.success(o)); 
  3. }  

這段代碼一定要加,如果Controller直接返回String的話,SpringBoot是直接返回,故我們需要手動轉換成json。

經過上面的處理我們就再也不需要通過ResultData.success()來進行轉換了,直接返回原始數據格式,SpringBoot自動幫我們實現包裝類的封裝。

  1. @GetMapping("/hello"
  2. public String getStr(){ 
  3.     return "hello,javadaily"

此時我們調用接口返回的數據結果為:

  1. @GetMapping("/hello"
  2. public String getStr(){ 
  3.   return "hello,javadaily"

是不是感覺很完美,別急,還有個問題在等著你呢。

接口異常問題

此時有個問題,由于我們沒對Controller的異常進行處理,當我們調用的方法一旦出現異常,就會出現問題,比如下面這個接口

  1. @GetMapping("/wrong"
  2. public int error(){ 
  3.     int i = 9/0; 
  4.     return i; 

返回的結果為:

這顯然不是我們想要的結果,接口都報錯了還返回操作成功的響應碼,前端看了會打人的。

別急,接下來我們進入第二個議題,如何優雅的處理全局異常。

SpringBoot為什么需要全局異常處理器

不用手寫try...catch,由全局異常處理器統一捕獲

使用全局異常處理器最大的便利就是程序員在寫代碼時不再需要手寫try...catch了,前面我們講過,默認情況下SpringBoot出現異常時返回的結果是這樣:

  1.   "timestamp""2021-07-08T08:05:15.423+00:00"
  2.   "status": 500, 
  3.   "error""Internal Server Error"
  4.   "path""/wrong" 

這種數據格式返回給前端,前端是看不懂的,所以這時候我們一般通過try...catch來處理異常

  1. @GetMapping("/wrong"
  2. public int error(){ 
  3.     int i; 
  4.     try{ 
  5.         i = 9/0; 
  6.     }catch (Exception e){ 
  7.         log.error("error:{}",e); 
  8.         i = 0; 
  9.     } 
  10.     return i; 

我們追求的目標肯定是不需要再手動寫try...catch了,而是希望由全局異常處理器處理。

對于自定義異常,只能通過全局異常處理器來處理

  1. @GetMapping("error1"
  2. public void empty(){ 
  3.  throw  new RuntimeException("自定義異常"); 

當我們引入Validator參數校驗器的時候,參數校驗不通過會拋出異常,此時是無法用try...catch捕獲的,只能使用全局異常處理器。

SpringBoot集成參數校驗請參考這篇文章SpringBoot開發秘籍 - 集成參數校驗及高階技巧

如何實現全局異常處理器

  1. @Slf4j 
  2. @RestControllerAdvice 
  3. public class RestExceptionHandler { 
  4.     /** 
  5.      * 默認全局異常處理。 
  6.      * @param e the e 
  7.      * @return ResultData 
  8.      */ 
  9.     @ExceptionHandler(Exception.class) 
  10.     @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) 
  11.     public ResultData<String> exception(Exception e) { 
  12.         log.error("全局異常信息 ex={}", e.getMessage(), e); 
  13.         return ResultData.fail(ReturnCode.RC500.getCode(),e.getMessage()); 
  14.     } 
  15.  

有三個細節需要說明一下:

  1. @RestControllerAdvice,RestController的增強類,可用于實現全局異常處理器
  2. @ExceptionHandler,統一處理某一類異常,從而減少代碼重復率和復雜度,比如要獲取自定義異??梢訞ExceptionHandler(BusinessException.class)
  3. @ResponseStatus指定客戶端收到的http狀態碼

體驗效果

這時候我們調用如下接口:

  1. @GetMapping("error1"
  2. public void empty(){ 
  3.     throw  new RuntimeException("自定義異常"); 

返回的結果如下:

  1.   "status": 500, 
  2.   "message""自定義異常"
  3.   "data"null
  4.   "timestamp": 1625795902556 

基本滿足我們的需求了。

但是當我們同時啟用統一標準格式封裝功能ResponseAdvice和RestExceptionHandler全局異常處理器時又出現了新的問題:

  1.   "status": 100, 
  2.   "message""操作成功"
  3.   "data": { 
  4.     "status": 500, 
  5.     "message""自定義異常"
  6.     "data"null
  7.     "timestamp": 1625796167986 
  8.   }, 
  9.   "timestamp": 1625796168008 

此時返回的結果是這樣,統一格式增強功能會給返回的異常結果再次封裝,所以接下來我們需要解決這個問題。

全局異常接入返回的標準格式

要讓全局異常接入標準格式很簡單,因為全局異常處理器已經幫我們封裝好了標準格式,我們只需要直接返回給客戶端即可。

  1. @SneakyThrows 
  2. @Override 
  3. public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) { 
  4.   if(o instanceof String){ 
  5.     return objectMapper.writeValueAsString(ResultData.success(o)); 
  6.   } 
  7.   if(o instanceof ResultData){ 
  8.     return o; 
  9.   } 
  10.   return ResultData.success(o); 

關鍵代碼:

  1. if(o instanceof ResultData){ 
  2.   return o; 

如果返回的結果是ResultData對象,直接返回即可。

這時候我們再調用上面的錯誤方法,返回的結果就符合我們的要求了。

  1.   "status": 500, 
  2.   "message""自定義異常"
  3.   "data"null
  4.   "timestamp": 1625796580778 

好了,今天的文章就到這里了,希望通過這篇文章你能掌握如何在你項目中友好實現統一標準格式到返回并且可以優雅的處理全局異常。

 

 

 

github地址:https://github.com/jianzh5/cloud-blog/

 

責任編輯:武曉燕 來源: JAVA日知錄
相關推薦

2023-11-23 08:25:31

String性能

2023-04-12 08:56:37

RocketMQSpring核心業務

2023-02-04 10:08:40

2015-07-15 13:47:13

上網高手

2022-08-31 08:19:04

接口returnCode代碼

2019-09-29 10:23:09

APIJava編程語言

2024-06-13 08:19:08

Controller接口參數

2020-11-16 13:38:31

PostMessage

2022-05-30 08:03:06

后端參數校驗異常處理

2021-10-11 19:34:03

全局格式項目

2021-09-05 07:55:37

前端Emoji 表情

2021-07-28 06:10:47

拖拽設計器 transmat

2024-08-06 09:51:21

SpringHTTPJSON

2015-04-16 09:48:12

APP測試

2024-08-02 08:38:20

Controller接口地址

2019-05-30 14:58:56

Pythonxml文件

2017-11-13 12:02:33

程序猿華為軟件

2023-11-28 14:32:04

2022-12-30 08:49:41

SpringBoot@Validated

2018-08-27 15:53:43

編程語言javaPython
點贊
收藏

51CTO技術棧公眾號

中文字幕人妻色偷偷久久| 中文字幕第10页| eeuss影院在线观看| 日本vs亚洲vs韩国一区三区| 蜜臀久久99精品久久久无需会员| 国产51自产区| 九七电影院97理论片久久tvb| 一区二区久久久久久| 免费中文日韩| 国产精品黄视频| 我看黄色一级片| 午夜影院免费在线| 久久久久久久久久久久久久久99| 91精品久久久久久久久久久| 欧美成人精品欧美一级乱黄| 97caopron在线视频| caoporen国产精品视频| 成人免费黄色网| 韩国av中文字幕| 亚洲精品成人无限看| 日韩久久精品成人| 被黑人猛躁10次高潮视频| 97超碰人人在线| 不卡的av电影| 亚洲一区二区日本| 这里只有精品999| 国产日韩欧美高清免费| 美女久久久久久久| 国产在线免费av| 久久免费视频66| 日韩亚洲国产中文字幕欧美| 亚洲老女人av| 欧美成人ⅴideosxxxxx| 五月激情综合网| 精品国产一区久久| 国产成人精品久久| 日本a在线观看| 真实国产乱子伦精品一区二区三区| 亚洲男人天堂2019| 欧美bbbbb性bbbbb视频| 丁香5月婷婷久久| 日韩视频在线你懂得| 性生生活大片免费看视频| 色猫猫成人app| 日本道色综合久久| 超碰影院在线观看| 性欧美freesex顶级少妇| 午夜影院久久久| 欧美精品久久久久久久免费| 免费在线观看的电影网站| 亚洲伦在线观看| 裸体裸乳免费看| 国产精品扒开做爽爽爽的视频| 久久人人97超碰com| 欧美插天视频在线播放| 欧美风情第一页| 国产精品99久久久久久动医院| 在线激情影院一区| 日本伦理一区二区三区| 国产精品99一区二区三区| 日韩亚洲国产中文字幕| 国产成人一区二| 狠狠人妻久久久久久综合蜜桃| 菁菁伊人国产精品| 日韩精品中文字幕视频在线| 无码人妻精品一区二区三区温州| 女同一区二区三区| 亚洲欧美国产一区二区三区| 这里只有久久精品| 色爱综合网欧美| 日韩欧美久久久| 免费看三级黄色片| 老牛影视av一区二区在线观看| 亚洲韩国日本中文字幕| 亚洲精品视频大全| 成人国产精品一级毛片视频| xxxx性欧美| 欧美成人免费观看视频| 亚洲经典三级| 按摩亚洲人久久| 国产av 一区二区三区| 在线播放一区| 麻豆国产精品va在线观看不卡| 国产精品久久久精品四季影院| 希岛爱理av一区二区三区| 欧美精品性视频| 国产又大又黄视频| 看片网站欧美日韩| 成人蜜臀av电影| 91高清视频免费观看| 超碰在线观看91| 国产高清久久久| 欧美18视频| 成人日批视频| 欧美日韩免费在线| 一级黄色特级片| 岛国av一区| 中文字幕在线看视频国产欧美| 极品魔鬼身材女神啪啪精品| 国产深夜精品| 成人欧美一区二区三区在线湿哒哒 | 男人天堂网视频| 亚洲福利影视| 亚洲美女中文字幕| 欧美成人综合色| 日本特黄久久久高潮| 国产伦精品一区二区三区免费视频| 韩日在线视频| 午夜电影久久久| 天天做天天干天天操| 亚洲福利天堂| 日韩一二三四区| jizz中文字幕| 亚洲视频www| 国产精品欧美久久久久无广告| 91免费观看网站| 亚洲精品无码久久久久| 粉嫩av一区二区三区在线播放| 欧美性xxxx69| 精品丝袜在线| 欧美va亚洲va香蕉在线| 亚洲精品国产精品乱码在线观看| 夜夜嗨av一区二区三区网站四季av| 欧美日本啪啪无遮挡网站| 午夜精品免费观看| av成人免费在线| 免费的一级黄色片| 先锋影音网一区二区| 亚洲最新视频在线| 国内自拍视频在线播放| 成人18视频日本| 日韩精品免费一区| 久久久久久亚洲精品美女| 中文在线资源观看视频网站免费不卡 | www日韩在线观看| 亚洲精品中文字幕99999| 久久久免费观看| 午夜精品久久久久久久91蜜桃| 最新高清无码专区| 视频免费1区二区三区| 精品视频日韩| 欧美在线免费观看亚洲| 国产精品第三页| 午夜福利理论片在线观看| 亚洲高清免费视频| 精品久久一二三| av综合网页| 欧美激情喷水视频| 丰满人妻一区二区三区四区53 | 在线观看18视频网站| 亚洲影视资源| 久久av红桃一区二区小说| 国产人妖在线播放| 亚洲国产视频在线| 中文字幕三级电影| 亚洲免费婷婷| 欧美日韩在线播放一区二区| 欧美大片免费高清观看| 亚洲少妇激情视频| 青青草精品在线视频| 韩国av一区二区三区在线观看 | 亚洲乱码久久| 久久伊人一区二区| 亚洲精品一区三区三区在线观看| 一区国产精品视频| 国产乱色精品成人免费视频| 亚洲色图清纯唯美| bl动漫在线观看| gogo在线高清视频| 国产精品一区二区久久不卡| 久久99久久99精品| 天堂俺去俺来也www久久婷婷| 欧洲亚洲免费视频| 在线视频三区| 日韩视频中午一区| 精品国产一区二区三区四| 91香蕉视频污| 中文字幕国产免费| 午夜性色一区二区三区免费视频| 国产精品三区www17con| 中文字幕av一区二区三区佐山爱| 中文字幕亚洲情99在线| 国产黄色片免费观看| 精品国产91乱高清在线观看| 人妻av无码一区二区三区| 国内成人免费视频| 国内外成人激情视频| 欧美疯狂party性派对| 99在线视频播放| 成人美女黄网站| 日韩你懂的电影在线观看| 日本少妇xxxx动漫| 欧美激情在线观看视频免费| 美女被艹视频网站| 日韩经典一区二区| 久久这里只有精品18| 日韩电影免费网站| 国产三区精品| 99视频这里有精品| 日本久久亚洲电影| 91人妻一区二区三区蜜臀| 日韩在线影院| 色狠狠久久aa北条麻妃| 日日夜夜精品免费| 91 com成人网| 无码人妻aⅴ一区二区三区有奶水| 亚洲欧洲另类国产综合| 成人h动漫精品一区| 国产在线视频一区二区三区| 国产在线精品91| 欧美粗暴jizz性欧美20| 亚洲成色www久久网站| 国产精品久久久久av蜜臀| 国产在线观看不卡| 日韩精品一区二区三区| 欧美激情精品久久久久久久变态| 91网在线播放| 精品五月天久久| 性做久久久久久久| 91精品在线一区二区| 姑娘第5集在线观看免费好剧| 天天影视涩香欲综合网| 91日韩中文字幕| 久久伊99综合婷婷久久伊| 久久久国产精品久久久| 久久成人久久鬼色| 国产免费人做人爱午夜视频| 日韩午夜av| 人人妻人人澡人人爽欧美一区双 | 亚洲男人天堂网站| 免费观看黄色一级视频| 日韩欧美国产1| www.国产福利| aaa大片在线观看| 这里只有精品在线观看| 欧美少妇另类| 日韩精品在线观看一区二区| 欧美一级淫片免费视频魅影视频| 日韩欧美资源站| av一区二区三| 91精品国产综合久久久久久漫画| 中文字幕无线码一区| 欧美影视一区在线| 波多野结衣小视频| 在线观看视频一区二区| 久久久久久亚洲av无码专区| 一本色道久久综合亚洲aⅴ蜜桃| 日韩 欧美 综合| 精品日本美女福利在线观看| 成人午夜淫片100集| 精品欧美国产一区二区三区| 毛片视频网站在线观看| 欧美日在线观看| 亚洲成人第一网站| 欧洲av一区二区嗯嗯嗯啊| 最近中文字幕av| 6080yy午夜一二三区久久| 国产理论视频在线观看| 日韩欧美在线网站| 少妇高潮一区二区三区69| 亚洲欧美日韩中文在线| 国产福利小视频在线| 丝袜美腿亚洲一区二区| 蜜桃视频在线观看www社区| 成人97在线观看视频| 欧美xxxbbb| 欧美一级大片在线免费观看| 视频在线日韩| 午夜伊人狠狠久久| 国产美女在线一区| 国产精品亚洲综合久久| 欧美精品成人网| 狠狠色狠狠色综合| 91传媒理伦片在线观看| 久久久久久夜精品精品免费| 秋霞网一区二区三区| 亚洲美女在线国产| 久久国产精品免费看| 欧美亚洲图片小说| 成人黄色免费视频| 亚洲午夜久久久久久久| 国产激情在线观看| 欧美在线激情视频| 综合久草视频| 韩国精品一区二区三区六区色诱| 欧美日韩在线观看视频小说| 熟妇熟女乱妇乱女网站| 欧美一区 二区| 日韩偷拍一区二区| 欧美日韩一区二区三区四区不卡 | 亚洲裸体俱乐部裸体舞表演av| 日本成年人网址| 久99久精品视频免费观看| 久草免费资源站| 欧美激情中文字幕| 久久久久久天堂| 色婷婷av一区| 亚洲国产精彩视频| 国产一区二区三区毛片| 青春草在线免费视频| 国产精品久久久久久久久久三级 | 精品国产美女a久久9999| 91九色对白| av中文一区| 大伊香蕉精品视频在线| 蜜桃在线一区二区三区| 国模无码视频一区| 国产精品久久久久四虎| 精品91久久久| 91精品国产91热久久久做人人| 日本三级一区二区三区| 精品久久久久久久久久久久久久久| 成人免费在线电影| 久久琪琪电影院| www.成人| 五月婷婷一区| 欧美专区18| 日韩综合第一页| 亚洲久草在线视频| 亚洲图片在线播放| 亚洲男人的天堂网站| 国产在线观看www| av成人午夜| 亚洲a在线视频| 欧美成人黄色网址| 久久精品夜色噜噜亚洲a∨| 日韩av男人天堂| 精品精品国产高清a毛片牛牛| 米奇777四色精品人人爽| 国产精品视频自在线| 精品国产视频| 国内外免费激情视频| 337p粉嫩大胆噜噜噜噜噜91av| 日本特黄特色aaa大片免费| 日韩欧美在线123| 在线你懂的视频| 92看片淫黄大片看国产片| 国产精品99久久久久久动医院| 欧美色综合天天久久综合精品| 蜜桃91麻豆精品一二三区 | 99在线视频观看| 成人欧美一区二区三区在线| 久久国产精品亚洲人一区二区三区| 中文字幕欧美人妻精品一区| 久久一区二区三区国产精品| 国产又爽又黄的视频| 日韩成人在线播放| 美女视频在线免费| 久久久一本精品99久久精品| 亚洲欧美不卡| 新91视频在线观看| 在线精品视频一区二区三四| 福利片在线观看| 国产在线拍偷自揄拍精品| 久久美女精品| 波多野结衣在线免费观看| 一区二区视频在线| 成人爽a毛片一区二区| 91av国产在线| 沈樵精品国产成av片| 天天爽夜夜爽一区二区三区| 国产精品电影一区二区三区| 久草网站在线观看| 欧美一区二区视频在线观看 | 日韩美女视频免费在线观看| 自拍视频一区| 国产日韩欧美久久| 亚洲欧美视频在线观看视频| 亚洲第一天堂影院| 2020国产精品视频| 大色综合视频网站在线播放| 在线免费看污网站| 亚洲国产精品天堂| 欧美女子与性| 成人天堂噜噜噜| 韩日欧美一区| 欧美丰满美乳xxⅹ高潮www| 欧美精品少妇一区二区三区| 成全电影大全在线观看| 久热这里只精品99re8久| 久久精品理论片| 国产真实夫妇交换视频| 亚洲天堂男人的天堂| 日韩欧美一区二区在线观看| 噜噜爱69成人精品| 日本成人精品视频| 精品国免费一区二区三区| 日韩新的三级电影| 300部国产真实乱| 91蜜桃网址入口| 国产精品一区二区人人爽 | 久久久人成影片一区二区三区在哪下载| 亚洲欧美国产一区二区| 粉嫩13p一区二区三区| 波多野结衣不卡| 久久99亚洲精品| 欧美综合视频| 色综合久久五月| 91精品国产麻豆国产自产在线| 欧美大胆a人体大胆做受|