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

Spring Boot全局異常處理,這樣寫才優(yōu)雅...

開(kāi)發(fā) 后端
本篇文章主要介紹的是 Spring Boot 項(xiàng)目進(jìn)行全局異常的處理。

SpringBoot全局異常準(zhǔn)備

說(shuō)明:如果想直接獲取工程那么可以直接跳到底部,通過(guò)鏈接下載工程代碼。

開(kāi)發(fā)準(zhǔn)備

環(huán)境要求:

JDK:1.8

SpringBoot:1.5.17.RELEASE

首先還是Maven的相關(guān)依賴: 

  1. <properties>  
  2.       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
  3.       <java.version>1.8</java.version>  
  4.       <maven.compiler.source>1.8</maven.compiler.source>  
  5.       <maven.compiler.target>1.8</maven.compiler.target>  
  6. </properties>  
  7. <parent>  
  8.     <groupId>org.springframework.boot</groupId>  
  9.     <artifactId>spring-boot-starter-parent</artifactId>  
  10.     <version>1.5.17.RELEASE</version>  
  11.     <relativePath />  
  12. </parent>  
  13. <dependencies>  
  14.     <!-- Spring Boot Web 依賴 核心 -->  
  15.     <dependency>  
  16.         <groupId>org.springframework.boot</groupId>  
  17.         <artifactId>spring-boot-starter-web</artifactId>  
  18.     </dependency>  
  19.     <!-- Spring Boot Test 依賴 -->  
  20.     <dependency>  
  21.         <groupId>org.springframework.boot</groupId>  
  22.         <artifactId>spring-boot-starter-test</artifactId>  
  23.         <scope>test</scope>  
  24.     </dependency>  
  25.     <dependency>  
  26.         <groupId>com.alibaba</groupId>  
  27.         <artifactId>fastjson</artifactId>  
  28.         <version>1.2.41</version>  
  29.     </dependency>  
  30. </dependencies> 

配置文件這塊基本不需要更改,全局異常的處理只需在代碼中實(shí)現(xiàn)即可。

代碼編寫

SpringBoot的項(xiàng)目已經(jīng)對(duì)有一定的異常處理了,但是對(duì)于我們開(kāi)發(fā)者而言可能就不太合適了,因此我們需要對(duì)這些異常進(jìn)行統(tǒng)一的捕獲并處理。

SpringBoot中有一個(gè)ControllerAdvice的注解,使用該注解表示開(kāi)啟了全局異常的捕獲,我們只需在自定義一個(gè)方法使用ExceptionHandler注解然后定義捕獲異常的類型即可對(duì)這些捕獲的異常進(jìn)行統(tǒng)一的處理。

我們根據(jù)下面的這個(gè)示例來(lái)看該注解是如何使用吧。Spring Boot 基礎(chǔ)就不介紹了,看睛這個(gè):https://github.com/javastacks/spring-boot-best-practice

