精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

91综合久久一区二区| 黄色激情在线播放| 蓝色福利精品导航| 欧美成人免费大片| wwwxxxx在线观看| 黄色片网站在线| 成人动漫视频在线| 国产精品igao视频| 久久人妻无码aⅴ毛片a片app| 麻豆精品在线| 日韩欧美有码在线| 樱空桃在线播放| 蜜臀久久99精品久久久| 欧美专区18| 欧美成人午夜激情在线| 精品人妻无码一区二区三区| 91麻豆精品国产综合久久久| 黄色成人在线免费| 青少年xxxxx性开放hg| 色就是色亚洲色图| 国产成人精品免费在线| 91a在线视频| 欧美日韩精品一区二区三区视频播放 | 国产欧美一区二区三区沐欲| 91免费版黄色| 中文字幕精品一区二区精| 影音先锋亚洲电影| 精品国模在线视频| 亚洲a v网站| 农村少妇一区二区三区四区五区 | 亚洲私人黄色宅男| 欧美性大战久久久久| 丰满人妻av一区二区三区| 麻豆成人综合网| 日本午夜人人精品| 日本福利视频导航| 日韩亚洲欧美一区二区| 后进极品白嫩翘臀在线视频| 99在线精品视频在线观看| 国产亚洲精品一区二555| jjzzjjzz欧美69巨大| 亚洲视频自拍| 色天使色偷偷av一区二区| youjizz.com在线观看| 成年人视频在线看| 99精品欧美一区二区三区小说| 91久久精品美女高潮| 黄色一级视频免费看| 亚洲午夜黄色| 另类少妇人与禽zozz0性伦| 老熟妇一区二区| 欧美高清视频看片在线观看| 欧美顶级少妇做爰| 日本特黄a级片| 日韩精品三区| 欧美色视频日本版| 久久久亚洲精品无码| 2024最新电影在线免费观看| 国产精品久久久99| 欧美一区二区综合| 熟妇高潮一区二区三区| 成人爽a毛片一区二区免费| 成人免费直播live| 中文字幕在线视频免费| 奇米精品一区二区三区在线观看| 欧美一级大胆视频| 国产香蕉视频在线| 亚洲黄色免费| 97在线视频免费| 国产无遮挡又黄又爽又色| 国产一区日韩欧美| 久久久久久久久91| 日韩欧美性视频| 国产欧美日韩综合一区在线播放 | 香港伦理在线| 国产精品区一区二区三区| 日韩在线第一区| 99中文字幕一区| 国产午夜亚洲精品午夜鲁丝片| 你懂的视频在线一区二区| 天堂在线视频观看| 99re热这里只有精品免费视频| 好吊妞www.84com只有这里才有精品| 成人毛片视频免费看| 成人黄色在线网站| 精品国产一区二区三区日日嗨| 亚洲欧美日本在线观看| 91免费小视频| 深夜福利成人| caopen在线视频| 一区二区三区不卡在线观看 | 亚洲国产电影| 57pao国产精品一区| 无码一区二区三区在线观看| 毛片av一区二区| 九九视频精品免费| 欧美一区二区三区四区在线| 中文字幕亚洲乱码熟女1区2区| 久久久久久黄| 成人午夜在线观看| 日本韩国在线观看| 国产日韩在线不卡| 欧美一级黄色录像片| 男人添女人下部高潮视频在线观看 | 亚洲精品一二三四区| 人妻互换免费中文字幕| 国产美女精品写真福利视频| 色婷婷亚洲婷婷| 中文字幕在线视频一区二区三区| 亚洲欧美日本国产| 亚洲人成电影网站色…| 久久精品在线观看视频| 亚洲激情在线| 欧美自拍大量在线观看| 国产夫妻自拍av| 久久一夜天堂av一区二区三区| 亚洲视频在线观看日本a| 国产美女一区视频| 在线观看视频一区二区欧美日韩| 精品无码av一区二区三区不卡| 亚洲性视频大全| 久久最新资源网| 久久中文字幕免费| 国产成人精品免费一区二区| 涩涩涩999| av在线资源| 欧美另类videos死尸| 色婷婷免费视频| 婷婷亚洲图片| 日韩av电影在线播放| 亚洲天堂狠狠干| 国产丝袜在线精品| av日韩一区二区三区| 日韩精品一区二区三区av| 亚洲爱爱爱爱爱| 糖心vlog免费在线观看| 噜噜噜91成人网| 国产精品视频免费一区二区三区 | 亚洲精品av在线播放| 任我爽在线视频| 天堂在线亚洲视频| 麻豆成人av| av在线理伦电影| 91精品国产欧美一区二区| 91激情视频在线观看| 激情国产一区| 国产成人免费观看| 中文字幕中文字幕在线十八区| 欧美在线你懂得| 双性尿奴穿贞c带憋尿| 欧美天天在线| 51蜜桃传媒精品一区二区| 91在线免费看| 在线看国产日韩| 麻豆精品免费视频| 国产亚洲午夜| 久久99久久精品国产| 久久青青色综合| 日韩精品中文字幕在线不卡尤物| 三上悠亚作品在线观看| 极品尤物av久久免费看| 青少年xxxxx性开放hg| 永久免费观看精品视频| 日韩一区二区av| 国产精品人人爽| 亚洲欧美另类久久久精品| 亚洲精品综合在线观看| 欧美电影三区| 成人亚洲综合色就1024| 国内精品久久久久久野外| 欧美欧美午夜aⅴ在线观看| 97在线观看免费视频| 日韩二区在线观看| 一本久道久久综合| 成人乱码手机视频| 一本色道久久88综合日韩精品| 亚洲精品久久久久久久蜜桃| 欧美国产成人精品| 日韩在线不卡一区| 中文字幕人成人乱码| 97人人澡人人爽| 成人超碰在线| 亚洲国产欧美一区二区三区同亚洲| 探花视频在线观看| 日本一区二区三区国色天香 | 亚洲一区二区精品在线| 91精品国产自产观看在线| 久久999免费视频| 黄色片一区二区三区| 五月婷婷综合网| 美女av免费看| 国产高清在线观看免费不卡| 成人精品视频在线播放| 免费av一区二区三区四区| 国产精品com| av免费在线观| 亚洲国产精品推荐| 狠狠狠狠狠狠狠| 国产精品久久久久影院色老大| 免费人成视频在线播放| 日韩五码在线| 亚洲精品9999| 91蝌蚪精品视频| 日韩av观看网址| 成人日日夜夜| 国产偷亚洲偷欧美偷精品| 91精品在线视频观看| 亚洲一区二区在线视频| av黄色免费网站| 国内一区二区在线| 91av资源网| 99久久夜色精品国产亚洲狼 | 国产一区二区在线| 2019国产精品视频| 国产精品迅雷| 久久91亚洲精品中文字幕| 熟妇人妻一区二区三区四区 | 欧美国产丝袜视频| 韩国av中国字幕| 美女国产一区二区| 日本xxxxxxxxxx75| 亚洲国产精品久久久天堂 | 亚洲欧洲成人在线| 7777女厕盗摄久久久| 精品免费囯产一区二区三区 | 国产精品成人国产乱| 欧美韩日一区二区三区四区| 亚洲天堂美女视频| 久久超级碰视频| 免费在线观看视频a| 香蕉久久网站| 相泽南亚洲一区二区在线播放| 国产精品毛片av| 国产在线高清精品| 久久91导航| 97精品国产97久久久久久| 黄色成年人视频在线观看| 亚洲色图13p| 午夜av免费在线观看| 欧美大片在线观看| 国产精品无码在线播放| 欧美无砖专区一中文字| 日韩手机在线观看| 亚洲欧美激情在线| 日本不卡一二区| 国产精品网曝门| 色婷婷av777| 91麻豆福利精品推荐| 亚洲精品激情视频| 国产精品伊人色| 一二三级黄色片| 麻豆精品新av中文字幕| 丝袜制服一区二区三区| 久久中文在线| 欧美久久久久久久久久久久久| 欧美日韩理论| 9191国产视频| 欧美视频在线观看| 福利视频免费在线观看| 女主播福利一区| www.69av| 影院欧美亚洲| 国产a级片网站| 亚洲精品偷拍| 国产成人无码精品久久久性色| 亚洲三级色网| 日本在线视频www色| 欧美aa国产视频| 国产精品三级一区二区| 国产一区二区中文| 欧美综合在线播放| 麻豆成人在线| 三年中国国语在线播放免费| 免费高清在线视频一区·| 欧美黄色性生活| 欧美aa在线视频| 中文字幕亚洲影院| 国产传媒日韩欧美成人| 污污视频在线免费| 国产精品综合视频| 在线观看一区二区三区视频| 成人午夜电影小说| 最新在线黄色网址| 久久久久久久久久久久久女国产乱 | 欧美精品123区| 国产精品老熟女视频一区二区| 欧美一级欧美三级在线观看 | 久久综合影视| 国产在线青青草| 久久av资源网| 岛国精品一区二区三区| 久久综合视频网| 波多野结衣家庭教师在线观看| 亚洲女性喷水在线观看一区| 国产精品999久久久| 色综合久久久久网| 国产精品高潮呻吟久久久| 欧美va在线播放| 青青九九免费视频在线| 日日骚av一区| av免费在线观看网址| 国产成人自拍视频在线观看| 高清一区二区三区av| 久久久久国产精品视频| 久久美女视频| 浮妇高潮喷白浆视频| 美女诱惑一区二区| 国产精品果冻传媒| 国产人久久人人人人爽| 欧美性猛交xxxxx少妇| 欧美日韩在线一区| 一级黄色大片免费观看| 日韩免费观看高清完整版| 少妇精品高潮欲妇又嫩中文字幕| 中国china体内裑精亚洲片| 日本色护士高潮视频在线观看| 欧美亚洲国产精品| 国产aa精品| 日产精品久久久一区二区| 国产精品久久| 中文字幕成人在线视频| 26uuu精品一区二区三区四区在线| 欧美性生交大片| 色综合久久久久久久| www国产一区| 另类专区欧美制服同性| julia一区二区三区中文字幕| 国产欧美一区二区三区不卡高清| 欧美在线电影| 欧美 日韩精品| 成人免费精品视频| 成人自拍小视频| 欧美性一二三区| 久青草国产在线| 久久久久久久影院| 国产精品15p| 日本天堂免费a| 精品一区二区免费看| 国产三级av在线播放| 五月激情综合网| 朝桐光av在线一区二区三区| 日韩在线中文字| 日韩不卡免费高清视频| 久久精品日产第一区二区三区乱码 | 91精品综合视频| 久久一区二区三区电影| 国产精品igao| 国产亚洲成av人在线观看导航| 日韩免费观看一区二区| 日韩欧美一区二区视频| 1769免费视频在线观看| 91在线视频免费| 国产精品99一区二区三| 国产福利影院在线观看| 久久久亚洲精品石原莉奈| 亚洲 欧美 视频| 日韩精品视频在线播放| 九色porny丨国产首页在线| 国产精品久久7| 在线播放精品| 国产伦理在线观看| 成人免费一区二区三区视频 | 老牛国产精品一区的观看方式| 熟女丰满老熟女熟妇| 精品国产1区2区| 日韩一级片免费观看| 68精品久久久久久欧美 | 91精品中文字幕一区二区三区| 美女av在线播放| 亚洲xxxxx| 911久久香蕉国产线看观看| 成年人性生活视频| 亚洲福中文字幕伊人影院| 天堂视频中文在线| 欧美激情亚洲精品| 国产99久久久国产精品成人免费| 激情综合网婷婷| 国产精品久久毛片| 中文字幕一区2区3区| 精品国产网站地址| www一区二区三区| 精品少妇人欧美激情在线观看| 99r国产精品| 色老头一区二区| 欧美理论电影在线观看| 久久精品色综合| 激情综合网俺也去| 亚洲精品第一国产综合野| 日韩一级免费毛片| 国产精品精品久久久| 欧美一区二区三区免费看| 手机免费看av片| 色一情一乱一乱一91av| 男人资源在线播放| 亚洲999一在线观看www| 亚洲少妇一区| 欧美一级特黄高清视频| 亚洲国产精品热久久| 成人精品高清在线视频| 久久av高潮av|