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

干掉if..else!Spring Boot+aviator+aop 太絲滑了!

開發 前端
aviator本來是一個輕量級、高性能的基于JVM的表達式引擎。不過從5.0.0版本開始,aviator升級成為了aviatorScript,成為一個高性能、輕量級寄宿于 JVM (包括 Android 平臺)之上的腳本語言。

aviator本來是一個輕量級、高性能的基于JVM的表達式引擎。不過從5.0.0版本開始,aviator升級成為了aviatorScript,成為一個高性能、輕量級寄宿于 JVM (包括 Android 平臺)之上的腳本語言。

根據官網的介紹,aviator支持的主要特性:

  1. 支持數字、字符串、正則表達式、布爾值、正則表達式等基本類型,完整支持所有 Java 運算符及優先級等。
  2. 函數是一等公民,支持閉包和函數式編程
  3. 內置 bigint/decimal類型用于大整數和高精度運算,支持運算符重載得以讓這些類型使用普通的算術運算符 +-*/ 參與運算。
  4. 完整的腳本語法支持,包括多行數據、條件語句、循環語句、詞法作用域和異常處理等。
  5. 函數式編程結合 Sequence 抽象,便捷處理任何集合。
  6. 輕量化的模塊系統。
  7. 多種方式,方便地調用 Java 方法,完整支持 Java 腳本 API(方便從 Java 調用腳本)。
  8. 豐富的定制選項,可作為安全的語言沙箱和全功能語言使用。
  9. 輕量化,高性能,ASM 模式下通過直接將腳本翻譯成 JVM 字節碼,解釋模式可運行于 Android 等非標 Java 平臺。

使用場景包括:

  1. 規則判斷及規則引擎
  2. 公式計算
  3. 動態腳本控制
  4. 集合數據 ELT 等

Aviator的限制

  • 沒有if else、do while等語句,沒有賦值語句,僅支持邏輯表達式、算術表達式、三元表達式和正則匹配。
  • 不支持八進制數字字面量,僅支持十進制和十六進制數字字面量。

aviator基本使用

基本表達式

要使用aviator,只需要添加相應依賴:

<dependency>
    <groupId>com.googlecode.aviator</groupId>
    <artifactId>aviator</artifactId>
    <version>5.3.3</version>
</dependency>

然后就可以進行表達式求值了:

// 返回值為16
Long r = (Long) AviatorEvaluator.execute("2 * (3 + 5)");

為了提升性能,往往先編譯表達式,然后可以反復執行,進行表達式求值:

Expression expression = AviatorEvaluator.compile("2 * (3 + 5)");
Long r = (Long) expression.execute();

aviator支持數字、字符串、布爾值等基本數據類型,數字類型值都當作long或double類型處理。關注工眾號:碼猿技術專欄,回復關鍵詞:1111  獲取阿里內部java性能調優手冊!所以上面例子的求值結果是Long。

aviator表達式支持大部分的運算操作符,如常用的算術運算操作符(+、-、*、/、%)、邏輯運算操作符(&&、||、!)、比較運算操作符(>、>=、==、!=、<、<=)、位運算操作符(&、|、^、<<、>>)和優先級操作符,還支持三元操作表達(?:)、正則表達式(=~)。

一些例子:

// 返回 hello world
    String r = (String) AviatorEvaluator.execute("'hello' + ' world'");
    
    // 返回 true
    Boolean r = (Boolean) AviatorEvaluator.execute("100 > 80 && 30 < 40");
    
    // 三元表達式,返回 30
    Long r = (Long) AviatorEvaluator.execute("100 > 80 ? 30 : 40");
    
    // 正則表達式,正則表達式放在//之間,返回 true
    Boolean r = (Boolean) AviatorEvaluator.execute("'hello' =~ /[\\w]+/");

表達式變量

跟其他表達式引擎一樣,aviator也是支持表達式求值時傳入參數的:

Long a = 12L;
Boolean r = (Boolean) AviatorEvaluator.exec("a > 10", a);

參數也可以是一個列表,如下:

