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

如何將 Dubbo Filter 攔截器原理運用到日志攔截器中?

開發 后端
Dubbo Filter 模式非常的優雅,以前一直只是學習,沒有將其應用到自己的項目中。提供的便利性是非常強大的,值得學習運用。

業務背景

我們希望可以在使用日志攔截器時,定義屬于自己的攔截器方法。

實現的方式有很多種,我們分別來看一下。

v1-基本版本

接口

最常見的定義方式,在方法執行前后,異常,finally 提供鉤子函數。

package com.github.houbb.auto.log.api;
/**
 * autoLog 攔截器
 * @author binbin.hou
 * @since 0.0.10
 */
public interface IAutoLogInterceptor {
    /**
     * 執行之前
     * @param interceptorContext 攔截器上下文
     * @since 0.0.10
     */
    void beforeHandle(IAutoLogInterceptorContext interceptorContext);
    /**
     * 執行之后
     * @param interceptorContext 攔截器上下文
     * @param result 方法執行結果
     * @since 0.0.10
     */
    void afterHandle(IAutoLogInterceptorContext interceptorContext,
                     final Object result);
    /**
     * 異常處理
     * @param interceptorContext 攔截器上下文
     * @param exception 異常
     * @since 0.0.10
     */
    void exceptionHandle(IAutoLogInterceptorContext interceptorContext, Exception exception);
    /**
     * finally 中執行的代碼
     * @param interceptorContext 攔截器上下文
     * @since 0.0.10
     */
    void finallyHandle(IAutoLogInterceptorContext interceptorContext);
}

工具中統一使用攔截器

package com.github.houbb.auto.log.core.core.impl;
/**
 * @author binbin.hou
 * @since 0.0.7
 */
public class SimpleAutoLog implements IAutoLog {
    /**
     * 自動日志輸出
     *
     * @param context 上下文
     * @return 結果
     * @since 0.0.7
     */
    @Override
    public Object autoLog(IAutoLogContext context) throws Throwable {
        //1. 日志唯一標識
        // ... 省略
        List<IAutoLogInterceptor> autoLogInterceptors = null;
        try {
            // ... 省略其他邏輯
            // 獲取攔截器
            autoLogInterceptors = autoLogInterceptors(autoLog);


            //1.2 autoLog
            if(CollectionUtil.isNotEmpty(autoLogInterceptors)) {
                for(IAutoLogInterceptor interceptor : autoLogInterceptors) {
                    interceptor.beforeHandle(autoLogContext);
                }
            }
            //2. 執行結果
            Object result = context.process();


            //2.1 方法執行后
            if(CollectionUtil.isNotEmpty(autoLogInterceptors)) {
                for(IAutoLogInterceptor interceptor : autoLogInterceptors) {
                    interceptor.afterHandle(autoLogContext, result);
                }
            }
            //2.2 返回方法
            return result;
        } catch (Exception exception) {
            if(CollectionUtil.isNotEmpty(autoLogInterceptors)) {
                for(IAutoLogInterceptor interceptor : autoLogInterceptors) {
                    interceptor.exceptionHandle(autoLogContext, exception);
                }
            }
            throw new AutoLogRuntimeException(exception);
        } finally {
            // 先執行日志
            if(CollectionUtil.isNotEmpty(autoLogInterceptors)) {
                for(IAutoLogInterceptor interceptor : autoLogInterceptors) {
                    interceptor.finallyHandle(autoLogContext);
                }
            }
        }
    }
    /**
     * 創建攔截器列表
     * @param autoLog 注解
     * @return 結果
     * @since 0.0.10
     */
    private List<IAutoLogInterceptor> autoLogInterceptors(final AutoLog autoLog) {
        List<IAutoLogInterceptor> resultList = new ArrayList<>();
        if(ObjectUtil.isNull(autoLog)) {
            return resultList;
        }
        Class<? extends IAutoLogInterceptor>[] interceptorClasses = autoLog.interceptor();
        if(ArrayUtil.isEmpty(interceptorClasses)) {
            return resultList;
        }
        // 循環創建
        for(Class<? extends IAutoLogInterceptor> clazz : interceptorClasses) {
            IAutoLogInterceptor traceIdInterceptor = createAutoLogInterceptor(clazz);
            resultList.add(traceIdInterceptor);
        }
        return resultList;
    }
    /**
     * 創建攔截器
     * @param clazz 類
     * @return 實體
     * @since 0.0.10
     */
    private IAutoLogInterceptor createAutoLogInterceptor(final Class<? extends IAutoLogInterceptor> clazz) {
        if(IAutoLogInterceptor.class.equals(clazz)) {
            return new AutoLogInterceptor();
        }
        return ClassUtil.newInstance(clazz);
    }
}

