久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

SpringBoot配置數據庫密碼加密的實現

瀏覽:2日期:2023-03-22 14:27:44

你在使用 MyBatis 的過程中,是否有想過多個數據源應該如何配置,如何去實現?出于這個好奇心,我在 Druid Wiki 的數據庫多數據源中知曉 Spring 提供了對多數據源的支持,基于 Spring 提供的 AbstractRoutingDataSource,可以自己實現數據源的切換。

一、配置動態數據源

下面就如何配置動態數據源提供一個簡單的實現:

org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource,代碼如下:

public abstract class AbstractRoutingDataSource extends AbstractDataSource implements InitializingBean { @Nullable private Object defaultTargetDataSource; @Nullable private Map<Object, DataSource> resolvedDataSources; @Nullable private DataSource resolvedDefaultDataSource; @Override public Connection getConnection() throws SQLException { return determineTargetDataSource().getConnection(); } @Override public Connection getConnection(String username, String password) throws SQLException { return determineTargetDataSource().getConnection(username, password); } protected DataSource determineTargetDataSource() { Assert.notNull(this.resolvedDataSources, 'DataSource router not initialized'); // 確定當前要使用的數據源 Object lookupKey = determineCurrentLookupKey(); DataSource dataSource = this.resolvedDataSources.get(lookupKey); if (dataSource == null && (this.lenientFallback || lookupKey == null)) { dataSource = this.resolvedDefaultDataSource; } if (dataSource == null) { throw new IllegalStateException('Cannot determine target DataSource for lookup key [' + lookupKey + ']'); } return dataSource; } /** * Determine the current lookup key. This will typically be implemented to check a thread-bound transaction context. * <p> * Allows for arbitrary keys. The returned key needs to match the stored lookup key type, as resolved by the * {@link #resolveSpecifiedLookupKey} method. */ @Nullable protected abstract Object determineCurrentLookupKey(); // 省略相關代碼...}

重寫 AbstractRoutingDataSource 的 determineCurrentLookupKey() 方法,可以實現對多數據源的支持

思路:

重寫其 determineCurrentLookupKey() 方法,支持選擇不同的數據源 初始化多個 DataSource 數據源到 AbstractRoutingDataSource 的 resolvedDataSources 屬性中 然后通過 Spring AOP, 以自定義注解作為切點,根據不同的數據源的 Key 值,設置當前線程使用的數據源

接下來的實現方式是 Spring Boot 結合 Druid 配置動態數據源

(一)引入依賴

基于 3.繼承SpringBoot 中已添加的依賴再添加對AOP支持的依賴,如下:

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId></dependency>(二)開始實現

1. DataSourceContextHolder

DataSourceContextHolder 使用 ThreadLocal 存儲當前線程指定的數據源的 Key 值,代碼如下:

package cn.tzh.mybatis.config;import lombok.extern.slf4j.Slf4j;import java.util.HashSet;import java.util.Set;/** * @author tzh * @date 2021/1/4 11:42 */@Slf4jpublic class DataSourceContextHolder { /** * 線程本地變量 */ private static final ThreadLocal<String> DATASOURCE_KEY = new ThreadLocal<>(); /** * 配置的所有數據源的 Key 值 */ public static Set<Object> ALL_DATASOURCE_KEY = new HashSet<>(); /** * 設置當前線程的數據源的 Key * * @param dataSourceKey 數據源的 Key 值 */ public static void setDataSourceKey(String dataSourceKey) { if (ALL_DATASOURCE_KEY.contains(dataSourceKey)) { DATASOURCE_KEY.set(dataSourceKey); } else { log.warn('the datasource [{}] does not exist', dataSourceKey); } } /** * 獲取當前線程的數據源的 Key 值 * * @return 數據源的 Key 值 */ public static String getDataSourceKey() { return DATASOURCE_KEY.get(); } /** * 移除當前線程持有的數據源的 Key 值 */ public static void clear() { DATASOURCE_KEY.remove(); }}

2. MultipleDataSource

重寫其 AbstractRoutingDataSource 的 determineCurrentLookupKey() 方法,代碼如下:

package cn.tzh.mybatis.config;import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;/** * @author tzh * @date 2021/1/4 11:44 */public class MultipleDataSource extends AbstractRoutingDataSource { /** * 返回當前線程是有的數據源的 Key * * @return dataSourceKey */ @Override protected Object determineCurrentLookupKey() { return DataSourceContextHolder.getDataSourceKey(); }}

3. DataSourceAspect切面

使用 Spring AOP 功能,定義一個切面,用于設置當前需要使用的數據源,代碼如下:

package cn.tzh.mybatis.config;import lombok.extern.log4j.Log4j2;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.reflect.MethodSignature;import org.springframework.stereotype.Component;import java.lang.reflect.Method;/** * @author tzh * @date 2021/1/4 11:46 */@Aspect@Component@Log4j2public class DataSourceAspect { @Before('@annotation(cn.tzh.mybatis.config.TargetDataSource)') public void before(JoinPoint joinPoint) { MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); Method method = methodSignature.getMethod(); if (method.isAnnotationPresent(TargetDataSource.class)) { TargetDataSource targetDataSource = method.getAnnotation(TargetDataSource.class); DataSourceContextHolder.setDataSourceKey(targetDataSource.value()); log.info('set the datasource of the current thread to [{}]', targetDataSource.value()); } else if (joinPoint.getTarget().getClass().isAnnotationPresent(TargetDataSource.class)) { TargetDataSource targetDataSource = joinPoint.getTarget().getClass().getAnnotation(TargetDataSource.class); DataSourceContextHolder.setDataSourceKey(targetDataSource.value()); log.info('set the datasource of the current thread to [{}]', targetDataSource.value()); } } @After('@annotation(cn.tzh.mybatis.config.TargetDataSource)') public void after() { DataSourceContextHolder.clear(); log.info('clear the datasource of the current thread'); }}

4. DruidConfig

Druid 配置類,代碼如下:

package cn.tzh.mybatis.config;import com.alibaba.druid.support.spring.stat.DruidStatInterceptor;import org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/** * @author tzh * @date 2021/1/4 11:49 */@Configurationpublic class DruidConfig { @Bean(value = 'druid-stat-interceptor') public DruidStatInterceptor druidStatInterceptor() { return new DruidStatInterceptor(); } @Bean public BeanNameAutoProxyCreator beanNameAutoProxyCreator() { BeanNameAutoProxyCreator beanNameAutoProxyCreator = new BeanNameAutoProxyCreator(); beanNameAutoProxyCreator.setProxyTargetClass(true); // 設置要監控的bean的id beanNameAutoProxyCreator.setInterceptorNames('druid-stat-interceptor'); return beanNameAutoProxyCreator; }}

5. MultipleDataSourceConfig

MyBatis 的配置類,配置了 2 個數據源,代碼如下:

package cn.tzh.mybatis.config;import com.alibaba.druid.pool.DruidDataSource;import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;import org.apache.ibatis.mapping.DatabaseIdProvider;import org.apache.ibatis.plugin.Interceptor;import org.apache.ibatis.scripting.LanguageDriver;import org.apache.ibatis.session.ExecutorType;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.type.TypeHandler;import org.mybatis.spring.SqlSessionFactoryBean;import org.mybatis.spring.SqlSessionTemplate;import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer;import org.mybatis.spring.boot.autoconfigure.MybatisProperties;import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;import org.springframework.beans.BeanWrapperImpl;import org.springframework.beans.factory.ObjectProvider;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.boot.context.properties.EnableConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.io.ResourceLoader;import org.springframework.jdbc.datasource.DataSourceTransactionManager;import org.springframework.transaction.PlatformTransactionManager;import org.springframework.util.CollectionUtils;import org.springframework.util.ObjectUtils;import org.springframework.util.StringUtils;import javax.sql.DataSource;import java.beans.FeatureDescriptor;import java.util.*;import java.util.stream.Collectors;import java.util.stream.Stream;/** * @author tzh * @projectName code-demo * @title MultipleDataSourceConfig * @description * @date 2021/1/4 13:43 */@Configuration@EnableConfigurationProperties({MybatisProperties.class})public class MultipleDataSourceConfig { private final MybatisProperties properties; private final Interceptor[] interceptors; private final TypeHandler[] typeHandlers; private final LanguageDriver[] languageDrivers; private final ResourceLoader resourceLoader; private final DatabaseIdProvider databaseIdProvider; private final List<ConfigurationCustomizer> configurationCustomizers; public MultipleDataSourceConfig(MybatisProperties properties, ObjectProvider<Interceptor[]> interceptorsProvider, ObjectProvider<TypeHandler[]> typeHandlersProvider, ObjectProvider<LanguageDriver[]> languageDriversProvider, ResourceLoader resourceLoader, ObjectProvider<DatabaseIdProvider> databaseIdProvider, ObjectProvider<List<ConfigurationCustomizer>> configurationCustomizersProvider) { this.properties = properties; this.interceptors = (Interceptor[]) interceptorsProvider.getIfAvailable(); this.typeHandlers = (TypeHandler[]) typeHandlersProvider.getIfAvailable(); this.languageDrivers = (LanguageDriver[]) languageDriversProvider.getIfAvailable(); this.resourceLoader = resourceLoader; this.databaseIdProvider = (DatabaseIdProvider) databaseIdProvider.getIfAvailable(); this.configurationCustomizers = (List) configurationCustomizersProvider.getIfAvailable(); } @Bean(name = 'master', initMethod = 'init', destroyMethod = 'close') @ConfigurationProperties(prefix = 'spring.datasource.druid.master') public DruidDataSource master() { return DruidDataSourceBuilder.create().build(); } @Bean(name = 'slave', initMethod = 'init', destroyMethod = 'close') @ConfigurationProperties(prefix = 'spring.datasource.druid.slave') public DruidDataSource slave() { return DruidDataSourceBuilder.create().build(); } @Bean(name = 'dynamicDataSource') public DataSource dynamicDataSource() { MultipleDataSource dynamicRoutingDataSource = new MultipleDataSource(); Map<Object, Object> dataSources = new HashMap<>(); dataSources.put('master', master()); dataSources.put('slave', slave()); dynamicRoutingDataSource.setDefaultTargetDataSource(master()); dynamicRoutingDataSource.setTargetDataSources(dataSources); DataSourceContextHolder.ALL_DATASOURCE_KEY.addAll(dataSources.keySet()); return dynamicRoutingDataSource; } @Bean public SqlSessionFactory sqlSessionFactory() throws Exception { SqlSessionFactoryBean factory = new SqlSessionFactoryBean(); factory.setDataSource(dynamicDataSource()); factory.setVfs(SpringBootVFS.class); if (StringUtils.hasText(this.properties.getConfigLocation())) { factory.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation())); } this.applyConfiguration(factory); if (this.properties.getConfigurationProperties() != null) { factory.setConfigurationProperties(this.properties.getConfigurationProperties()); } if (!ObjectUtils.isEmpty(this.interceptors)) { factory.setPlugins(this.interceptors); } if (this.databaseIdProvider != null) { factory.setDatabaseIdProvider(this.databaseIdProvider); } if (StringUtils.hasLength(this.properties.getTypeAliasesPackage())) { factory.setTypeAliasesPackage(this.properties.getTypeAliasesPackage()); } if (this.properties.getTypeAliasesSuperType() != null) { factory.setTypeAliasesSuperType(this.properties.getTypeAliasesSuperType()); } if (StringUtils.hasLength(this.properties.getTypeHandlersPackage())) { factory.setTypeHandlersPackage(this.properties.getTypeHandlersPackage()); } if (!ObjectUtils.isEmpty(this.typeHandlers)) { factory.setTypeHandlers(this.typeHandlers); } if (!ObjectUtils.isEmpty(this.properties.resolveMapperLocations())) { factory.setMapperLocations(this.properties.resolveMapperLocations()); } Set<String> factoryPropertyNames = (Set) Stream.of((new BeanWrapperImpl(SqlSessionFactoryBean.class)).getPropertyDescriptors()).map(FeatureDescriptor::getName).collect(Collectors.toSet()); Class<? extends LanguageDriver> defaultLanguageDriver = this.properties.getDefaultScriptingLanguageDriver(); if (factoryPropertyNames.contains('scriptingLanguageDrivers') && !ObjectUtils.isEmpty(this.languageDrivers)) { factory.setScriptingLanguageDrivers(this.languageDrivers); if (defaultLanguageDriver == null && this.languageDrivers.length == 1) { defaultLanguageDriver = this.languageDrivers[0].getClass(); } } if (factoryPropertyNames.contains('defaultScriptingLanguageDriver')) { factory.setDefaultScriptingLanguageDriver(defaultLanguageDriver); } return factory.getObject(); } private void applyConfiguration(SqlSessionFactoryBean factory) { org.apache.ibatis.session.Configuration configuration = this.properties.getConfiguration(); if (configuration == null && !StringUtils.hasText(this.properties.getConfigLocation())) { configuration = new org.apache.ibatis.session.Configuration(); } if (configuration != null && !CollectionUtils.isEmpty(this.configurationCustomizers)) { Iterator var3 = this.configurationCustomizers.iterator(); while (var3.hasNext()) { ConfigurationCustomizer customizer = (ConfigurationCustomizer) var3.next(); customizer.customize(configuration); } } factory.setConfiguration(configuration); } @Bean public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) { ExecutorType executorType = this.properties.getExecutorType(); return executorType != null ? new SqlSessionTemplate(sqlSessionFactory, executorType) : new SqlSessionTemplate(sqlSessionFactory); } @Bean public PlatformTransactionManager masterTransactionManager() { // 配置事務管理器 return new DataSourceTransactionManager(dynamicDataSource()); }}

6. 添加配置

server: port: 9092 servlet: context-path: /mybatis-springboot-demo tomcat: accept-count: 200 min-spare-threads: 200spring: application: name: mybatis-springboot-demo profiles: active: test servlet: multipart: max-file-size: 100MB max-request-size: 100MB datasource: type: com.alibaba.druid.pool.DruidDataSource druid: master: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/mybatis-demo username: root password: root initial-size: 5 # 初始化時建立物理連接的個數 min-idle: 20 # 最小連接池數量 max-active: 20 # 最大連接池數量 slave: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/mybatis-demo1 username: root password: root initial-size: 5 # 初始化時建立物理連接的個數 min-idle: 20 # 最小連接池數量 max-active: 20 # 最大連接池數量mybatis: type-aliases-package: cn.tzh.mybatis.entity mapper-locations: classpath:cn/tzh/mybatis/mapper/*.xml config-location: classpath:mybatis-config.xmlpagehelper: helper-dialect: mysql reasonable: true # 分頁合理化參數 offset-as-page-num: true # 將 RowBounds 中的 offset 參數當成 pageNum 使用 supportMethodsArguments: true # 支持通過 Mapper 接口參數來傳遞分頁參數

其中分別定義了 master 和 slave 數據源的相關配置

這樣一來,在 DataSourceAspect 切面中根據自定義注解,設置 DataSourceContextHolder 當前線程所使用的數據源的 Key 值,MultipleDataSource 動態數據源則會根據該值設置需要使用的數據源,完成了動態數據源的切換

7. 使用示例

在 Mapper 接口上面添加自定義注解 @TargetDataSource,如下:

package cn.tzh.mybatis.mapper;import cn.tzh.mybatis.config.TargetDataSource;import cn.tzh.mybatis.entity.User;import org.apache.ibatis.annotations.Mapper;import org.apache.ibatis.annotations.Param;/** * @author tzh * @date 2020/12/28 14:29 */@Mapperpublic interface UserMapper { User selectUserOne(@Param('id') Long id); @TargetDataSource('slave') User selectUserTwo(@Param('id') Long id);} 總結

上面就如何配置動態數據源的實現方式僅提供一種思路,其中關于多事務方面并沒有實現,采用 Spring 提供的事務管理器,如果同一個方法中使用了多個數據源,并不支持多事務的,需要自己去實現(筆者能力有限),可以整合JAT組件,參考:SpringBoot2 整合JTA組件多數據源事務管理

分布式事務解決方案推薦使用 Seata 分布式服務框架

到此這篇關于SpringBoot配置數據庫密碼加密的實現的文章就介紹到這了,更多相關SpringBoot 數據庫密碼加密內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: 一区二区色 | 国产精品二区一区 | 在线欧美日韩 | 超碰人人99 | 不卡成人| 精品国产一区二区在线 | 欧美一区不卡 | 日韩免费视频 | 999国产一区二区三区四区 | 成人一区二区三区 | 最新国产在线 | 精品无码久久久久久国产 | 欧美国产日韩在线 | 国产精品久久久久久久久 | 国产精品中文字幕在线播放 | 国产乱码精品一区二区三区忘忧草 | 国产精品99| 中文字幕亚洲欧美日韩在线不卡 | 日韩电影一区二区在线观看 | 日本在线免费电影 | 亚洲伊人久久综合 | 欧美日韩干 | 欧洲精品久久久 | 97精品国产97久久久久久免费 | 美女毛片免费看 | 国产精品原创巨作av | 亚洲色图综合 | 亚洲一区二区三区欧美 | 一级片在线观看免费 | 国产日日夜夜操 | 国产精品视频免费 | www.欧美| 久色视频在线 | 欧美久久成人 | 欧美成人资源 | 国产午夜一区二区三区 | 日韩一本| 久久久蜜桃一区二区人 | 欧美精产国品一二三区 | 天天干夜夜骑 | 国产精品无码永久免费888 | 色网在线观看 | 国产精品久久久久久久久久久久久久 | 欧美精品一级二级 | 亚洲精品国偷拍自产在线观看 | www婷婷av久久久影片 | 在线视频自拍 | 午夜天堂精品久久久久 | 久久99成人 | 国产精品极品美女在线观看免费 | 五月天婷婷在线视频 | 国产精品亚洲精品 | 亚洲人人 | 99久久久国产精品 | 精品国产一区探花在线观看 | 蜜臀av在线播放一区二区三区 | 久久久av亚洲男天堂 | 99久久99热这里只有精品 | 亚洲不卡视频 | 亚洲黄色一级毛片 | 伊人激情网 | 欧美一级片毛片免费观看视频 | 日韩欧美在线一区 | 国产综合视频在线观看 | 日韩高清在线一区 | 日韩欧美视频 | 精国产品一区二区三区四季综 | 久草热8精品视频在线观看 黄色片网站视频 | 午夜影院在线 | www.99久久久| 亚洲一区二区三区蜜桃 | 最新日韩一区 | 狠狠天天 | 奇米色欧美一区二区三区 | 久久精品久久久 | 成人黄色一区 | 国产欧美在线视频 | 日韩精品一二三 | 性色av一区二区三区免费看开蚌 | 欧美一区二区在线 | 九九热精品在线 | 99精品欧美一区二区蜜桃免费 | 夜夜春精品视频高清69式 | 久久精品国产99国产 | 欧美日韩国产精品一区二区 | 81精品国产乱码久久久久久 | 99这里只有精品 | 麻豆免费短视频 | 91国在线高清视频 | 91在线播 | www.国产精| av一区二区在线观看 | 色婷婷综合久色 | 中文精品在线 | 国产精品视频入口 | 午夜精品视频 | 日日网| 日本欧美一区二区 | 欧美成人激情视频 | www色婷婷| 成人中文网 | 综合久久一区 | av日韩一区 | 免费在线看a | 亚洲天堂男人 | 黄色的视频免费 | 国产综合亚洲精品一区二 | 午夜精品亚洲日日做天天做 | 欧美精品在线看 | 久久777 | 黄片毛片| 亚洲精品wwww | 国产日韩一区二区三区 | 日韩精品免费看 | 一区二区av在线 | jizz在线观看 | 欧美精品1区2区3区 欧美视频在线一区 | 久久99精品久久久久久久青青日本 | 亚洲一区二区在线播放 | 欧美精品国产精品 | 国产精品久久久久久婷婷天堂 | www.91av在线 | 久久精品亚洲精品 | 在线成人av | 精品在线一区 | 日韩a∨精品日韩在线观看 山岸逢花在线 | 精品久久久一区二区 | 激情久久av一区av二区av三区 | 欧美美乳| 久久久国产精品 | 亚洲h视频 | 一级欧美一级日韩片 | 91精品国产综合久久婷婷香蕉 | 视频一区二区国产 | 成人不卡在线观看 | 在线视频一区二区三区 | 国产婷婷精品av在线 | 久久狠狠| 91久久久久久 | 麻豆freexxxx性91精品 | 亚洲一区二区在线免费观看 | 久久久国产精品视频 | 四色成人av永久网址 | 欧美综合区| 久精品视频 | 国产精品久久久久久久久免费桃花 | 黄色一级视 | 欧美视频网站 | www日韩| 精品三区在线观看 | 国产 欧美 日韩 一区 | 日韩视频一二 | 欧美成年黄网站色视频 | a毛片在线免费观看 | 国产精品久久久久久久久久东京 | 电影午夜精品一区二区三区 | 日本精品一区二区三区在线观看 | 成人在线激情 | 久久99精品久久久久久久青青日本 | 在线观看毛片网站 | 91精品久久久久久9s密挑 | 精品亚洲网| 国产亚洲精品久久久久动 | 91亚洲在线 | 久久精品欧美一区二区三区不卡 | 色爱区综合| 可以免费看黄的网站 | 欧美一区二区三区在线观看 | 一区电影| 久久精品免费观看视频 | av影院在线观看 | 91人人| 91精品国产自产91精品 | 国产高清在线精品一区二区三区 | 成人爽a毛片一区二区免费 美女高潮久久久 | 亚洲大片一区 | 老司机狠狠爱 | 国产中文在线 | 亚洲91| 天天干天天爽 | 宅男伊人 | 精品久久久久久国产 | 欧美一区免费 | 国产精品一区二区视频 | 中文字幕一区日韩精品欧美 | 亚洲一区二区av | 超碰一区| 日韩精品一区二区在线观看 | 伊人手机在线视频 | 狠狠操天天干 | 亚洲国产日韩在线 | 国产在线第一页 | 人人澡人人射 | 欧美精品1区2区3区 免费亚洲婷婷 | 成人一区二区三区 | 中文字幕亚洲第一 | 黄的视频网站 | sis001亚洲原创区 | 精品国产31久久久久久 | 国产无套一区二区三区久久 | 欧美另类综合 | 亚洲精品亚洲人成人网 | 99re99| 国产精品日韩欧美一区二区三区 | 免费黄色看片 | 91精品中文字幕一区二区三区 | 日韩午夜在线视频 | 欧美日韩亚洲视频 | 伊人久久综合 | 中文字幕一区二区三区四区 | 国产目拍亚洲精品99久久精品 | 青青草网| 国产一区91 | 国产片侵犯亲女视频播放 | 中文字幕在线免费观看 | 国产剧情一区二区 | 久久爱9191| 日韩精品在线视频观看 | 日韩一区二区三区视频 | 欧美激情精品久久久久久 | 无套内谢孕妇毛片免费看红桃影视 | 亚洲激情一区二区 | 欧美性视频网站 | 国产丝袜一区二区三区免费视频 | 国内自拍视频在线观看 | 亚洲社区在线观看 | 国产一区二区在线播放 | 99精品国产在热久久 | 久久精选视频 | 黄色片一区 | 欧美日韩在线免费 | 日韩中文字幕在线播放 | 亚洲男人天堂 | 视频一区二区三区中文字幕 | 国产精品久久久久久久久岛 | 久久国产精品视频 | www中文字幕 | 久久久国色 | 天天操天天舔 | 黄色a级 | 成人免费看黄色 | 麻豆国产露脸在线观看 | 精品久久久久国产免费 | 免费观看羞羞视频网站 | 欧美日韩国产一区二区三区不卡 | 国产日韩精品在线 | 亚洲九九| 国产欧美精品一区二区 | 国产一区二区三区免费 | 中文字幕久久精品 | av日韩在线看 | 免费一级在线观看 | 海外中文字幕在线观看 | 亚洲精品一区二区网址 | 亚洲一区二区伦理 | 午夜tv免费观看 | 色综合久久一区二区三区 | 欧美在线视频一区 | 久久精品久 | 久久在线播放 | 国产精品一区久久久久 | 精品久久久久久久久久久久久久 | 色婷婷精品国产一区二区三区 | 最近免费中文字幕大全免费版视频 | 国产综合视频在线观看 | 久久精品| 中文字幕亚洲欧美日韩在线不卡 | 国产草草视频 | 四虎影院网 | 在线国产视频 | 一级片在线免费看 | 中文字幕一区二区三区乱码图片 | 国产精品国产成人国产三级 | 日韩中文字幕一区 | 欧美欧美欧美 | 91碰碰 | 欧洲一级黄| 午夜影院黄色 | 超碰免费在线观看 | 国产剧情一区二区 | 成人av在线看 | 国产一区在线看 | 欧美一区久久 | 男人阁久久 | 一级毛片视频播放 | 日韩一二区 | 成版人性视频 | 色综久久 | 国产精品久久久久久亚洲调教 | 精品在线播放 | 综合一区二区三区 | 日本久久久一区二区三区 | 欧美日韩国产不卡 | 国产激情午夜 | 日韩激情综合网 | 精品一区二区久久 | 国产女人和拘做受在线视频 | 天天久久 | 在线日本中文字幕 | 亚洲中午字幕 | 欧美激情精品久久久久久 | 欧美日韩成人在线 | 日本久久久亚洲精品 | 亚洲在线一区二区 | 国产精品国产成人国产三级 | 在线视频a| 黄色资源在线观看 | 国产日韩一区二区 | 日韩超级大片免费看国产国产播放器 | 一级一片免费视频 | 欧美精品色 | 国产精品一区av | 伊人网站在线 | 成人免费一区二区三区视频软件 | 国产精品永久 | 在线一级视频 | 日韩影院在线 | 91超碰在线观看 | 欧美日韩一区不卡 | 一级人爱视频 | 在线观看成人av | 午夜在线观看视频网站 | 国产女人高潮视频在线观看 | 91色爱| 欧美在线播放 | 国产精品久久久99 | 国产欧美日韩精品一区 | 国产中文视频 | 日韩免费 | 日韩免费视频一区二区 | 欧美日韩国产精品一区二区亚洲 | 国产一区二区在线免费观看 | 国产精品视频一区二区三区不卡 | 久久精品国产久精国产 | 国产日产精品一区二区三区四区 | eeuss国产一区二区三区四区 | 久久久久久国产精品 | 亚洲免费网站在线观看 | 刘亦菲的毛片 | 国产久 | 在线观看免费黄色 | 国产在线视频在线 | av 一区二区三区 | 欧美日韩一区二区三区四区 | 久久性 | 欧美一区二区三区免费在线观看 | 一区二区三区国产视频 | 久久噜噜噜精品国产亚洲综合 | 在线视频日韩 | 亚洲精品视频国产 | 亚洲视频免费网站 | 深夜福利亚洲 | 亚洲一区二区高清视频 | 91麻豆精品国产91久久久久久久久 | 99久热精品 | 亚洲 欧美 日韩在线 | 91久久精品一区二区二区 | 国产美女在线观看 | 亚洲视频在线免费观看 | jizz欧美最大 | 看欧美黄色录像 | 男女18免费网站视频 | 91在线播| 国产高清在线精品一区二区三区 | 国产在线观看一区二区 | 国产成人精品久久二区二区91 | 超碰人人爱| 日韩视频免费在线播放 | 日韩亚洲一区二区 | 日韩国产在线 | 理伦影院 | 日韩免费在线观看视频 | 国产精品久久久久久久 | 日本在线视频不卡 | 欧美综合在线一区 | 国外成人在线视频 | 中文字幕日韩欧美一区二区三区 | 精品在线看 | 免费在线观看成年人视频 | 国产成人精品午夜视频免费 | 成人久久久精品国产乱码一区二区 | 欧美成人精品在线观看 | 亚洲精品久久久 | 午夜精品一区二区三区免费视频 | 国产精品美女一区二区三区四区 | 欧美日韩中文字幕在线 | 一级黄色录像毛片 | 欧美激情首页 | 国产精品毛片一区二区在线看 | 成人精品视频在线 | 四季久久免费一区二区三区四区 | 一级片在线观看 | 毛片网络 | 日韩aaa视频 | 精品日韩 | 日韩成人免费av | 亚洲三级在线观看 | 欧美一级播放 | 欧美日韩精品一区二区三区 | 日本1区2区| 免费一区二区三区 | 中文字幕日韩欧美 | 成人h视频在线观看 | 国产 欧美 日韩 一区 | 国产无套一区二区三区久久 | 日本免费三片免费观看 | 在线观看日韩 | 在线日韩欧美 | 91啦| 毛片免费网站 | 日操 | 一级视频在线观看 | 精品一区免费 | 免费看国产一级特黄aaaa大片 | 夜夜骑av | 91久久艹 | 免费国产一区 | 中国1级黄色片 | 精品视频网 | 一区在线视频 | 中文字幕第一页在线 | 日韩激情一区二区 | 无码少妇一区二区三区 | 国产激情午夜 | 99精品一区二区三区 | 国产精品亚洲综合 | 黄色片地址 | 中文在线一区 | 99爱在线观看 | 久久影视精品 | 国产伦精品一区二区 | 在线视频三级 | 福利91| 一级免费毛片 | 久久久久久一区 | 国产无套一区二区三区久久 | 国产精品国产三级国产aⅴ9色 | 国产精品视频一区二区三区 | 免费看黄视频网站 | 卡通动漫第一页 | 午夜私人影院在线观看 | 国产成人精品一区二区视频免费 | 日韩欧美国产一区二区三区 | 夜夜av| 亚洲91在线 | 精品91| 国产成人精品一区二区三区网站观看 | 亚洲免费视频在线观看 | 久久久久久国产精品 | 久久99精品久久久久久按摩秒播 | 美女视频一区二区三区 | 红杏aⅴ成人免费视频 | 欧美精品第一页 | av一区二区在线观看 | 亚洲一区成人在线观看 | 天天舔夜夜操 | 可以在线观看的黄色 | 午夜羞羞 | www.色在线 | 午夜激情在线免费观看 | 国产伦精品一区二区三区四区视频 | 欧美一区二区三 | 四色成人av永久网址 | 精品国产91亚洲一区二区三区www | 在线成人亚洲 | 久久国产精品久久 | 毛片网站在线观看 | 91看片官网 | 亚洲精品aaa | 91精品国产日韩91久久久久久 | 波多野结衣先锋影音 | 国产欧美精品一区二区三区四区 | 国产一级黄色av | 男人的天堂在线视频 | 中文字幕亚洲欧美 | 欧美日韩国产一区二区三区 | 在线观看欧美日韩 | 欧美成人猛片aaaaaaa | 在线一区 | 亚洲一区二区免费看 | 亚洲欧美日韩电影 | 欧美日韩精品一区二区三区 | 国产精品美女www爽爽爽软件 | 一区二区三区在线不卡 | 精品久久久久久亚洲精品 | 中午字幕在线观看 | 亚洲一区久久久 | 麻豆一区一区三区四区 | 一区二区精品在线 | 久久1区 | 国产精品成人一区二区 | 91av在线不卡 | 亚洲国产精品一区 | 精品一区二区久久久久久久网站 | 北条麻妃一区二区三区中文字幕 | 日本久久精品电影 | 天天干天天草 | 日韩精品一区二区三区中文在线 | 免费无遮挡www小视频 | 自拍偷拍精品 | 奇米影视77| 国产精品乱码一区二区三区 | 精品国产一区二区三区日日嗨 | 国产一区二区三区在线看 | 成人午夜免费视频 | 夜夜视频 | 国产欧美日韩在线观看 | 国产成人一区 | 精品久久久蜜桃 | 色www精品视频在线观看 | 亚洲男人天堂网 | 欧美精品一区二区三区在线 | 一区二区中文 | 亚洲一区二区三区蜜桃 | 欧美成人免费在线视频 | 日韩欧美中文字幕在线视频 | 色悠悠久久| 国产精久久 | 日本免费一区二区三区 | 亚洲国产一区二区在线观看 | 久久9色| 精品亚洲国产成av人片传媒 | av免费网站在线观看 | 欧美一级欧美三级在线观看 | 女同久久另类99精品国产 | 一级一级黄色片 | 亚洲国产免费 | 免费av一区二区三区 | av中文字幕第一页 | 中文字幕一区在线观看视频 | 亚洲免费在线视频 | www.毛片 | 日韩视频中文字幕 | 色天天综合久久久久综合片 | 免费在线观看一区二区 | 91精品久久久久久久久 | 日本一区二区不卡 | 国产超碰人人模人人爽人人添 | 欧美日韩国产综合视频 | 国产欧美日韩精品在线 | 精品久久久久久久久福利 | 日韩精品免费在线观看 | 99re在线观看 | 日本高清精品 | 中文字幕av一区二区 | 91视频专区 | 亚洲一区免费视频 | 天堂中文字幕 | 亚洲欧洲一区二区 | 麻豆国产露脸在线观看 | 国产三级黄色毛片 | 久久免费精品 | 国精产品一区二区三区黑人免费看 | 黑人巨大精品欧美黑白配亚洲 | 欧美日韩电影一区二区三区 | 爱爱视频网站 | 99免费在线视频 | 久久精品网 | 久久久精品免费观看 | 久久成人18免费网站 | 亚洲欧美在线一区 | 精品免费视频 | 欧美激情国产日韩精品一区18 | 美女午夜影院 | 羞羞视频在线免费 | 成人免费在线视频 | 伊人久操 | 韩国一区二区视频 | 欧美日韩亚洲成人 | 午夜一区二区三区在线观看 | 欧美一级在线视频 | 国产日韩精品一区二区 | 一区二区三区视频免费看 | 美女又黄又免费 | 狠狠爱www人成狠狠爱综合网 | 99国产精品久久久久久久 | 欧美亚洲综合久久 | 日韩视频一区二区三区在线观看 | 先锋影音在线 | 成人免费视频视频在线观看 免费 | 一区电影 | 国产精品国产精品 | 国产精品视频 | 在线观看欧美一区 | 婷婷五月色综合 | 久久精品色欧美aⅴ一区二区 | 国产一区二区欧美 | 欧美一级在线 | 狠狠操夜夜爱 | 91中文字幕在线观看 | 国产一级特黄视频 | 婷婷伊人| 日韩免费视频中文字幕 | 国产精品一区一区三区 | www.蜜桃av | 欧美日韩成人一区 | 91精品久久久久久久久入口 | 一区二区色 | 中文字幕欧美激情 | 久热免费在线观看 | 一区二区三区亚洲精品国 | 午夜a级理论片915影院 | 国产精品777一区二区 | 夜夜骑日日操 | 亚洲www视频 | 亚州精品视频 | 欧美日韩一级在线观看 | 麻豆视频国产 | 一区二区三区四区在线 | 午夜操操| 日韩精品一区二区三区中文字幕 | 欧美日韩精品一区二区在线播放 | 国产区视频在线观看 | 美女久久久久久久久久久 | 久久国产精品久久久久久 |