List<Long> a = new ArrayList<>();
a.add(12L);
a.add(20L);
Boolean r = (Boolean) AviatorEvaluator.exec("a[0] > 10", a);

也可以是一個對象:

public static class Person {
        private String name;
        private Integer age;
    }

Person a = new Person("movee", 25);
Boolean r = (Boolean) AviatorEvaluator.exec("a.age > 10", a);

跟一般地,aviator會將參數放到一個map中

Map<String, Object> env = new HashMap<>();
env.put("person", new Person("movee", 25));
env.put("a", 20L);
Object result = AviatorEvaluator.execute("person.name", env);

這樣一來,aviator可以非常方便的從json字符串中提取子json字符串

String jsonStr = """
        {
            "a": {
                "b": [
                        {
                            "x": 3
                        },
                        {
                            "x": 4
                        }
                    ]
            }
        }
        """;


    JSONObject jsonObj = new JSONObject(jsonStr);
    // 結果返回 3
    Object value = AviatorEvaluator.execute("a.b[0]['x']", jsonObj.toMap());

使用函數

aviator已經提供了很多開箱即用的函數了:

// 返回4
    Long r = (Long) AviatorEvaluator.execute("math.round(4.3)");
    
    // 返回5
    Long r = (Long) AviatorEvaluator.execute("string.length('hello')");
    
    // 返回一個ArrayList:[1,2,3]
    Object r = AviatorEvaluator.execute("seq.list(1,2,3)");

更詳細的內置函數列表請參考:aviator函數庫列表

我們也可以自定義一個java函數,自己編寫一個類,繼承aviator的AbstractFunction類,然后實現相應的方法即可:

public class AddFunction extends AbstractFunction {

        /**
         * 函數實現的功能
         * @param env 參數
         * @param arg1 函數的第一個參數
         * @param arg2 函數的第二個參數
         * @return 返回值
         */
        @Override
        public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2) {
            long num1 = FunctionUtils.getNumberValue(arg1, env).longValue();
            long num2 = FunctionUtils.getNumberValue(arg2, env).longValue();
            return AviatorLong.valueOf(num1+num2);
        }

        /**
         * 注冊到aviator的名字
         * @return 函數名字
         */
        @Override
        public String getName() {
            return"add";
        }
    }

然后就可以注冊到aviator中,關注工眾號:碼猿技術專欄,回復關鍵詞:1111  獲取阿里內部java性能調優手冊!像使用內置函數一樣使用自定義函數:

// 注冊
    AviatorEvaluator.addFunction(new AddFunction());
    
    // 使用
    long sum = (Long) AviatorEvaluator.getInstance().execute("add(3,4)");

aviatorScript腳本

aviator已經升級為一個腳本語言,所以不僅僅能進行表達式求值,還可以執行腳本程序。

// 返回1
    Object r = AviatorEvaluator.execute("if (true) { return 1; } else { return 2; }");

aviatorScript腳本一般放到獨立的腳本文件中,文件名后綴一般為.av

例如,我們編寫一個hello.av腳本文件,內容為:

if (a > 10) {
    return 10;
} else {
    return a;
}

然后就可以執行該腳本文件,并傳入參數a的值:

Map<String, Object> env = new HashMap<>();
    env.put("a", 30);
    Expression exp = AviatorEvaluator.getInstance().compileScript("./hello.av", true);
    Object result = exp.execute(env);

實操

利用aviator+aop實現參數校驗

pom.xml

<?xml versinotallow="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springboot-demo</artifactId>
        <groupId>com.et</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>Aviator</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--AOP-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

        <!--Aviator-->
        <dependency>
            <groupId>com.googlecode.aviator</groupId>
            <artifactId>aviator</artifactId>
            <version>3.3.0</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.56</version>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.8.1</version>
        </dependency>

    </dependencies>
</project>

controller

在方法上加上aviator校驗規則。

package com.et.controller;

import com.et.annotation.Check;
import com.et.exception.HttpResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

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