自定義實現攔截器

我們想自定義攔截器方法時,只需要實現對應的接口即可。

/**
 * 自定義日志攔截器
 * @author binbin.hou
 * @since 0.0.12
 */
public class MyAutoLogInterceptor extends AbstractAutoLogInterceptor {
    @Override
    protected void doBefore(AutoLog autoLog, IAutoLogInterceptorContext context) {
        System.out.println("自定義入參:" + Arrays.toString(context.filterParams()));
    }
    @Override
    protected void doAfter(AutoLog autoLog, Object result, IAutoLogInterceptorContext context) {
        System.out.println("自定義出參:" + result);
    }
    @Override
    protected void doException(AutoLog autoLog, Exception exception, IAutoLogInterceptorContext context) {
        System.out.println("自定義異常:");
        exception.printStackTrace();
    }
}

方法的不足

這種方式可以實現常見的功能,但是依然不夠優雅。

我們還是無法非常靈活的定義自己的攔截器實現,就像我們使用 aop 增強,或者 dubbo filter 一樣。

感興趣的小伙伴可以移步學習一下,此處不做展開。

Dubbo-02-dubbo invoke filter 鏈式調用原理[6]

模擬 dubbo filter

實現 Invoker

類似 dubbo invoke,直接在以前的類中初始化即可。

AutoLogInvoker autoLogInvoker = new AutoLogInvoker(context);
Invocation invocation = new CommonInvocation();
invocation.setAttachment(AutoLogAttachmentKeyConst.AUTO_LOG_CONTEXT, context);
invocation.setAttachment(AutoLogAttachmentKeyConst.AUTO_LOG_START_TIME, startTimeMills);
invocation.setAttachment(AutoLogAttachmentKeyConst.AUTO_LOG_FILTER_PARAMS, filterParams);
Invoker chainInvoker = InvokerChainBuilder.buildInvokerChain(autoLogInvoker);
Result autoLogResult = chainInvoker.invoke(invocation);

其中 AutoLogInvoker 只是對方法的執行。

實現攔截器

這是的方法增強就是類似 dubbo filter 鏈式調用實現的,自定義的時候也會方便很多。

不需要拘泥于方法的執行位置,直接編寫我們的增強邏輯即可。

package com.github.houbb.auto.log.core.support.interceptor.chain;
import com.alibaba.fastjson.JSON;
import com.github.houbb.auto.log.annotation.AutoLog;
import com.github.houbb.auto.log.api.IAutoLogContext;
import com.github.houbb.auto.log.core.constant.AutoLogAttachmentKeyConst;
import com.github.houbb.common.filter.annotation.FilterActive;
import com.github.houbb.common.filter.api.CommonFilter;
import com.github.houbb.common.filter.api.Invocation;
import com.github.houbb.common.filter.api.Invoker;
import com.github.houbb.common.filter.api.Result;
import com.github.houbb.common.filter.exception.CommonFilterException;
import com.github.houbb.heaven.util.lang.StringUtil;
import com.github.houbb.heaven.util.lang.reflect.ClassUtil;
import com.github.houbb.heaven.util.lang.reflect.ReflectMethodUtil;
import com.github.houbb.id.api.Id;
import com.github.houbb.id.core.core.Ids;
import com.github.houbb.id.core.util.IdThreadLocalHelper;
import com.github.houbb.log.integration.core.Log;
import com.github.houbb.log.integration.core.LogFactory;
import java.lang.reflect.Method;
/**
 * 默認的日志攔截器
 */