示例代碼: 

  1. @ControllerAdvice  
  2. public class MyExceptionHandler {  
  3.  @ExceptionHandler(value =Exception.class)  
  4.  public String exceptionHandler(Exception e){  
  5.   System.out.println("未知異常!原因是:"+e);  
  6.         return e.getMessage();  
  7.     }  

上述的示例中,我們對(duì)捕獲的異常進(jìn)行簡(jiǎn)單的二次處理,返回異常的信息,雖然這種能夠讓我們知道異常的原因,但是在很多的情況下來(lái)說(shuō),可能還是不夠人性化,不符合我們的要求。

那么我們這里可以通過(guò)自定義的異常類以及枚舉類來(lái)實(shí)現(xiàn)我們想要的那種數(shù)據(jù)吧。

自定義基礎(chǔ)接口類

首先定義一個(gè)基礎(chǔ)的接口類,自定義的錯(cuò)誤描述枚舉類需實(shí)現(xiàn)該接口。

代碼如下: 

  1. public interface BaseErrorInfoInterface {  
  2.   /** 錯(cuò)誤碼*/  
  3.   String getResultCode();  
  4.  /** 錯(cuò)誤描述*/  
  5.   String getResultMsg();  

自定義枚舉類

然后我們這里在自定義一個(gè)枚舉類,并實(shí)現(xiàn)該接口。

代碼如下: 

  1. public enum CommonEnum implements BaseErrorInfoInterface {  
  2.  // 數(shù)據(jù)操作錯(cuò)誤定義  
  3.  SUCCESS("200", "成功!"),   
  4.  BODY_NOT_MATCH("400","請(qǐng)求的數(shù)據(jù)格式不符!"),  
  5.  SIGNATURE_NOT_MATCH("401","請(qǐng)求的數(shù)字簽名不匹配!"),  
  6.  NOT_FOUND("404", "未找到該資源!"),   
  7.  INTERNAL_SERVER_ERROR("500", "服務(wù)器內(nèi)部錯(cuò)誤!"),  
  8.  SERVER_BUSY("503","服務(wù)器正忙,請(qǐng)稍后再試!")  
  9.  ;  
  10.  /** 錯(cuò)誤碼 */  
  11.  private String resultCode;  
  12.  /** 錯(cuò)誤描述 */  
  13.  private String resultMsg;  
  14.  CommonEnum(String resultCode, String resultMsg) {  
  15.   this.resultCode = resultCode;  
  16.   this.resultMsg = resultMsg;  
  17.  }  
  18.  @Override  
  19.  public String getResultCode() {  
  20.   return resultCode;  
  21.  }  
  22.  @Override  
  23.  public String getResultMsg() {  
  24.   return resultMsg; 
  25.   

自定義異常類

然后我們?cè)趤?lái)自定義一個(gè)異常類,用于處理我們發(fā)生的業(yè)務(wù)異常。

代碼如下: 

  1. public class BizException extends RuntimeException {  
  2.  private static final long serialVersionUID = 1L 
  3.  /**  
  4.   * 錯(cuò)誤碼  
  5.   */  
  6.  protected String errorCode;  
  7.  /**  
  8.   * 錯(cuò)誤信息  
  9.   */  
  10.  protected String errorMsg;  
  11.  public BizException() {  
  12.   super();  
  13.  }  
  14.  public BizException(BaseErrorInfoInterface errorInfoInterface) {  
  15.   super(errorInfoInterface.getResultCode());  
  16.   this.errorCode = errorInfoInterface.getResultCode();  
  17.   this.errorMsg = errorInfoInterface.getResultMsg();  
  18.  }  
  19.  public BizException(BaseErrorInfoInterface errorInfoInterface, Throwable cause) {  
  20.   super(errorInfoInterface.getResultCode(), cause);  
  21.   this.errorCode = errorInfoInterface.getResultCode();  
  22.   this.errorMsg = errorInfoInterface.getResultMsg();  
  23.  }  
  24.  public BizException(String errorMsg) {  
  25.   super(errorMsg);  
  26.   this.errorMsg = errorMsg;  
  27.  }  
  28.  public BizException(String errorCode, String errorMsg) {  
  29.   super(errorCode);  
  30.   this.errorCode = errorCode;  
  31.   this.errorMsg = errorMsg;  
  32.  }  
  33.  public BizException(String errorCode, String errorMsg, Throwable cause) {  
  34.   super(errorCode, cause);  
  35.   this.errorCode = errorCode;  
  36.   this.errorMsg = errorMsg;  
  37.  }   
  38.  public String getErrorCode() {  
  39.   return errorCode;  
  40.  }  
  41.  public void setErrorCode(String errorCode) {  
  42.   this.errorCode = errorCode;  
  43.  }  
  44.  public String getErrorMsg() {  
  45.   return errorMsg;  
  46.  }  
  47.  public void setErrorMsg(String errorMsg) {  
  48.   this.errorMsg = errorMsg;  
  49.  }  
  50.  public String getMessage() {  
  51.   return errorMsg;  
  52.  }  
  53.  @Override  
  54.  public Throwable fillInStackTrace() {  
  55.   return this; 
  56.  }  

自定義數(shù)據(jù)格式

順便這里我們定義一下數(shù)據(jù)的傳輸格式。

代碼如下: 

  1. public class ResultBody {  
  2.  /**  
  3.   * 響應(yīng)代碼  
  4.   */  
  5.  private String code;  
  6.  /**  
  7.   * 響應(yīng)消息  
  8.   */  
  9.  private String message;  
  10.  /** 
  11.   * 響應(yīng)結(jié)果  
  12.   */  
  13.  private Object result;  
  14.  public ResultBody() {  
  15.  }  
  16.  public ResultBody(BaseErrorInfoInterface errorInfo) {  
  17.   this.code = errorInfo.getResultCode();  
  18.   this.message = errorInfo.getResultMsg();  
  19.  }  
  20.  public String getCode() {  
  21.   return code; 
  22.  }  
  23.  public void setCode(String code) {  
  24.   this.code = code;  
  25.  }  
  26.  public String getMessage() {  
  27.   return message; 
  28.  }  
  29.  public void setMessage(String message) {  
  30.   this.message = message;  
  31.  }  
  32.  public Object getResult() { 
  33.   return result; 
  34.  }  
  35.  public void setResult(Object result) {  
  36.   this.result = result;  
  37.  }  
  38.  /**  
  39.   * 成功  
  40.   *   
  41.   * @return  
  42.   */  
  43.  public static ResultBody success() {  
  44.   return success(null);  
  45.  }  
  46.  /**  
  47.   * 成功  
  48.   * @param data  
  49.   * @return  
  50.   */  
  51.  public static ResultBody success(Object data) {  
  52.   ResultBody rb = new ResultBody();  
  53.   rb.setCode(CommonEnum.SUCCESS.getResultCode());  
  54.   rb.setMessage(CommonEnum.SUCCESS.getResultMsg());  
  55.   rb.setResult(data);  
  56.   return rb;  
  57.  }  
  58.  /**  
  59.   * 失敗  
  60.   */  
  61.  public static ResultBody error(BaseErrorInfoInterface errorInfo) {  
  62.   ResultBody rb = new ResultBody();  
  63.   rb.setCode(errorInfo.getResultCode());  
  64.   rb.setMessage(errorInfo.getResultMsg());  
  65.   rb.setResult(null);  
  66.   return rb;  
  67.  }  
  68.  /**  
  69.   * 失敗  
  70.   */  
  71.  public static ResultBody error(String code, String message) {  
  72.   ResultBody rb = new ResultBody();  
  73.   rb.setCode(code);  
  74.   rb.setMessage(message);  
  75.   rb.setResult(null);  
  76.   return rb;  
  77.  }  
  78.  /**  
  79.   * 失敗  
  80.   */  
  81.  public static ResultBody error( String message) {  
  82.   ResultBody rb = new ResultBody();  
  83.   rb.setCode("-1");  
  84.   rb.setMessage(message);  
  85.   rb.setResult(null);  
  86.   return rb;  
  87.  }  
  88.  @Override  
  89.  public String toString() {  
  90.   return JSONObject.toJSONString(this);  
  91.  }  

自定義全局異常處理類

最后我們?cè)趤?lái)編寫一個(gè)自定義全局異常處理的類。

代碼如下: 

  1. @ControllerAdvice  
  2. public class GlobalExceptionHandler {  
  3.  private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);   
  4.  /**  
  5.   * 處理自定義的業(yè)務(wù)異常  
  6.   * @param req  
  7.   * @param e  
  8.   * @return  
  9.   */  
  10.     @ExceptionHandler(value = BizException.class)   
  11.     @ResponseBody    
  12.  public  ResultBody bizExceptionHandler(HttpServletRequest req, BizException e){  
  13.      logger.error("發(fā)生業(yè)務(wù)異常!原因是:{}",e.getErrorMsg());  
  14.      return ResultBody.error(e.getErrorCode(),e.getErrorMsg());  
  15.     }  
  16.  /**  
  17.   * 處理空指針的異常  
  18.   * @param req  
  19.   * @param e  
  20.   * @return  
  21.   */  
  22.  @ExceptionHandler(value =NullPointerException.class)  
  23.  @ResponseBody 
  24.  public ResultBody exceptionHandler(HttpServletRequest req, NullPointerException e){  
  25.   logger.error("發(fā)生空指針異常!原因是:",e); 
  26.   return ResultBody.error(CommonEnum.BODY_NOT_MATCH);  
  27.  }  
  28.     /**  
  29.         * 處理其他異常  
  30.      * @param req  
  31.      * @param e  
  32.      * @return  
  33.      */  
  34.     @ExceptionHandler(value =Exception.class)  
  35.  @ResponseBody  
  36.  public ResultBody exceptionHandler(HttpServletRequest req, Exception e){  
  37.      logger.error("未知異常!原因是:",e);  
  38.         return ResultBody.error(CommonEnum.INTERNAL_SERVER_ERROR);  
  39.     }  

因?yàn)檫@里我們只是用于做全局異常處理的功能實(shí)現(xiàn)以及測(cè)試,所以這里我們只需在添加一個(gè)實(shí)體類和一個(gè)控制層類即可。

實(shí)體類

又是萬(wàn)能的用戶表 (▽)

代碼如下: 

  1. public class User implements Serializable{  
  2.  private static final long serialVersionUID = 1L 
  3.  /** 編號(hào) */  
  4.   private int id;  
  5.   /** 姓名 */  
  6.   private String name;  
  7.   /** 年齡 */  
  8.   private int age;   
  9.   public User(){  
  10.   }  
  11.  public int getId() {  
  12.   return id;  
  13.  }   
  14.  public void setId(int id) {  
  15.   this.id = id;  
  16.  }  
  17.  public String getName() {  
  18.   return name;  
  19.  } 
  20.  public void setName(String name) {  
  21.   this.name = name;  
  22.  } 
  23.  public int getAge() {  
  24.   return age;  
  25.  } 
  26.  public void setAge(int age) {  
  27.   this.age = age;  
  28.  }  
  29.  public String toString() {  
  30.   return JSONObject.toJSONString(this);  
  31.  }  

Controller 控制層

控制層這邊也比較簡(jiǎn)單,使用Restful風(fēng)格實(shí)現(xiàn)的CRUD功能,不同的是這里我故意弄出了一些異常,好讓這些異常被捕獲到然后處理。這些異常中,有自定義的異常拋出,也有空指針的異常拋出,當(dāng)然也有不可預(yù)知的異常拋出(這里我用類型轉(zhuǎn)換異常代替),那么我們?cè)谕瓿纱a編寫之后,看看這些異常是否能夠被捕獲處理成功吧!

代碼如下: 

  1. @RestController  
  2. @RequestMapping(value = "/api" 
  3. public class UserRestController {  
  4.  @PostMapping("/user")  
  5.     public boolean insert(@RequestBody User user) {  
  6.      System.out.println("開(kāi)始新增...");  
  7.      //如果姓名為空就手動(dòng)拋出一個(gè)自定義的異常!  
  8.         if(user.getName()==null){  
  9.             throw  new BizException("-1","用戶姓名不能為空!");  
  10.         }  
  11.         return true;  
  12.     }  
  13.     @PutMapping("/user")  
  14.     public boolean update(@RequestBody User user) {  
  15.      System.out.println("開(kāi)始更新...");  
  16.        //這里故意造成一個(gè)空指針的異常,并且不進(jìn)行處理  
  17.         String str=null 
  18.         str.equals("111");  
  19.         return true;  
  20.     }  
  21.     @DeleteMapping("/user")  
  22.     public boolean delete(@RequestBody User user)  {  
  23.         System.out.println("開(kāi)始刪除...");  
  24.         //這里故意造成一個(gè)異常,并且不進(jìn)行處理  
  25.         Integer.parseInt("abc123");  
  26.         return true;  
  27.     }  
  28.     @GetMapping("/user")  
  29.     public List<User> findByUser(User user) {  
  30.      System.out.println("開(kāi)始查詢...");  
  31.         List<User> userList =new ArrayList<>();  
  32.         User user2=new User();  
  33.         user2.setId(1L);  
  34.         user2.setName("xuwujing"); 
  35.         user2.setAge(18);  
  36.         userList.add(user2);  
  37.         return userList;  
  38.     }  

App 入口

和普通的SpringBoot項(xiàng)目基本一樣。

代碼如下: 

  1. @SpringBootApplication  
  2. public class App  
  3.  
  4.     public static void main( String[] args )  
  5.     {  
  6.       SpringApplication.run(App.class, args);  
  7.       System.out.println("程序正在運(yùn)行...");  
  8.     }  

功能測(cè)試

我們成功啟動(dòng)該程序之后,使用Postman工具來(lái)進(jìn)行接口測(cè)試。

首先進(jìn)行查詢,查看程序正常運(yùn)行是否ok,使用GET 方式進(jìn)行請(qǐng)求。

GET http://localhost:8181/api/user

返回參數(shù)為:

{"id":1,"name":"xuwujing","age":18}

示例圖:

可以看到程序正常返回,并沒(méi)有因自定義的全局異常而影響。

然后我們?cè)賮?lái)測(cè)試下自定義的異常是否能夠被正確的捕獲并處理。

使用POST方式進(jìn)行請(qǐng)求

POST http://localhost:8181/api/user

Body參數(shù)為:

{"id":1,"age":18}

返回參數(shù)為:

{"code":"-1","message":"用戶姓名不能為空!","result":null}

示例圖:

可以看出將我們拋出的異常進(jìn)行數(shù)據(jù)封裝,然后將異常返回出來(lái)。

然后我們?cè)賮?lái)測(cè)試下空指針異常是否能夠被正確的捕獲并處理。在自定義全局異常中,我們除了定義空指針的異常處理,也定義最高級(jí)別之一的Exception異常,那么這里發(fā)生了空指針異常之后,它是回優(yōu)先使用哪一個(gè)呢?這里我們來(lái)測(cè)試下。