@RestController
publicclass HelloWorldController {
    @RequestMapping("/hello")
    public Map<String, Object> showHelloWorld(){
        Map<String, Object> map = new HashMap<>();
        map.put("msg", "HelloWorld");
        return map;
    }
    @GetMapping("/simple")
    @Check(ex = "name != null", msg = "Name cannot be empty")
    @Check(ex = "age != null", msg = "Age cannot be empty")
    @Check(ex = "age > 18", msg = "Age must be over 18 years old")
    @Check(ex = "phone != null", msg = "phone cannot be empty")
    @Check(ex = "phone =~ /^(1)[0-9]{10}$/", msg = "The phone number format is incorrect")
    @Check(ex = "string.startsWith(phone,\"1\")", msg = "The phone number must start with 1")
    @Check(ex = "idCard != null", msg = "ID number cannot be empty")
    @Check(ex = "idCard =~ /^[1-9]\\d{5}[1-9]\\d{3}((0[1-9])||(1[0-2]))((0[1-9])||(1\\d)||(2\\d)||(3[0-1]))\\d{3}([0-9]||X)$/", msg = "ID number format is incorrect")
    @Check(ex = "gender == 1", msg = "sex")
    @Check(ex = "date =~ /^[1-9][0-9]{3}-((0)[1-9]|(1)[0-2])-((0)[1-9]|[1,2][0-9]|(3)[0,1])$/", msg = "Wrong date format")
    @Check(ex = "date > '2019-12-20 00:00:00:00'", msg = "The date must be greater than 2019-12-20")
    public HttpResult simple(String name, Integer age, String phone, String idCard, String date) {
        System.out.println("name = " + name);
        System.out.println("age = " + age);
        System.out.println("phone = " + phone);
        System.out.println("idCard = " + idCard);
        System.out.println("date = " + date);
        return HttpResult.success();
    }
}

annotation

單個規則注解;

package com.et.annotation;

import java.lang.annotation.*;


@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
//add more on a method
@Repeatable(CheckContainer.class)
public @interface Check {

   String ex() default "";

   String msg() default "";

}

多個規則注解;

package com.et.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckContainer {

   Check[] value();
}

AOP攔截注解;

package com.et.annotation;

import com.et.exception.UserFriendlyException;
import com.googlecode.aviator.AviatorEvaluator;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
import org.springframework.util.StringUtils;

import java.lang.reflect.Method;
import java.util.*;


@Aspect
@Configuration
publicclass AopConfig {

   /**
    * Aspects monitor multiple annotations, because one annotation is Check and multiple annotations are compiled to CheckContainer
    */
   @Pointcut("@annotation(com.et.annotation.CheckContainer) || @annotation(com.et.annotation.Check)")
   public void pointcut() {
   }

   @Before("pointcut()")
   public Object before(JoinPoint point) {
      //get params
      Object[] args = point.getArgs();
      //get param name
      Method method = ((MethodSignature) point.getSignature()).getMethod();
      LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer();
      String[] paramNames = u.getParameterNames(method);

      CheckContainer checkContainer = method.getDeclaredAnnotation(CheckContainer.class);
      List<Check> value = new ArrayList<>();

      if (checkContainer != null) {
         value.addAll(Arrays.asList(checkContainer.value()));
      } else {
         Check check = method.getDeclaredAnnotation(Check.class);
         value.add(check);
      }
      for (int i = 0; i < value.size(); i++) {
         Check check = value.get(i);
         String ex = check.ex();
         //In the rule engine, null is represented by nil
         ex = ex.replaceAll("null", "nil");
         String msg = check.msg();
         if (StringUtils.isEmpty(msg)) {
            msg = "server exception...";
         }

         Map<String, Object> map = new HashMap<>(16);
         for (int j = 0; j < paramNames.length; j++) {
            //Prevent index out of bounds
            if (j > args.length) {
               continue;
            }
            map.put(paramNames[j], args[j]);
         }
         Boolean result = (Boolean) AviatorEvaluator.execute(ex, map);
         if (!result) {
            thrownew UserFriendlyException(msg);
         }
      }
      returnnull;
   }
}

全局異常攔截

package com.et.exception;

import com.alibaba.fastjson.JSON;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.lang.Nullable;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

import javax.servlet.http.HttpServletRequest;