@FilterActive(order = Integer.MIN_VALUE)
public class AutoLogCommonFilter implements CommonFilter {
    private static final Log LOG = LogFactory.getLog(AutoLogCommonFilter.class);
    /**
     * 是否需要處理日志自動輸出
     * @param autoLog 上下文
     * @return 結果
     * @since 0.0.10
     */
    protected boolean enableAutoLog(final AutoLog autoLog) {
        if(autoLog == null) {
            return false;
        }
        return autoLog.enable();
    }
    /**
     * 獲取方法描述
     * @param method 方法
     * @param autoLog 注解
     * @return 結果
     * @since 0.0.10
     */
    protected String getMethodDescription(Method method, AutoLog autoLog) {
        String methodName = ReflectMethodUtil.getMethodFullName(method);


        if(autoLog != null
            && StringUtil.isNotEmpty(autoLog.description())) {
            methodName += "#" + autoLog.description();
        }
        return methodName;
    }
    /**
     * 獲取 traceId
     * @param autoLog 日志注解
     * @return 結果
     * @since 0.0.10
     */
    protected String getTraceId(AutoLog autoLog) {
        //1. 優先看當前線程中是否存在
        String oldId = IdThreadLocalHelper.get();
        if(StringUtil.isNotEmpty(oldId)) {
            return formatTraceId(oldId);
        }
        //2. 返回對應的標識
        Id id = getActualTraceId(autoLog);
        return formatTraceId(id.id());
    }
    /**
     * 獲取日志跟蹤號策略
     * @param autoLog 注解
     * @return 沒結果
     */
    protected Id getActualTraceId(AutoLog autoLog) {
        Class<? extends Id> idClass = autoLog.traceId();
        if(Id.class.equals(idClass)) {
            return Ids.uuid32();
        }
        return ClassUtil.newInstance(autoLog.traceId());
    }
    /**
     * 格式化日志跟蹤號
     * @param id 跟蹤號
     * @return 結果
     * @since 0.0.16
     */
    protected String formatTraceId(String id) {
        return String.format("[%s] ", id);
    }
    @Override
    public Result invoke(Invoker invoker, Invocation invocation) throws CommonFilterException {
        final IAutoLogContext autoLogContext = (IAutoLogContext) invocation.getAttachment(AutoLogAttachmentKeyConst.AUTO_LOG_CONTEXT);
        final AutoLog autoLog = autoLogContext.autoLog();
        final boolean enableAutoLog = enableAutoLog(autoLog);
        if(!enableAutoLog) {
            return invoker.invoke(invocation);
        }
        final String description = getMethodDescription(autoLogContext.method(), autoLog);
        // 默認從上下文中取一次
        String traceId = IdThreadLocalHelper.get();
        try {
            // 設置 traceId 策略
            if(autoLog.enableTraceId()) {
                Id id = getActualTraceId(autoLog);
                traceId = id.id();
                invocation.setAttachment(AutoLogAttachmentKeyConst.AUTO_LOG_TRACE_ID, traceId);
                IdThreadLocalHelper.put(traceId);
            }
            Result result = invoker.invoke(invocation);
            // 日志增強
            logForEnhance(autoLogContext, traceId, description, result.getValue(), invocation);
            return result;
        } catch (Exception e) {
            if (autoLog.exception()) {
                String message = String.format("[TID=%s][EXCEPTION=%s]", traceId, e.getMessage());
                LOG.error(message, e);
            }
            throw new RuntimeException(e);
        }
    }
    /**
     * 增強日志輸出
     * @param autoLogContext 上下文
     * @param traceId 日志跟蹤號
     * @param description 方法描述
     * @param resultValue 返回值
     * @param invocation 調用上下文
     */
    private void logForEnhance(final IAutoLogContext autoLogContext,
                               final String traceId,
                               final String description,
                               final Object resultValue,
                               Invocation invocation) {
        final AutoLog autoLog = autoLogContext.autoLog();
        StringBuilder logBuilder = new StringBuilder();
        logBuilder.append(String.format("[TID=%s]", traceId));
        logBuilder.append(String.format("[METHOD=%s]", description));
        // 入參
        if(autoLog.param()) {
            Object[] params = (Object[]) invocation.getAttachment(AutoLogAttachmentKeyConst.AUTO_LOG_FILTER_PARAMS);
            logBuilder.append(String.format("[PARAM=%s]", JSON.toJSONString(params)));
        }
        // 出參
        if (autoLog.result()) {
            logBuilder.append(String.format("[RESULT=%s]", JSON.toJSONString(resultValue)));
        }
        // 耗時
        //3.1 耗時 & 慢日志
        if(autoLog.costTime()) {
            long startTime = (long) invocation.getAttachment(AutoLogAttachmentKeyConst.AUTO_LOG_START_TIME);
            long costTime = System.currentTimeMillis() - startTime;
            logBuilder.append(String.format("[COST=%d ms]", costTime));
            // 慢日志
            final long slowThreshold = autoLog.slowThresholdMills();
            if(slowThreshold > 0 && costTime > slowThreshold) {
                logBuilder.append(String.format("[SLOW-THRESHOLD=%s]", slowThreshold));
            }
        }
        // 輸出日志
        LOG.info(logBuilder.toString());
    }
}

