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

www.黄色小说.com| 欧美日韩国产一二三区| 蜜桃视频在线观看免费视频| av中文字幕不卡| 奇米一区二区三区四区久久| 成人片黄网站色大片免费毛片| 成人在线爆射| 亚洲欧洲无码一区二区三区| 成人精品水蜜桃| 六月丁香在线视频| 日韩国产一区二区| 日韩视频在线一区二区| 少妇人妻大乳在线视频| 亚洲色图另类小说| 蜜臀精品久久久久久蜜臀| 美女av一区二区| 艳妇乳肉亭妇荡乳av| 四虎影视4hu4虎成人| 亚洲日本乱码在线观看| 精品一区二区三区视频日产| 成人免费视频国产免费| 在线看片不卡| 亚洲欧美日韩网| 91免费视频污| 午夜精品成人av| 一个色综合网站| 午夜精品一区二区三区四区 | 欧美视频一二三区| 丁香婷婷综合激情| 98在线视频| 成人午夜精品在线| 91久久久久久国产精品| 国产美女激情视频| 亚洲午夜精品久久久久久app| 一区二区三区视频免费在线观看| 精品无码人妻少妇久久久久久| 欧美aaa级| 日韩欧美在线免费观看| 欧洲精品在线播放| 老司机午夜在线| 国产网站一区二区三区| 精品一区国产| 国产自产一区二区| 国产一区二区三区在线观看精品 | 国产亚洲精aa在线看| 午夜精品久久久久久不卡8050| 在线免费观看成人网| 美国成人毛片| 99久久精品免费看国产免费软件| 亚洲一区二区三区777| 精品乱码一区内射人妻无码| 国产精品一区毛片| 久久免费在线观看| 久久久久久久国产精品毛片| 五月激情久久久| 伊人精品在线观看| 精品欧美一区二区久久久| 黄色成人美女网站| 精品久久人人做人人爽| 日本中文字幕在线不卡| 99视频有精品高清视频| 欧美日韩精品一区二区三区| 精品日韩久久久| 国产超碰精品| 在线视频观看一区| 成人亚洲视频在线观看| 老司机成人影院| 日韩欧美在线字幕| 欧美一级黄色片视频| 欧美xo影院| 欧美亚洲高清一区| 永久免费的av网站| 999精品嫩草久久久久久99| 精品视频123区在线观看| 欧美第一页浮力影院| 日韩三区四区| 欧美一级理论片| 国产乱淫av麻豆国产免费| 亚洲午夜精品| 亚洲国产精品字幕| 国产精品福利导航| 国产免费久久| 日日狠狠久久偷偷四色综合免费| 女性裸体视频网站| 欧美粗暴jizz性欧美20| 久久免费视频在线观看| 欧美一区二区三区网站| 日本不卡一区二区三区高清视频| 国产在线观看精品| wwwav网站| 久久影院电视剧免费观看| 日本一区网站| 麻豆视频在线观看免费网站| 一区二区三区欧美日韩| 成熟了的熟妇毛茸茸| 精品欧美日韩精品| 91精品国产91综合久久蜜臀| 中文字幕第九页| 日本一卡二卡四卡精品| 久久久高清一区二区三区| 欧洲亚洲一区二区| 免费黄色网页在线观看| 亚洲国产成人精品视频| 日韩亚洲在线视频| 精品国产一区二区三区2021| 亚洲第一免费播放区| 国产交换配乱淫视频免费| 99久久.com| 国产91精品久久久久| 中文字幕二区三区| 成人网在线播放| 亚洲精品乱码视频| 第四色日韩影片| 在线精品亚洲一区二区不卡| 韩国三级与黑人| 窝窝社区一区二区| 久久中文字幕视频| 天堂网视频在线| 粉嫩蜜臀av国产精品网站| 欧美一级二级三级| 污影院在线观看| 欧美综合一区二区| 国产一级免费片| 四季av一区二区三区免费观看| 欧美极品少妇xxxxⅹ裸体艺术 | 91caoporn在线| 亚洲午夜激情av| 日本特黄a级片| 天堂av一区二区三区在线播放 | av手机在线播放| 红桃视频欧美| 成人www视频在线观看| 青青操视频在线| 亚洲人吸女人奶水| 无需播放器的av| 狠狠操综合网| 91av视频导航| 日韩一区二区三区不卡| 亚洲另类在线视频| 色国产在线视频| 激情综合网站| 欧美制服第一页| 四虎永久在线观看| 亚洲线精品一区二区三区八戒| mm131亚洲精品| 国产一区二区精品福利地址| 欧美性受xxx| 婷婷综合激情网| 亚洲妇熟xx妇色黄| 国产xxx在线观看| 欧美成人一品| 成人欧美一区二区三区视频| caopeng在线| 欧美一区二区三区免费观看视频| 美国精品一区二区| 蜜臀av性久久久久蜜臀aⅴ| 品久久久久久久久久96高清| 网友自拍亚洲| 这里只有精品在线播放| www.com亚洲| 久久精品欧美一区二区三区麻豆 | 日本黄色小视频在线观看| 国产精品女主播一区二区三区| 国产精品theporn88| 日本动漫同人动漫在线观看| 日韩欧美一区电影| 国产性猛交普通话对白| 成人高清伦理免费影院在线观看| av免费看网址| 日韩美脚连裤袜丝袜在线| 欧美一区二三区| 精品视频一二三| 欧美在线观看一二区| 俄罗斯毛片基地| 久久www免费人成看片高清| 亚洲AV无码成人精品一区| 韩国三级大全久久网站| 欧美黑人又粗大| 午夜黄色小视频| 日韩欧美高清在线视频| 国精产品一区二区三区| 久久精品国产秦先生| 亚洲精品国产suv一区88| 久久精品国产亚洲5555| 欧美最顶级的aⅴ艳星| jizz视频在线观看| 欧美一区二区观看视频| 日韩免费av片| 国产喷白浆一区二区三区| 日韩欧美亚洲另类| 在线成人国产| 日产精品久久久一区二区| 亚洲精品三区| 午夜精品一区二区三区视频免费看| 日本亚洲一区| 91精品国产入口| 亚州国产精品视频| 国产精品三级av| 国产乱国产乱老熟300部视频| 亚洲美女色禁图| 无码免费一区二区三区免费播放 | 日韩午夜在线| 午夜午夜精品一区二区三区文| 精品亚洲二区| 欧美在线一区二区视频| 国产乱色在线观看| 精品一区二区三区电影| 国产乱淫av片免费| 黑人巨大精品欧美一区免费视频| 91制片厂在线| 26uuu成人网一区二区三区| 999久久久精品视频| 亚洲影音先锋| av动漫在线播放| 国产成人手机高清在线观看网站| av免费观看久久| 91精品xxx在线观看| 久久久人成影片一区二区三区观看| 福利成人在线观看| 亚洲精品suv精品一区二区| 国产精品国产一区二区三区四区| 欧美日韩黄色大片| 欧美三级免费看| 国产精品色婷婷久久58| 国产精品一级黄片| 国产成人在线视频网站| 国产 porn| 国产精品毛片| 欧美黑人在线观看| 99久久精品网| 日韩av一区二区三区美女毛片| 成人午夜三级| 91精品视频免费| 成人国产一区| 国产成人综合亚洲| 日本不卡免费高清视频在线| 久久99视频精品| 国产调教视频在线观看| 中文字幕免费精品一区高清| 麻豆国产在线播放| 日韩精品免费综合视频在线播放| 你懂的网站在线| 日韩欧美国产一区在线观看| 国产一区二区三区黄片| 欧美日韩精品欧美日韩精品一| 无码免费一区二区三区| 黑人巨大精品欧美一区二区免费| 不卡的免费av| 夜夜揉揉日日人人青青一国产精品| 国产精品白丝喷水在线观看| 国产精品久久久久久久久快鸭| 少妇一级黄色片| 国产欧美一区二区三区沐欲| 波多野结衣av在线观看| 久久亚洲一级片| 久久精品国产亚洲av麻豆| 91蜜桃婷婷狠狠久久综合9色| av黄色一级片| 91在线看国产| 韩国无码一区二区三区精品| 91色婷婷久久久久合中文| 少妇饥渴放荡91麻豆| 2023国产精品视频| 91成人破解版| 欧美国产精品中文字幕| 精品少妇一区二区三区在线| 最新成人av网站| 成人在线观看你懂的| 亚洲日韩视频| 草草久久久无码国产专区| 亚洲永久在线| 精品久久久久久久无码| 免费一级欧美片在线观看| 四季av一区二区三区| 国内精品免费**视频| 能看毛片的网站| 国产系列电影在线播放网址| 日本最新不卡在线| 国产精品一国产精品| 北条麻妃高清一区| 91精品尤物| 韩国精品一区二区三区六区色诱| 久久超级碰碰| 欧美日韩一区二区视频在线观看| 精品不卡一区| 日本福利视频导航| 黄色成人91| 18岁视频在线观看| 久久97超碰国产精品超碰| 久久婷婷中文字幕| 成人黄色网址在线观看| 一区二区精品免费| 亚洲欧洲www| 国产精品9191| 在线观看日韩一区| 国产免费的av| 亚洲精品一区中文字幕乱码| 性开放的欧美大片| 久久久久久久久久久久久久久久久久av| 日韩电影免费看| 国产又爽又黄的激情精品视频| 国产精伦一区二区三区| 日韩精品伦理第一区| 欧美在线二区| 国产成人无码av在线播放dvd| 韩国v欧美v亚洲v日本v| 日韩 中文字幕| 亚洲人一二三区| 无码一区二区三区| 日韩久久久久久| 国产一级二级三级在线观看| 欧美精品在线观看| 午夜激情成人网| 成人综合av网| 婷婷综合久久| 精品免费国产一区二区| 国产成人久久精品77777最新版本| 欧美特级黄色录像| 亚洲一区二区三区美女| 中文字幕网址在线| 亚洲九九九在线观看| 4438x成人网全国最大| 国产精品伦子伦免费视频| 电影一区二区在线观看| 亚洲自拍三区| 国产精品久久777777毛茸茸| 国产成人精品综合久久久久99| 国产欧美日韩另类一区| 日韩男人的天堂| 欧美大片在线观看一区| 黄网站app在线观看| 国产精品美女主播在线观看纯欲| 欧美日韩一区二区三区在线电影 | 日韩黄色网络| 国产一区 在线播放| 精品午夜久久福利影院 | 超碰成人在线免费| 天天干天天操天天干天天操| 日韩精品一卡二卡三卡四卡无卡| 成人午夜精品无码区| 亚洲久草在线视频| 97人妻精品一区二区三区动漫| 国产一区二区日韩| 亚洲一二三四| 国产一区二区在线观看免费播放| 欧美日韩影院| 色播亚洲婷婷| 国产精品一国产精品k频道56| 丰满少妇xbxb毛片日本| 亚洲精品日韩综合观看成人91| 一级特黄aa大片| 自拍偷拍亚洲在线| 日韩毛片一区| 日本视频一区在线观看| 美女视频一区免费观看| 亚洲av综合一区二区| 色久综合一二码| 激情小视频在线观看| 国产成人福利视频| 精品国产乱码久久久久久蜜坠欲下 | 免费一二一二在线视频| 国产伦精品一区二区三区视频黑人 | 美女网站视频色| 欧美日韩一区二区三区免费看 | 久久福利网址导航| 美女精品视频在线| 亚洲国产一二三精品无码| 国产精品99久久久久久宅男| 免费看一级一片| 亚洲国产天堂久久综合| 成人爽a毛片免费啪啪| 婷婷四房综合激情五月| 国产一区二区三区在线看麻豆| 欧美成人黄色网| 精品国产乱码久久久久久夜甘婷婷 | 日本一区二区不卡高清更新| 丝袜美腿亚洲一区二区图片| 性欧美精品男男| 欧美男人的天堂一二区| 18av在线视频| 国产综合欧美在线看| 久久高清国产| 女同久久另类69精品国产| 日韩欧美电影在线| 九色porny自拍视频在线播放| 欧美亚洲国产免费| 极品少妇xxxx偷拍精品少妇| 毛片a片免费观看| 国产视频精品久久久| 国产精品原创视频| 国产成人亚洲综合无码| 97se亚洲国产综合自在线| 中文字幕日韩三级| 久久久久成人网| 黑丝美女一区二区| 亚洲成人av免费观看| 精品久久久久久久久国产字幕| 国产福利免费在线观看| 91黄色国产视频| 久久福利精品|