@Configuration
@ControllerAdvice
publicclass DefaultGlobalExceptionHandler extends ResponseEntityExceptionHandler {
   privatestaticfinal Logger LOGGER = LoggerFactory.getLogger(DefaultGlobalExceptionHandler.class);

   @Override
   protected ResponseEntity<Object> handleExceptionInternal(Exception ex, @Nullable Object body, HttpHeaders headers, HttpStatus status, WebRequest request) {
      HttpResult httpResult = HttpResult.failure(status.is5xxServerError() ? ErrorCode.serverError.getDesc() : ErrorCode.paramError.getDesc());
      LOGGER.error("handleException, ex caught, cnotallow={}, httpResult={}, ex.msg={}", request.getContextPath(), JSON.toJSONString(httpResult), ex.getMessage());
      returnsuper.handleExceptionInternal(ex, httpResult, headers, status, request);
   }

   @ExceptionHandler(Exception.class)
   protected ResponseEntity handleException(HttpServletRequest request, Exception ex) {
      boolean is5xxServerError;
      HttpStatus httpStatus;
      HttpResult httpResult;
      if (ex instanceof UserFriendlyException) {
         UserFriendlyException userFriendlyException = (UserFriendlyException) ex;
         is5xxServerError = userFriendlyException.getHttpStatusCode() >= 500;
         httpStatus = HttpStatus.valueOf(userFriendlyException.getHttpStatusCode());
         httpResult = HttpResult.failure(userFriendlyException.getErrorCode(), userFriendlyException.getMessage());
      } elseif (ex instanceof IllegalArgumentException) {
         // Spring assertions are used in parameter judgment. requireTrue will throw an IllegalArgumentException. The client cannot handle 5xx exceptions, so 200 is still returned.
         httpStatus = HttpStatus.OK;
         is5xxServerError = false;
         httpResult = HttpResult.failure("Parameter verification error or data abnormality!");
      } else {
         httpStatus = HttpStatus.INTERNAL_SERVER_ERROR;
         is5xxServerError = true;
         httpResult = HttpResult.failure(ErrorCode.serverError.getDesc());
      }
      if (is5xxServerError) {
         LOGGER.error("handleException, ex caught, uri={}, httpResult={}", request.getRequestURI(), JSON.toJSONString(httpResult), ex);
      } else {
         LOGGER.error("handleException, ex caught, uri={}, httpResult={}, ex.msg={}", request.getRequestURI(), JSON.toJSONString(httpResult), ex.getMessage());
      }
      returnnew ResponseEntity<>(httpResult, httpStatus);
   }

}


責任編輯:武曉燕 來源: 碼猿技術專欄
相關推薦

2025-03-17 08:10:00

aviatorSpringJVM

2023-09-27 08:50:57

Serverles編寫運維

2025-06-26 01:10:00

服務定位解析器Spring

2019-04-25 14:25:24

Spring Bootif elseJava

2023-08-21 11:24:43

AndroidCSS

2025-03-03 08:49:59

2020-11-09 14:03:51

Spring BootMaven遷移

2022-02-17 13:39:09

AOP接口方式

2021-04-20 08:02:08

業務數據用戶

2024-01-12 16:20:04

2021-03-01 23:26:41

日志Spring BootAOP

2020-10-22 09:20:22

SQLNoSQL 數據庫

2025-08-15 12:19:08

2025-09-03 07:39:06

2020-07-09 08:59:52

if else模板Service

2025-04-21 00:00:05

2022-02-08 17:07:54

Spring BooSpring Aop日志記錄

2024-06-18 18:36:03

2024-09-27 15:24:15

Spring數據加解密
點贊
收藏

51CTO技術棧公眾號

