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

一種奇特的干掉 if..else 方式,Spring Boot+Aviator+Aop 挺有趣!

開發
從5.0.0版本開始,aviator升級成為了aviatorScript,成為一個高性能、輕量級寄宿于 JVM (包括 Android 平臺)之上的腳本語言。

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

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

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

使用場景包括:

  • 規則判斷及規則引擎
  • 公式計算
  • 動態腳本控制
  • 集合數據 ELT 等

一、Aviator的限制

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

二、aviator基本使用

1. 基本表達式

要使用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類型處理。

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]+/");

2. 表達式變量

跟其他表達式引擎一樣,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());

3. 使用函數

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)");

我們也可以自定義一個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中,像使用內置函數一樣使用自定義函數:

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

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實現參數校驗。

1. pom.xml

<?xml version="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>

2. 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();
    }
}

3. 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, contextPath={}, 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-12 14:09:56

2024-04-01 08:38:57

Spring@AspectAOP

2019-04-25 14:25:24

Spring Bootif elseJava

2025-06-26 01:10:00

服務定位解析器Spring

2022-08-18 09:38:02

Spring跨域

2021-06-11 00:11:23

GPS數據協議

2013-05-22 15:31:07

AOP的CGlib實現

2014-12-01 09:54:40

JavaScript

2024-04-26 08:58:54

if-else代碼JavaSpring

2022-02-17 13:39:09

AOP接口方式

2020-11-09 14:03:51

Spring BootMaven遷移

2023-07-27 08:14:29

2025-07-08 08:20:39

2021-04-20 08:02:08

業務數據用戶

2023-01-26 23:46:15

2015-05-06 10:05:22

javajava框架spring aop

2022-06-06 15:44:24

大數據數據分析思維模式

2025-06-26 01:22:00

SpringBean開發

2021-11-26 11:07:14

cowsay命令Linux

2024-01-12 16:20:04

點贊
收藏

51CTO技術棧公眾號