開源地址

為了便于大家學習,項目已開源。

Github: https://github.com/houbb/auto-log

Gitee: https://gitee.com/houbinbin/auto-log

小結

dubbo filter 模式非常的優雅,以前一直只是學習,沒有將其應用到自己的項目中。

提供的便利性是非常強大的,值得學習運用。

責任編輯:姜華 來源: 今日頭條
相關推薦

2025-05-09 08:20:50

2009-06-24 16:00:00

2025-07-15 02:00:00

2009-09-27 17:37:32

Hibernate攔截

2025-02-28 08:14:53

2011-05-16 10:14:11

Hibernate

2009-07-08 17:02:11

JDK實現調用攔截器

2011-11-21 14:21:26

SpringMVCJava框架

2025-08-01 07:07:18

2009-06-25 15:54:42

Struts2教程攔截器

2020-03-25 17:55:30

SpringBoot攔截器Java

2009-06-04 08:01:25

Struts2攔截器原理

2012-02-03 13:27:16

2022-01-13 10:04:21

攔截器Interceptor過濾器

2009-02-04 14:19:38

2024-05-06 00:00:00

C#工具代碼

2013-11-04 09:35:38

Firefox插件攔截FLASH

2025-08-07 07:36:06

2021-05-17 08:11:24

Axios 開源項目HTTP 攔截器

2023-03-10 19:36:47

點贊
收藏

51CTO技術棧公眾號