使用PUT方式進(jìn)行請(qǐng)求。

PUT http://localhost:8181/api/user

Body參數(shù)為:

{"id":1,"age":18}

返回參數(shù)為:

{"code":"400","message":"請(qǐng)求的數(shù)據(jù)格式不符!","result":null}

示例圖:

我們可以看到這里的的確是返回空指針的異常護(hù)理,可以得出全局異常處理優(yōu)先處理子類的異常。

那么我們?cè)趤?lái)試試未指定其異常的處理,看該異常是否能夠被捕獲。

使用DELETE方式進(jìn)行請(qǐng)求。

DELETE http://localhost:8181/api/user

Body參數(shù)為:

{"id":1}

返回參數(shù)為:

{"code":"500","message":"服務(wù)器內(nèi)部錯(cuò)誤!","result":null}

這里可以看到它使用了我們?cè)谧远x全局異常處理類中的Exception異常處理的方法。

到這里,測(cè)試就結(jié)束了。

順便再說(shuō)一下,自義定全局異常處理除了可以處理上述的數(shù)據(jù)格式之外,也可以處理頁(yè)面的跳轉(zhuǎn),只需在新增的異常方法的返回處理上填寫該跳轉(zhuǎn)的路徑并不使用ResponseBody 注解即可。

細(xì)心的同學(xué)也許發(fā)現(xiàn)了在GlobalExceptionHandler類中使用的是ControllerAdvice注解,而非RestControllerAdvice注解,如果是用的RestControllerAdvice注解,它會(huì)將數(shù)據(jù)自動(dòng)轉(zhuǎn)換成JSON格式,這種于Controller和RestController類似,所以我們?cè)谑褂萌之惓L幚淼闹罂梢赃M(jìn)行靈活的選擇處理。

 