国产精品入口尤物| 日韩精品一区二区三区在线观看| 日本不卡二区高清三区| 91亚洲国产成人久久精品麻豆| 欧美aaaaaaaaaaaa| 精品国产一区二区三区不卡 | 成人av影视在线| www.毛片.com| 欧美freesex交免费视频| 日韩精品在线观看网站| 欧美视频亚洲图片| 深夜成人影院| 亚洲国产成人av网| 曰韩不卡视频| 玖玖综合伊人| 国产成人午夜高潮毛片| 国产精品久久久久久久久久久久久 | 中文字幕免费视频| 95精品视频| 日韩欧亚中文在线| 久久这里只有精品18| 国产高清一区在线观看| 成人亚洲一区二区一| 国产精品久久综合av爱欲tv| 国产无码精品一区二区| 天天射综合网视频| 亚洲视频网站在线观看| 欧美69精品久久久久久不卡 | 91色精品视频在线| 亚洲AV无码成人精品区东京热| 中文字幕日韩一区二区不卡| 国产亚洲精品va在线观看| 韩国三级hd两男一女| 亚洲三级在线| 欧美日韩一区中文字幕| 欧美日韩在线视频一区二区三区| 日韩免费影院| 亚洲精品欧美在线| 欧美日韩一级在线| 国产香蕉在线| 国产午夜精品久久久久久免费视| 国产精品日韩欧美一区二区| 精品人妻一区二区三区三区四区| 久久国产成人午夜av影院| 国产精品va在线播放| 岛国av中文字幕| 亚洲欧美日韩国产一区| 午夜免费日韩视频| 亚洲精品77777| 亚洲激情网址| 91精品国产一区| 久久精品国产亚洲AV无码麻豆| 亚洲精品va| 久久亚洲影音av资源网| 天天鲁一鲁摸一摸爽一爽| 久久人体视频| 久久色在线播放| 爱爱视频免费在线观看| 欧美激情精品久久久六区热门| 久热精品视频在线观看| 国产免费无码一区二区视频| 欧美在线黄色| 欧美国产第一页| 国产在线视频99| 亚洲永久免费| 国产成人激情小视频| 一级片在线免费播放| 日韩成人av影视| 国产综合色香蕉精品| 国产视频一区二区三| 国产传媒日韩欧美成人| 国内一区二区三区在线视频| 欧美一区二区视频| 国产精品视频yy9299一区| 亚洲乱码一区二区三区| a天堂中文在线官网在线| 亚洲欧美日韩国产综合在线 | 日韩中文字幕电影| 成人短片线上看| 久久久91精品国产一区不卡| 久久久久久久久久一区二区三区 | 国产精品国产三级国产普通话蜜臀| 亚洲欧美日韩精品综合在线观看| 国产二区三区在线| 天天爽夜夜爽夜夜爽精品视频| 国产免费成人在线| 色综合一区二区日本韩国亚洲| 欧美一级日韩一级| 中出视频在线观看| 97精品97| 4p变态网欧美系列| 国产一区二区网站| 岛国一区二区在线观看| 日本精品一区二区| 污视频网站在线免费| 日韩欧美在线免费观看| 99精品999| 日韩电影在线观看完整免费观看| 色婷婷综合久久久久| 久草福利资源在线观看| 久久久久国产精品午夜一区| 亚洲va男人天堂| 裸体xxxx视频在线| 亚洲资源中文字幕| 性chinese极品按摩| 红杏视频成人| 久久久精品免费| 免费视频网站在线观看入口| 国产福利一区二区三区在线视频| 日韩av高清| 99riav视频在线观看| 在线综合视频播放| 无码人妻丰满熟妇啪啪欧美| 亚洲国产婷婷| 亚洲在线免费观看| 成年人在线看| 一本一道久久a久久精品综合蜜臀| 伊人五月天婷婷| 日韩不卡一区| 日韩免费精品视频| 亚洲av成人精品日韩在线播放| 自拍偷拍亚洲欧美日韩| 日韩欧美黄色大片| 日韩有码一区| 国内精品久久久久伊人av| 国产精品九九九九| 国产精品久久久久婷婷二区次| av动漫在线观看| 国产三级精品三级在线观看国产| 久久亚洲私人国产精品va| 欧美激情一区二区三区免费观看 | 国产美女福利视频| 久久精品久久综合| 日韩久久久久久久久久久久久| brazzers在线观看| 精品国产sm最大网站免费看| 成人免费毛片东京热| 看片网站欧美日韩| 亚洲午夜久久久影院伊人| 在线观看精品| 中日韩美女免费视频网址在线观看| 午夜毛片在线观看| 91视频.com| 毛片av免费在线观看| 性欧美lx╳lx╳| 欧洲午夜精品久久久| 天堂成人在线观看| 精品国产乱码久久久久久虫虫漫画| 毛茸茸free性熟hd| 国产日韩一区| 欧美一级片免费观看| 韩国成人漫画| 最近免费中文字幕视频2019| 中文字幕一区二区在线视频| 中文一区二区在线观看| 污视频网站观看| 亚洲色图网站| 国产99午夜精品一区二区三区| 污片视频在线免费观看| 亚洲成人精品在线| 无码人妻丰满熟妇精品区| 国产无人区一区二区三区| 爱情岛论坛vip永久入口| 日韩欧美午夜| 91精品国自产在线观看 | 国产精品99久久久久久人| 韩国三级av在线免费观看| 欧美影院午夜播放| 好吊日在线视频| 成人av免费在线播放| aa在线观看视频| 视频一区在线观看| 成人激情视频小说免费下载| 丝袜国产在线| 亚洲精品一二区| 91福利免费视频| 亚洲一区二区av在线| aaaaa级少妇高潮大片免费看| 麻豆精品一区二区| 欧美这里只有精品| 视频一区欧美| 亚洲综合最新在线| 欧美xxxhd| www.日韩.com| 色噜噜在线播放| 欧美日韩五月天| 91在线看视频| 1000精品久久久久久久久| 天天躁日日躁狠狠躁av麻豆男男| 丝袜脚交一区二区| 中文字幕一区二区三区四区五区人 | 欧美性高清videossexo| 九九热视频精品| 久久久久久久久久久电影| 亚洲色图欧美自拍| 先锋影音久久| 日本福利视频在线观看| 久久91精品| 成人在线观看91| 91成人抖音| 97精品欧美一区二区三区| 日本视频在线免费观看| 亚洲国内高清视频| 国产免费黄色录像| 色先锋aa成人| 日本在线视频免费| 椎名由奈av一区二区三区| 右手影院亚洲欧美| 成人综合婷婷国产精品久久蜜臀 | 99久久久久久99| 福利视频999| 轻轻草成人在线| 免费看一级大黄情大片| 中文字幕一区二区三区在线视频 | 在线播放麻豆| 精品网站999www| 丰满少妇被猛烈进入| 欧美卡1卡2卡| 黄色av一区二区| 欧美日韩免费在线观看| 欧美黑人一级片| 中文字幕一区二区三区蜜月| 国产成人av一区二区三区不卡| 国产精品一级片在线观看| 在线免费观看av的网站| 国产视频亚洲| 欧美图片激情小说| 午夜日本精品| 日本天堂免费a| 91成人精品| 中文字幕av导航| 国产精品国产三级国产在线观看| 欧美性bbwbbwbbwhd| 另类在线视频| 激情视频在线观看一区二区三区| 538任你躁精品视频网免费| 91亚洲精华国产精华| 日韩av黄色| 成人激情综合网| 成人51免费| 成人久久久久久久| 视频欧美精品| 亚洲综合精品一区二区| 成人久久精品| av一区二区三区四区电影| 欧美1区2区3| 97国产超碰| 凹凸成人在线| 精品欧美一区二区久久久伦| 丝袜美腿综合| 欧洲av一区| 日韩精品首页| 99热都是精品| 亚洲一级影院| 少妇高潮喷水在线观看| 午夜在线一区二区| 国产精品天天av精麻传媒| 日韩av一二三| 欧美国产日韩另类 | 久久最新视频| 色悠悠久久综合网| 紧缚奴在线一区二区三区| 日本在线视频播放| av资源网一区| 欧美三级视频网站| 亚洲婷婷在线视频| 国产香蕉在线视频| 日韩欧美精品网址| 亚洲无码精品国产| 日韩三级高清在线| 日本一本草久在线中文| 中文字幕在线亚洲| 在线视频中文字幕第一页| 97在线观看免费| 高清av一区二区三区| 91中文精品字幕在线视频| 国产精品流白浆在线观看| 欧美精品中文字幕一区二区| 91日韩免费| 日本a在线免费观看| 久久性天堂网| 超级砰砰砰97免费观看最新一期| www.亚洲在线| 又色又爽的视频| 精品动漫一区二区| 一区不卡在线观看| 日韩电影大片中文字幕| 天天影视久久综合| 97在线视频观看| 欧美成人福利| 激情小说综合区| 一区二区三区午夜视频| 欧美丰满熟妇bbbbbb百度| 久久97超碰色| 手机av免费看| 亚洲自拍偷拍欧美| 在线视频欧美亚洲| 亚洲精品456在线播放狼人| 日韩成人影视| 欧美中文在线观看| 午夜视频一区二区在线观看| 日韩精品无码一区二区三区| 极品中文字幕一区| www.99r| 久久亚洲免费视频| 久久精品久久国产| 91精品久久久久久久99蜜桃| 国产在线观看免费| 韩国福利视频一区| 日本一区二区三区视频在线看| 日韩av电影免费播放| 在线综合亚洲| 香蕉久久久久久av成人| 国产精品第一页第二页第三页| 人妻丰满熟妇av无码区| 欧美大胆人体bbbb| 久久久久久久久免费视频| 国产精品99久久久久久人| 欧美wwwwww| www插插插无码视频网站| 国产在线精品一区二区| 国产精品久久久久久成人| 欧美色欧美亚洲高清在线视频| 99精品免费观看| 日韩在线视频观看| 国产91亚洲精品久久久| 日本免费高清不卡| 视频一区视频二区中文字幕| 中文一区二区在线观看| 97久久精品人搡人人玩| 麻豆国产一区| 国产麻豆电影在线观看| 男人操女人的视频在线观看欧美| 亚洲午夜久久久久久久久红桃| 亚洲6080在线| 天天操天天舔天天干| 久久免费福利视频| 荡女精品导航| 人妻夜夜添夜夜无码av| caoporn国产一区二区| 国产成人自拍视频在线| 亚洲激情国产精品| 欧美aa免费在线| 久久这里精品国产99丫e6| 午夜在线视频一区二区区别| 中日韩精品一区二区三区| 色域天天综合网| 国产精品久久久久一区二区国产 | 26uuu亚洲综合色| 中文字幕精品三级久久久 | 成人性生交大片免费看小说| 欧美岛国激情| 精品人妻一区二区三区免费| 一区二区三区在线视频免费观看 | 亚洲天天在线日亚洲洲精| 都市激情亚洲一区| 亚洲成人午夜在线| 狠狠色丁香婷婷综合久久片| 91久久国产综合| 精品国产乱子伦一区| 国产精品yjizz视频网| 欧美精品123| 久久精品国产久精国产爱| 午夜精品一区二区三区视频| 欧美videos大乳护士334| 黄在线观看免费网站ktv| 欧美一区二区三区在线播放| 久久国产成人午夜av影院| 久久影院一区二区| 亚洲精品中文字幕有码专区| 日韩国产网站| 黄色录像特级片| 91免费在线看| 一级做a爱片性色毛片| 欧美精品久久久久久久免费观看| 蜜桃一区av| 久久久久久蜜桃一区二区| 亚洲精品日韩综合观看成人91| 五月婷婷丁香六月| 国产噜噜噜噜久久久久久久久| 午夜精品久久99蜜桃的功能介绍| 亚洲国产精品成人综合久久久| 在线免费av一区| 少妇视频在线| 欧洲精品久久| 国产成a人亚洲精| 加勒比在线一区| 欧美成人在线免费| 国产精品一区二区99| 一起草最新网址| 在线一区二区三区四区五区| 污污视频在线看| 亚洲国产午夜伦理片大全在线观看网站 | 国产成人福利视频| 欧美日一区二区三区在线观看国产免| 亚欧洲乱码视频| 日韩女优电影在线观看| 成人看片网站| 欧美 国产 综合| 亚洲精品欧美专区|