国产精品热久久| 亚洲一区二区在线免费| 在线看黄色av| 精品亚洲国内自在自线福利| 最近中文字幕日韩精品| 91看片破解版| 美女精品导航| 久久精品夜色噜噜亚洲a∨| 国产精品天天狠天天看| 青青操视频在线播放| 牛牛影视一区二区三区免费看| 精品国产电影一区| 亚洲巨乳在线观看| 国产av无码专区亚洲av| 精品动漫3d一区二区三区免费版 | 欧美在线一区二区三区四| 国产调教在线观看| 99国产精品免费网站| 一本到不卡精品视频在线观看| 在线不卡视频一区二区| 日本一级在线观看| 国产乱一区二区| 国产91热爆ts人妖在线| 美国黄色小视频| 欧洲激情综合| 亚洲精品狠狠操| 天天干天天草天天| 免费v片在线观看| 亚洲欧美福利一区二区| 欧美激情论坛| 粉嫩av一区二区夜夜嗨| 免费成人美女在线观看.| 97在线观看免费| 欧美成人黄色网| 色婷婷亚洲mv天堂mv在影片| 亚洲乱码国产乱码精品精| 亚洲色图欧美自拍| 99re久久| 欧美性猛交xxxxx免费看| 国产精品日韩三级| 无遮挡的视频在线观看| 久久久久9999亚洲精品| 好看的日韩精品视频在线| 99精品在线看| 久久激情五月激情| 国产精品爽爽爽| 亚洲第一网站在线观看| 在线综合欧美| 97超级碰碰碰| 欧美成人aaaaⅴ片在线看| 欧美在线网址| 久久天天躁狠狠躁夜夜av| 欧美 日韩 国产 成人 在线观看| 久久亚洲道色| 亚洲激情小视频| 农村末发育av片一区二区| 高清一区二区三区av| 91黄视频在线观看| 妞干网视频在线观看| 少妇视频在线| 夜夜爽夜夜爽精品视频| 日本丰满大乳奶| 91国内在线| 亚洲乱码国产乱码精品精可以看| 国产av不卡一区二区| 麻豆免费在线视频| 亚洲欧美日韩国产手机在线 | 欧美主播一区二区三区| 国产精品入口免费软件| 成人免费在线观看视频| 欧美日韩国产影片| 日本一二区免费| 精品国产乱码一区二区三区 | 91aaa精品| 综合中文字幕| 日韩国产欧美区| 蜜桃久久精品成人无码av| 精品国产午夜| www.亚洲人.com| 色在线观看视频| 99在线精品视频在线观看| 欧美影院久久久| 中文字幕+乱码+中文乱码www| 久久国产婷婷国产香蕉| 亚洲精品欧美日韩| 国产刺激高潮av| 国产三级久久久| 99精品一级欧美片免费播放| 麻豆系列在线观看| 亚洲福利一区二区| 青青在线视频免费| 91视频亚洲| 亚洲精品第一页| 国产精品www爽爽爽| 亚洲成人三区| 538国产精品视频一区二区| 一级一级黄色片| 国产精品系列在线播放| 久久av二区| 精品孕妇一区二区三区| 亚洲aⅴ怡春院| 深夜黄色小视频| 国产无遮挡裸体免费久久| 亚洲女成人图区| 欧美爱爱小视频| 蜜臀av性久久久久蜜臀av麻豆 | 秋霞影视一区二区三区| 中文字幕在线日韩| 精品午夜福利在线观看| 国产女优一区| 2020国产精品久久精品不卡| 神马电影在线观看| 亚洲欧美成aⅴ人在线观看| 91成人在线观看喷潮教学| 青青青国产精品| 亚洲精品一区久久久久久| 国产亚洲精品久久久久久豆腐| 亚洲国产免费看| 成人字幕网zmw| 欧美日韩伦理片| 亚洲午夜久久久久久久久电影院| 日本激情视频在线| 国产欧美三级电影| 美女av一区二区三区| 超碰在线免费97| av一区二区不卡| 超碰97在线看| 成人免费在线观看视频| 国产视频久久久久| 欧美成人免费观看视频| 美日韩一区二区三区| 久久精品人人做人人爽电影| 美女免费久久| 欧美日韩情趣电影| 国精产品一区二区三区| 亚洲精品女人| 国产精品免费一区二区三区四区| 国产原创在线观看| 欧美日韩国产一区二区三区地区| 日韩中文字幕有码| 午夜亚洲性色视频| 精品一区二区三区自拍图片区| 18+视频在线观看| 91精品视频网| 五月天婷婷色综合| 激情欧美一区二区| 亚洲免费视频播放| 国色天香久久精品国产一区| 这里只有精品丝袜| 中文在线免费观看| 国产欧美日韩三级| 北条麻妃在线一区| 久久不见久久见免费视频7| 97国产精品久久| 天天操天天操天天| 亚洲第一av色| 国产白嫩美女无套久久| 亚洲精品美女91| 免费成人在线观看av| 中国字幕a在线看韩国电影| 日韩成人av一区| 91精品国产一区二区三区蜜臀| 红桃视频一区二区三区免费| 亚洲精品午夜av福利久久蜜桃| 成人女保姆的销魂服务| 国产欧美黑人| 欧美不卡在线视频| 国产特黄大片aaaa毛片| 2021中文字幕一区亚洲| 免费看a级黄色片| 日韩精品一区二区三区免费观影 | 日韩免费一级| 久久久免费电影| 亚洲aaaaaaa| 在线看一区二区| 天天做夜夜爱爱爱| 国产91精品在线观看| 99色这里只有精品| 亚洲精华一区二区三区| 国产福利视频一区| 尤物视频在线免费观看| 日韩一级片网站| 影音先锋亚洲天堂| 国产午夜精品在线观看| 亚洲天堂网2018| 99pao成人国产永久免费视频| 久久久久久久久久久久久久一区| 在线成人视屏| 久久影视电视剧免费网站| 亚洲第一页视频| 色婷婷一区二区| 99久久婷婷国产综合| av在线播放一区二区三区| 三级在线免费看| 国产主播精品| 日韩中文字幕一区| 一区二区三区四区高清视频| 日本成人在线视频网址| 国产网站在线免费观看| 亚洲精品第一页| 国产精品人人爽| 欧美日韩一区二区在线| 一区二区国产精品精华液| 337p粉嫩大胆噜噜噜噜噜91av| 午夜两性免费视频| av成人国产| 潘金莲一级淫片aaaaa免费看| 日韩高清电影免费| 91在线视频一区| 日韩精品一区二区三区| 欧美巨猛xxxx猛交黑人97人| 国产在线观看网站| 精品国产精品网麻豆系列 | 欧美大片顶级少妇| 成人黄色片在线观看| 亚洲成av人片观看| 日韩av手机在线免费观看| 久久亚洲综合av| 日韩黄色一区二区| 国内精品免费**视频| 人妻精品无码一区二区三区 | 米奇精品一区二区三区在线观看| 欧洲亚洲在线| 亚洲成人教育av| av手机免费看| 欧美精品丝袜中出| 波多野结衣一区二区三区在线| 亚洲高清免费在线| 综合五月激情网| 国产精品久久看| 欧美人与性囗牲恔配| 成人毛片在线观看| 18深夜在线观看免费视频| 美腿丝袜亚洲综合| 国产超碰在线播放| 久久xxxx精品视频| 欧美三级一级片| 亚洲精品字幕| 91免费黄视频| 亚洲大胆视频| 久久av综合网| 136国产福利精品导航网址| 欧美一级黄色录像片| 午夜精品毛片| 精品国产无码在线| 天天综合网91| 熟女视频一区二区三区| 亚洲国产精品日韩专区av有中文| 一区二区三区av| 99久久精品费精品国产风间由美 | 好吊色视频一区二区三区| 国产高清不卡二三区| 色偷偷中文字幕| 国产精品一区二区视频| 午夜影院免费版| 国产精品99久久不卡二区| 中文字幕55页| 成人av在线观| 国产ts丝袜人妖系列视频| 99国产精品久久久久| 大黑人交xxx极品hd| 久久人人爽爽爽人久久久| 三级网站在线免费观看| 欧美激情综合网| 国产黄色小视频网站| 亚洲精品日韩一| 国产精品白浆一区二小说| 无吗不卡中文字幕| www.国产一区二区| 欧美三区在线观看| 国产喷水福利在线视频| 精品国产区一区| 深夜视频在线免费| 中文字幕欧美日韩va免费视频| 日本中文字幕电影在线免费观看| 久久综合免费视频影院| 波多野结衣中文字幕久久| 91精品国产91久久| yy6080久久伦理一区二区| 91免费欧美精品| 久久91在线| 日韩一区二区电影在线观看| 亚洲精品成人影院| 日韩xxxx视频| 日韩国产在线一| 永久看看免费大片| 91一区一区三区| 国产在线观看免费视频软件| 一个色在线综合| 国内av在线播放| 精品国产一区二区精华| 精品无人乱码| 久久99久国产精品黄毛片入口| 天天综合av| 92看片淫黄大片看国产片| 性人久久久久| dy888午夜| 日韩精品午夜视频| wwwxxxx在线观看| 国产亚洲制服色| 久久国产在线视频| 欧美亚洲一区三区| 老熟妇高潮一区二区高清视频| 这里只有精品在线观看| 日本天码aⅴ片在线电影网站| 国产97色在线|日韩| 亚洲va欧美va人人爽成人影院| 欧美高清性xxxxhdvideosex| 欧美视频不卡| 91高清国产视频| 久久久一区二区三区捆绑**| 在线免费观看亚洲视频| 色综合咪咪久久| 隣の若妻さん波多野结衣| 深夜福利一区二区| 中文字幕资源网在线观看免费 | 一区二区三区韩国| av午夜精品一区二区三区| 久久久久亚洲av片无码| 在线免费不卡视频| 日本不卡视频一区二区| 欧美激情在线播放| 国产精品亚洲欧美一级在线| 任我爽在线视频精品一| 中文久久精品| 性活交片大全免费看| 亚洲丝袜美腿综合| 中文在线资源天堂| 伊人青青综合网站| 成人香蕉视频| 免费成人在线观看av| 亚洲精选在线| 亚洲精品乱码久久久久久蜜桃图片| 亚洲人吸女人奶水| 91女人18毛片水多国产| 中文字幕国产亚洲2019| 成人免费av电影| 欧美日韩一区二| 久久久人人人| 亚洲一区二区三区蜜桃| 欧美日韩加勒比精品一区| 欧美自拍偷拍一区二区| 久久免费国产精品1| 99久久免费精品国产72精品九九| 97av中文字幕| 国产成人高清视频| 免费一级黄色大片| 日韩欧美一二三区| 日本理论片午伦夜理片在线观看| 91久久在线播放| 欧美激情性爽国产精品17p| 69久久精品无码一区二区| 亚洲免费观看高清| www.国产.com| 久久久久久久香蕉网| 国产精品久久久久久久久久白浆| 妞干网在线播放| 成人免费视频一区| 在线观看亚洲欧美| 国产视频精品在线| 成人福利片在线| 免费观看国产视频在线| 成人性色生活片免费看爆迷你毛片| 久久精品这里只有精品| 亚洲精品一区二区三区四区高清| 超碰高清在线| 欧美日韩一区二区三区在线视频| 日欧美一区二区| 日韩在线观看免| 欧美电影免费观看完整版| av成人影院在线| 日本一区高清不卡| 久久精品国产99| 免费在线观看国产精品| 日韩国产高清污视频在线观看| 欧美黄色三级| 无码人妻精品一区二区三区99v| 国产成a人亚洲精品| 六月丁香激情综合| 日韩最新中文字幕电影免费看| 狂野欧美xxxx韩国少妇| 久激情内射婷内射蜜桃| 国产人伦精品一区二区| 国产农村妇女毛片精品| 91精品国产高清| 手机在线电影一区| 成人啪啪18免费游戏链接| 色婷婷综合中文久久一本| 成人在线观看亚洲| 精品在线不卡| 久久97超碰国产精品超碰| 黄色激情视频在线观看| 一区二区三区久久精品| 试看120秒一区二区三区| 美女av免费在线观看| 国产精品高潮呻吟久久| 欧美一级免费片| 成人福利视频网| 香蕉久久夜色精品国产| 日韩在线观看视频一区二区|