春暖花开成人亚洲区| 国产极品美女高潮无套嗷嗷叫酒店| 欧美日韩免费看片| 国产欧美视频在线观看| 成人免费淫片视频软件| 精品无码人妻一区二区三| 五月国产精品| 7777精品伊人久久久大香线蕉经典版下载 | 国产精品91一区| 午夜三级在线观看| 日韩a级大片| 91精品国产综合久久久久久 | 欧美日韩大片一区二区三区| 91av久久久| 国产欧美日韩综合一区在线播放| 色悠悠久久88| 特级西西人体4444xxxx| 色8久久久久| 岛国视频午夜一区免费在线观看 | 欧美日韩日本国产亚洲在线| 亚洲欧美日韩中文在线制服| 好吊操视频这里只有精品| 怡红院成人在线| 亚洲香蕉伊在人在线观| 宅男av一区二区三区| 视频一区二区三区在线看免费看| 国产在线精品不卡| 国产成人综合一区二区三区| 久久久久亚洲av无码专区| 久久蜜桃av| 亚洲欧美日韩第一区| 日本五十肥熟交尾| 久久久久毛片免费观看| 欧美亚洲精品一区| 欧美在线一区视频| 羞羞网站在线免费观看| 国产精品欧美久久久久无广告| 九九九九精品九九九九| 国产 日韩 欧美 精品| 精品一区二区三区免费| 国产激情久久久久| 51国产偷自视频区视频| 99热免费精品| 国产精品一在线观看| 亚洲高清网站| 欧美精品一区三区| 久久精品国产亚洲AV成人婷婷| 久久99蜜桃| 亚洲精品自在久久| 精品人妻一区二区三区日产乱码卜| 日韩视频1区| 日韩一区二区电影| 亚洲色图欧美自拍| 亚洲国产精选| 欧美日韩成人在线一区| 波多野结衣xxxx| 欧美亚洲人成在线| 欧美日本免费一区二区三区| 成年网站在线播放| 国内自拍亚洲| 欧美日韩dvd在线观看| 91香蕉视频污版| 国产精品天堂蜜av在线播放| 欧美日韩国产综合一区二区三区| 校园春色 亚洲色图| 欧美日韩国产网站| 欧美日韩亚洲综合| 亚洲一区二区在线视频观看| 成人在线视频www| 欧美一个色资源| 69xxx免费视频| 欧美交a欧美精品喷水| 亚洲男人天堂久| 日本一卡二卡在线播放| 99久久九九| 久久视频在线看| 国产一级特黄a高潮片| 亚洲精品美女91| 国产www精品| 亚洲熟女乱色一区二区三区久久久| 美女www一区二区| 91中文在线视频| 天堂av手机版| 久久久久久久久伊人| 正在播放一区| av人人综合网| 欧美午夜精品一区二区三区| 日本网站在线看| 色婷婷综合久久久久久| 中文字幕欧美国内| 青青草原国产视频| 国产精品主播| 成人一区二区电影| 亚洲精品视频网| 国产日韩欧美精品在线| 久久最新免费视频| 欧亚av在线| 欧美日韩国产电影| 少妇激情一区二区三区视频| 国产日产精品_国产精品毛片| yellow中文字幕久久| 日本少妇xxxx动漫| 麻豆精品国产传媒mv男同| 国产经典一区二区三区| 国产精品一级伦理| 一区二区三区在线免费视频| 欧美日韩一区二区在线免费观看| 国产日韩一区二区三免费高清| 亚洲国产一区二区三区四区| 美女网站视频色| 国产欧美短视频| 91免费看片在线| 天天av天天翘| 亚洲人成7777| 欧美成人精品欧美一级乱| 国产一精品一av一免费爽爽| 亚洲欧洲日产国码av系列天堂 | 国产精品国产三级国产aⅴ原创| 成人短视频在线观看免费| 电影亚洲精品噜噜在线观看| 欧美精品一区二区三区很污很色的 | 国产成人在线中文字幕| 久久精彩免费视频| 国产又粗又猛又爽又| 成人ar影院免费观看视频| 91社在线播放| 成人福利片在线| 精品香蕉在线观看视频一| 青青操视频在线播放| 蜜臀久久99精品久久久久宅男| 精品日本一区二区三区在线观看| aaa大片在线观看| 777午夜精品视频在线播放| 精品国产成人亚洲午夜福利| 国产精品日韩精品欧美精品| 国产精品v欧美精品v日韩| 国产精品一卡二卡三卡| 欧美猛男gaygay网站| 久久丫精品忘忧草西安产品| 亚洲伊人观看| 久久国产日韩欧美| 国产一二在线播放| 亚洲精品一区二区三区福利 | 污污内射在线观看一区二区少妇 | 国产欧美一区二区三区在线看蜜臀| 五十路熟女丰满大屁股| 99国产精品久久一区二区三区| 久久成人精品视频| 国产视频一区二区三区四区五区| 国产精品麻豆视频| www亚洲成人| 日韩中文在线电影| 国产精品一区电影| 秋霞午夜理伦电影在线观看| 欧美精品第1页| 女人18毛片毛片毛片毛片区二| 开心九九激情九九欧美日韩精美视频电影 | 国产黄色片免费| 亚洲综合色视频| 欧美做受高潮中文字幕| 亚洲人成久久| 久热国产精品视频一区二区三区| 在线观看的黄色| 亚洲男人av电影| 亚洲免费视频二区| 国产精品不卡一区| 欧美在线a视频| 国语对白精品一区二区| 国产呦系列欧美呦日韩呦| 成人超碰在线| 国产一区二区三区丝袜| 亚洲天堂手机版| 亚洲卡通欧美制服中文| 中文字幕精品视频在线| 久久精品毛片| 爱爱爱视频网站| 一区二区三区国产好| 91极品视频在线| 第九色区av在线| 日韩一区二区麻豆国产| 国语对白永久免费| 国产精品天天看| 欧美午夜精品一区二区| 久久精品主播| 自拍视频一区二区三区| 国产精品极品国产中出| 国产精品va在线播放| 国产写真视频在线观看| 亚洲精品国偷自产在线99热| 亚洲熟女乱色一区二区三区久久久| 一区二区三区精品视频在线| 大又大又粗又硬又爽少妇毛片| 精品制服美女丁香| av网站大全免费| 青青草国产成人a∨下载安卓| 国产精品久久波多野结衣| 久久人体大尺度| 欧美大成色www永久网站婷| 青青九九免费视频在线| 3atv在线一区二区三区| av网站中文字幕| 一区二区在线观看视频| 一级黄色片网址| 丁香六月综合激情| 中文字幕在线综合| 亚洲理伦在线| 久久精品在线免费视频| 精品国产美女| 国产在线精品一区| 国产精品亚洲四区在线观看| 国产成+人+综合+亚洲欧洲| √天堂8在线网| 中文字幕欧美在线| 天堂av资源在线| 欧美mv日韩mv| 91福利免费视频| 91久久精品国产91性色tv| 国产一级一级片| 日韩美女视频一区| 91在线无精精品白丝| 成人免费观看av| 无人码人妻一区二区三区免费| 日韩av电影天堂| 欧美污视频网站| 亚洲国产综合在线看不卡| 日本天堂免费a| 婷婷综合五月| 一区精品视频| 日韩伦理视频| 色就是色欧美| 国产最新精品| 欧洲一区二区日韩在线视频观看免费| 国产一区二区三区不卡av| 91成人在线看| 精品中文字幕一区二区三区四区 | 欧美成人中文字幕在线| 黄色网址在线免费观看| 色婷婷成人综合| 日韩黄色影院| 中文字幕亚洲欧美日韩2019| 国产在线色视频| 国产亚洲一区精品| 韩日在线视频| 一本色道久久综合亚洲精品小说| 黄上黄在线观看| 国产亚洲精品久久久久久牛牛| 亚洲欧美日韩精品永久在线| 亚洲国产毛片完整版| 性xxxx视频| 亚洲精品国产电影| 色婷婷av一区二区三区之红樱桃| 精品第一国产综合精品aⅴ| 亚洲狼人综合网| 精品久久国产字幕高潮| 欧美天堂在线视频| 亚洲高清在线观看| 婷婷国产在线| 亚洲午夜小视频| porn视频在线观看| 精品国内自产拍在线观看| 麻豆网站在线观看| 久久91精品国产91久久跳| 日本在线观看大片免费视频| 久久久久久久国产| 在线女人免费视频| 国产不卡视频在线| 亚洲视频资源| 国产精品9999久久久久仙踪林| 久久a爱视频| 欧美在线激情| 欧美激情777| 日韩人妻无码精品久久久不卡| 国产一区二区三区的电影| 日本成人黄色网| 狠狠色丁香久久婷婷综合_中| 极品白嫩少妇无套内谢| 91网站黄www| 成人精品一二三区| 亚洲伊人伊色伊影伊综合网| 一级黄色免费网站| 欧美日韩高清一区二区不卡| 欧美亚洲免费高清在线观看 | 51精品国产| 国产自产在线视频一区| 女人av一区| 中文字幕精品在线播放| 亚洲精品色图| 亚洲污视频在线观看| 国产高清亚洲一区| 亚洲成人日韩在线| 亚洲人成网站在线| 久久精品视频5| 欧美一区二区播放| 视频国产一区二区三区| 日日噜噜噜夜夜爽亚洲精品| 精品精品导航| 国产精品男女猛烈高潮激情| 试看120秒一区二区三区| 久中文字幕一区| 天堂美国久久| 日批视频在线免费看| 国产成人综合网站| 69精品无码成人久久久久久| 一区二区三区在线视频观看58| 日本a级c片免费看三区| 日韩欧美激情在线| 国产特黄在线| 91国内免费在线视频| 久久久久久亚洲精品美女| 欧美污视频久久久| 在线不卡欧美| 日本高清免费在线视频| 久久精品人人做| 日韩经典在线观看| 日韩视频在线观看一区二区| a视频网址在线观看| 97在线视频一区| 亚洲1区在线观看| 综合视频免费看| 日韩国产精品91| 中国毛片在线观看| 亚洲一区二区在线免费观看视频| 中文字幕1区2区3区| 精品在线观看国产| 国产桃色电影在线播放| 成人春色激情网| 欧美成人milf| 男女污污的视频| 久久久噜噜噜久久人人看| 国产91av视频| 精品免费一区二区三区| 69xxx在线| 亚洲最大福利视频| 99精品电影| 一区二区在线免费看| 欧美—级在线免费片| 欧美a视频在线观看| 亚洲娇小xxxx欧美娇小| heyzo高清在线| 国产伦视频一区二区三区| 国产一区二区三区四区老人| 中文字幕在线视频一区二区三区 | 亚洲精品久久久久久一区二区| 免费在线欧美黄色| 91玉足脚交白嫩脚丫| 午夜精品aaa| 丝袜视频国产在线播放| 欧美亚洲在线观看| 日韩av午夜| 国产二级片在线观看| gogogo免费视频观看亚洲一| 国产无码精品视频| 亚洲第一色中文字幕| 国产嫩草在线视频| 国产一区二区不卡视频| 一区二区日韩免费看| 亚洲国产精品自拍视频| 亚洲福利国产精品| 天天干天天干天天干| 欧美在线视频免费| 国产精品羞羞答答在线观看 | 国产成人精品影视| 精品无码久久久久久久| 亚洲精品久久久久久久久久久久久 | 亚洲欧洲日本精品| 亚洲欧美日韩一区二区三区在线观看| 国产99久久九九精品无码免费| 欧美高清在线播放| 国产伦精品一区二区三区免费优势| 无码播放一区二区三区| 久久午夜色播影院免费高清 | 久久精品久久综合| 一区二区三区影视| 精品伦理精品一区| 天堂电影一区| 日本不卡二区高清三区| 精油按摩中文字幕久久| 免费看一级一片| 亚洲男人天堂2024| 精品一区二区三区亚洲| 免费不卡av在线| 中文字幕成人av| 亚洲第一第二区| 欧美一级视频在线观看| 久久一区91| v天堂中文在线| 欧美日韩午夜在线视频| 蜜乳av一区| 亚洲草草视频| 成人精品亚洲人成在线| 亚洲高清视频免费观看| 色综合久久88| 国产一区三区在线播放| 亚洲一区二区三区三州| 色综合久久久网| mm1313亚洲国产精品美女| 久久精品综合一区| 国产在线精品不卡| 久久永久免费视频| 欧美极品少妇全裸体|