責(zé)任編輯:龐桂玉 來(lái)源: Java技術(shù)棧
相關(guān)推薦

2020-03-16 17:20:02

異常處理Spring Boot

2024-10-16 12:23:55

技巧Spring驗(yàn)證

2022-10-26 07:14:25

Spring 6Spring業(yè)務(wù)

2019-01-24 16:11:19

前端全局異常數(shù)據(jù)校驗(yàn)

2024-08-02 09:15:22

Spring捕捉格式

2025-02-07 09:11:04

JSON對(duì)象策略

2025-09-22 09:31:34

2022-04-08 16:27:48

SpringBoot異常處理

2025-02-05 14:28:19

2017-07-07 16:57:35

代碼Python

2017-06-26 09:40:50

Python代碼寫法

2023-08-01 08:54:02

接口冪等網(wǎng)絡(luò)

2023-10-10 13:23:18

空指針異常Java

2024-09-27 12:27:31

2024-10-28 08:32:22

統(tǒng)一接口響應(yīng)SpringBoot響應(yīng)框架

2025-07-29 02:15:00

2024-12-18 16:19:51

2022-03-04 08:31:07

Spring異常處理

2021-04-30 07:34:01

Spring BootController項(xiàng)目

2025-02-13 00:34:22

Spring對(duì)象系統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

蜜桃视频久久一区免费观看入口| 国产经典一区二区三区| 久久一区免费| 日本不卡一区视频| 色噜噜成人av在线| 亚洲综合丁香婷婷六月香| 精品国产乱码久久久久久郑州公司 | 激情综合亚洲精品| 性日韩欧美在线视频| 中文字幕第24页| 91夜夜蜜桃臀一区二区三区| 一本久道中文字幕精品亚洲嫩| 你懂的网址国产 欧美| 欧美顶级少妇做爰| 日日橹狠狠爱欧美超碰| a网站在线观看| 午夜亚洲福利在线老司机| 亚洲的天堂在线中文字幕| 成人在线观看a| 欧美另类自拍| 国产精品99久久久久久似苏梦涵 | 亚洲国产成人精品久久| 亚洲激情在线观看视频| www.九色在线| 亚洲精品国产高清久久伦理二区| 日本在线观看一区二区| 成人午夜淫片100集| 最新精品国产| 日韩在线视频免费观看| 中文字幕一区二区人妻在线不卡| 国产麻豆一区二区三区| 欧美影院一区二区| 亚洲国产婷婷香蕉久久久久久99| 蜜桃久久一区二区三区| 国产乱对白刺激视频不卡| 欧美乱大交做爰xxxⅹ性3| 人妻av无码一区二区三区| 精品视频自拍| 日韩久久久精品| 亚洲精品综合在线观看| 91综合国产| 亚洲青青青在线视频| 不卡一卡2卡3卡4卡精品在| 怡红院男人的天堂| 天堂资源在线中文精品| 日韩视频在线观看免费| 日本性高潮视频| 蜜桃一区二区三区| 日韩国产激情在线| 日本黄色片在线播放| 卡通欧美亚洲| 日韩人在线观看| 午夜精品久久久久久久无码| а√天堂中文在线资源8| 免费av网站在线看| 欧美特黄一级大片| 日韩精品视频观看| 免费a级黄色片| 亚洲人和日本人hd| 亚洲欧美日韩精品久久| 亚洲乱码国产乱码精品精大量| 超碰97久久国产精品牛牛| 欧美va天堂va视频va在线| 91porn在线| 成午夜精品一区二区三区软件| 日韩欧美国产综合| 国产精品一区二区无码对白| 97久久综合区小说区图片区| 精品国产凹凸成av人网站| 无码国产精品一区二区免费式直播| 中文字幕区一区二区三| 日韩h在线观看| 成人在线一级片| 久久国产亚洲| 欧美精品一区二区免费| 国产在线拍揄自揄拍无码视频| 9久re热视频在线精品| 热99在线视频| 91国偷自产中文字幕久久| 国产老妇另类xxxxx| 国产一区二区三区四区hd| 2020最新国产精品| 美女视频一区免费观看| 欧美一级bbbbb性bbbb喷潮片| 亚洲精品www久久久久久| 亚洲综合精品| 国产乱子伦一区二区三区国色天香| 国产精品福利在线| 精品久久久久av| jizz中文字幕| 成人在线免费小视频| 蜜臀久久99精品久久久无需会员 | 久久网站免费观看| 色丁香久综合在线久综合在线观看| 正义之心1992免费观看全集完整版| 激情在线小视频| 午夜欧美2019年伦理| 无码少妇一区二区三区芒果| 欧美9999| 亚洲天堂男人的天堂| 校园春色 亚洲| 久久精品人人做人人爽电影蜜月| 成人xxxxx| 五月激情六月婷婷| 成人三级伦理片| 日本不卡二区高清三区| 自由的xxxx在线视频| 色婷婷国产精品久久包臀| 在线观看免费看片| 国产免费av一区二区三区| 欧美激情第6页| 在线免费看av片| 91色|porny| 日本福利视频在线观看| jvid一区二区三区| 日韩黄色av网站| 色偷偷av一区二区三区| 污污内射在线观看一区二区少妇| 99精品视频在线| 欧美中文字幕视频在线观看| 精品国产免费无码久久久| 国产日韩一级二级三级| 欧美视频在线观看视频| 欧洲精品久久久久毛片完整版| 亚洲国产精品女人久久久| 初高中福利视频网站| 国产99精品一区| 午夜精品一区二区三区在线视| 在线免费a视频| 久久精品人人做人人爽97| 日本a视频在线观看| 国产精品亚洲一区二区在线观看| 亚洲网站视频福利| 男女啊啊啊视频| 成人av先锋影音| 精品一区二区三区毛片| 日韩一区二区三免费高清在线观看| 亚洲男人天堂久| 国产精品一区二区三区四| 成人免费毛片aaaaa**| 美女av免费观看| 国产午夜亚洲精品一级在线| 色久欧美在线视频观看| 亚洲中文无码av在线| 久久九九久久九九| 国产三级日本三级在线播放| 国产精品美女久久久久久不卡| 2020久久国产精品| 日本又骚又刺激的视频在线观看| 欧美日韩国产精品| 成人免费黄色网| 色天使在线视频| 欧美日韩日本国产亚洲在线| 亚洲自拍欧美色图| 日本aa在线| 欧美精品一区二区三区很污很色的| 九九视频在线观看| 日韩午夜免费| 国精产品一区二区| 欧美日韩国产观看视频| 欧美日韩中文另类| xxxxwww一片| 精品国产乱码久久久久久牛牛 | av伦理在线| 精品美女一区二区| 一级片免费网址| 91美女视频网站| 欧美婷婷精品激情| 久久精品亚洲欧美日韩精品中文字幕| 91美女福利视频高清| 日韩三级电影视频| 亚洲国产美女久久久久| 日韩精品一区二区亚洲av| 久久久久久久久久久99999| caopor在线视频| 国产精品精品| 国严精品久久久久久亚洲影视| 久久久久成人精品无码中文字幕| 日韩在线第七页| 亚洲va欧美va国产综合久久| 韩国成人免费视频| 男人天堂亚洲二区| 亚洲综合视频网| 粉嫩av懂色av蜜臀av分享| 久久精品免费| 国产精品久久久影院| 老司机精品在线| 国产精品激情av在线播放 | 国产日产欧产精品推荐色| 亚洲午夜精品一区| 亚洲一区电影| 91国产视频在线| 在线播放麻豆| 亚洲福利视频网| 在线观看免费观看在线| 亚洲第一综合色| 国产99在线 | 亚洲| 国产成人精品www牛牛影视| 999精品网站| 国产精品s色| 日韩精品久久一区| 福利电影一区| 国产美女精品免费电影| 操喷在线视频| 综合136福利视频在线| 三级在线观看网站| 欧美一区二区啪啪| 久久精品国产亚洲av麻豆蜜芽| 一区2区3区在线看| 国产经典自拍视频在线观看| 你懂的一区二区三区| 国产精品久久久久久久久久新婚 | 久久国产精品久久久久久| 久草福利在线视频| 亚洲成人激情在线| 亚洲最大成人在线视频| 精品日韩视频在线观看| 男人操女人的视频网站| 中文字幕精品在线不卡| www.88av| 国产aⅴ综合色| 波多野结衣国产精品| 久久一综合视频| 成人免费播放器| 欧美黄色一区二区| 中国人体摄影一区二区三区| 亚洲综合图色| 鲁丝一区二区三区免费| 成人中文字幕视频| 97人人香蕉| 国产在线视频欧美一区| 国产欧美韩国高清| 日本精品网站| 日韩av片永久免费网站| 国产传媒在线观看| 97在线视频精品| 国产精品国精产品一二| 欧美乱大交xxxxx另类电影| 大地资源网3页在线观看| 日韩一区二区在线视频| 成人av一区| 在线观看精品自拍私拍| 免费一级毛片在线观看| 亚洲美女黄色片| 欧美日韩在线一二三| 超碰成人在线免费| 国产成人精品免费视频大全最热| 精品国产一区二区三区2021| 91免费在线视频| 九色精品蝌蚪| 福利视频久久| 久久久伦理片| 蜜桃麻豆91| 好吊色一区二区| 欧美私人啪啪vps| 亚洲日本japanese丝袜| 青青草成人影院| 中文字幕一区综合| 艳女tv在线观看国产一区| 日本xxx免费| 很黄很黄激情成人| 欧美日韩性生活片| 久久影院亚洲| 亚洲天堂2018av| 国产成人日日夜夜| 天天躁日日躁狠狠躁av麻豆男男 | 好吊妞www.84com只有这里才有精品| 中文字幕一区二区三区四区久久 | 国产一区二区三区四区五区传媒| 手机在线观看国产精品| 欧美激情理论| 男人添女荫道口女人有什么感觉| 国产日韩免费| 一本色道久久亚洲综合精品蜜桃| 国产又粗又猛又爽又黄91精品| 国产一精品一aⅴ一免费| 26uuu久久综合| 视频国产一区二区| 性做久久久久久久久| 尤物视频免费观看| 91精品免费在线观看| 日本波多野结衣在线| 一本色道久久综合狠狠躁篇的优点| 老司机福利在线视频| 亚洲91av视频| 自拍偷拍欧美日韩| 久久99精品久久久久久三级| 人狥杂交一区欧美二区| 国产精品久久久久久av| 国产精一区二区| 欧美日韩国产免费一区二区三区| 中文字幕第一页在线视频| 亚洲美洲欧洲综合国产一区| 天天色综合社区| 成人免费精品视频| 日本美女bbw| 一区二区三区欧美激情| 日本免费精品视频| 欧美一区二区黄| 国产一级二级三级在线观看| 欧美日韩成人在线播放| 日韩免费电影| 99视频免费观看| 日韩啪啪电影网| aa在线免费观看| 国产不卡视频在线观看| 亚洲一二三精品| 欧美日韩亚洲一区二区三区| 国产高清免费在线观看| 在线播放日韩欧美| 美女扒开腿让男人桶爽久久软| 成人精品久久一区二区三区| 欧美激情在线免费| youjizz.com在线观看| 精品一二三四区| 国产激情在线免费观看| 亚洲国产日日夜夜| 97国产精品久久久| 亚洲偷欧美偷国内偷| 牛牛精品一区二区| 成人区精品一区二区| 国产精品黑丝在线播放| 日日躁夜夜躁aaaabbbb| 国产欧美日韩精品在线| 国产精品乱子伦| 亚洲激情久久久| 狂野欧美激情性xxxx欧美| 91精品视频在线| 久久免费av| 一区二区xxx| 国产夜色精品一区二区av| 国产欧美日韩另类| 男女av一区三区二区色多| 国产精品入口免费| 欧美日韩91| 亚洲国产欧美日韩在线| 亚洲男帅同性gay1069| 国产精品无码一区二区桃花视频| 中文在线资源观看视频网站免费不卡| 成人性教育av免费网址| 久久精品日产第一区二区三区乱码| 影音先锋中文字幕一区| 亚洲色偷偷色噜噜狠狠99网| 亚洲18色成人| 日韩三级电影网| 欧美在线激情网| 欧美猛男同性videos| 无码内射中文字幕岛国片| 国产喷白浆一区二区三区| 久久精品偷拍视频| 中文字幕日韩欧美精品在线观看| 国产69精品久久| 好吊色这里只有精品| 国产一区二区三区国产| 久久av高潮av无码av喷吹| 欧美成人猛片aaaaaaa| 97在线超碰| 欧美日韩一区二区视频在线观看| 日韩国产精品久久久| 国产精品18在线| 欧美变态tickle挠乳网站| 国产91足控脚交在线观看| 精品无人区一区二区三区竹菊 | 欧美俄罗斯性视频| 国产精品欧美大片| 久久9精品区-无套内射无码| 国产欧美日韩在线看| 国产精品欧美久久久久天天影视| 欧美大片免费观看| 日韩欧美四区| 性刺激的欧美三级视频| 亚洲美女在线国产| 天天操天天操天天| 国产精品夫妻激情| 中文字幕一区二区三三| 国产人成视频在线观看| 色菇凉天天综合网| av免费在线网站| 欧美极品一区| 国产麻豆91精品| 午夜毛片在线观看| 日韩亚洲精品电影| 久久99国产精品久久99大师 | 国产又粗又长又爽视频| 成人国产精品免费网站| 国内av在线播放| 久久久免费精品| 成人vr资源| 亚洲激情 欧美| 亚洲国产91视频| 六月婷婷激情网| 久久久久久亚洲综合| 99久久久国产精品无码网爆| 91av在线国产| 911久久香蕉国产线看观看| 中文在线观看免费视频| 欧美日韩dvd在线观看| 福利影院在线看| 粉嫩高清一区二区三区精品视频 | 久久亚洲免费视频|