黄a在线观看-黄a在线-黄a大片-黄色片在线看-黄色毛片免费-黄色大片网站

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

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

瀏覽:23日期: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
相關文章:
主站蜘蛛池模板: 九草视频在线观看 | 中文字幕av在线播放 | 精品乱码一区二区三区 | 少妇高潮喷水久久久久久久久久 | www天天干com | 国产亚洲精品久久久久四川人 | 国产成人免费观看 | 国产日韩欧美专区 | 亚洲精品久久久久久下一站 | 欧美人与动牲交a欧美精品 98久9在线 | 免费 | 蜜臀精品国产高清在线观看 | 午夜精品网 | 中文字幕五区 | 免费观看黄色一级视频 | 欧美乱妇在线观看 | 国产大陆亚洲精品国产 | 亚洲高清视频在线播放 | 免费观看日韩 | av片在线看免费高清网站 | 无遮挡黄色| 91精品国产综合久久久蜜臀 | 你懂的91| 欧美性生活xxx | 最新国产在线 | 日本人与黑人做爰视频网站 | 一区二区三区在线播放视频 | 一区二区三区四区蜜桃 | 英语老师丝袜娇喘好爽视频 | 八区精品色欲人妻综合网 | 久热国产精品视频一区二区三区 | 播放灌醉水嫩大学生国内精品 | 高潮毛片无遮挡免费看 | 日本在线小视频 | 中文字幕一本 | 日产精品入口 | 国产美女包臀裙一区二区 | 噼里啪啦完整高清观看视频 | 亚洲欧美色一区二区三区 | 亚洲国产成人精品无码一区二区 | 青青操在线观看 | 国产综合免费视频 | 国产性猛交xx乱视频 | 吃奶av | 可以免费看av的网站 | 老司机在线观看视频 | 四虎精品一区二区免费 | 国产亚洲一区二区在线观看 | 精品一区二区三区免费视频 | 人妻体内射精一区二区三区 | 免费成人黄 | 国产资源在线播放 | 国产亚洲精品久久久 | 国产午夜精品一区二区三区不卡 | 国产青青在线 | 国产精品久久久久久久久动漫 | 精品美女一区二区三区 | 嫩草av91| 亚洲乱码中文字幕久久孕妇黑人 | 欧美日韩精品人妻狠狠躁免费视频 | 中文字幕国产 | 成人免费视频播放 | aaaaa级少妇高潮大片免费看 | 国产高清精品在线 | 一级特色大黄美女播放 | 91av毛片| 日韩成人无码 | 精品久久久久久中文字幕人妻最新 | 奶罩不戴乳罩邻居hd播放 | 五月天中文字幕mv在线 | 国语久久 | 国产精品久久久区三区天天噜 | 久久久久久久久久91 | 五月婷激情 | 国产成人乱色伦区 | 久久人人爽人人爽人人片av免费 | 91亚洲国产成人精品一区二三 | 国产精品久久久久久久久久久免费看 | 久久无码精品一区二区三区 | 国产偷国产偷亚洲清高动态图 | 日本精品视频一区 | 亚洲视频久久 | 国产淫视频 | 国内国外精品影片无人区 | 东京热加勒比无码少妇 | 男女啪祼交视频 | 男人添女荫道口视频a | 久久久久久人妻一区精品 | 久久精品无码观看tv | 男人天堂网在线 | 久久精品国产亚洲沈樵 | 中文在线а天堂中文在线新版 | 国产精品无码一区二区三级 | 香蕉成人在线视频 | 国产精品美女久久久久久久网站 | 免费观看黄色一级视频 | 成长快手短视频在线观看 | 久久香综合精品久久伊人 | 在线观看欧美一区二区三区 | 天天摸天天舔天天操 | 亚洲va中文在线播放免费 | 国产精品无套 | 五级黄高潮片90分钟视频 | 国产精品视频久久久久久久 | 亚洲日韩欧美国产高清αv 性夜久久一区国产9人妻 | 97色伦图片 | 中国黄色一级毛片 | 欧美猛少妇色xxxxx | 成人看片黄a免费看视频 | 亚洲精品成人a8198a | 十八禁无码免费网站 | 成年女人色毛片 | 国产精品99久久久久的智能播放 | 亚洲综合色婷婷在线观看 | 日日摸日日干 | 国产亚洲精品美女久久久 | 日本最新偷拍小便视频 | 亚洲精品视频在线免费播放 | 成人综合网站 | 亚洲第一天堂无码专区 | 日韩精品乱码av一区二区 | 国语精品一区二区三区 | 亚洲系列在线观看 | 九九热精品视频在线观看 | 爆乳熟妇一区二区三区 | 色综合久久天天 | 国产三级香港三韩国三级 | 秋霞av亚洲一区二区三 | 男女下面进入的视频免费午夜 | 久草欧美 | 超碰在线人人干 | 爱弓凉在线视频一区二区 | 无码国产成人午夜电影在线观看 | 女人与拘做受全过程免费视频 | 永久免费成人代码 | 亚洲一级视频在线观看 | 国产精品国产三级国产专播品爱网 | 我撕开了少妇的蕾丝内裤视频 | 欧美人妻日韩精品 | 精品少妇一区二区三区免费观 | 日本美女极度性诱惑卡不卡 | 亚洲区小说区激情区图片区 | 一区二区三区在线 | 欧 | 色中色成人导航 | 免费成年人高清视频 | 黄色片子视频 | 亚洲免费一区二区 | 又黄又爽的视频在线观看 | 91亚洲国产成人精品性色 | 91高清在线视频 | 国产露脸无套对白在线播放 | 国产femdom调教557 | yy77777丰满少妇影院 | 成人激烈床戏免费观看网站 | 久久男人网 | 久久久精品二区 | 无码人妻出轨黑人中文字幕 | 肉嫁高柳在线 | 青青草97国产精品免费观看 | 成人免费看黄网站在线观看 | 亚洲色成人www永久网站 | 一交一性一色一伦一区二 | 国产精品无码v在线观看 | 国产激情无码一区二区 | 寡妇高潮一级视频免费看 | 久久久久国产精品一区三寸 | 蜜桃av噜噜一区二区三区小说 | 久久久www成人免费毛片麻豆 | 在线视频毛片 | 一区二区在线视频 | 日韩三级黄色毛片 | 麻豆三级在线观看 | 亚洲精品久久一区二区三区 | 无码人妻精品一区二区三区9厂 | 搡老岳熟女国产熟妇 | 精品人妻码一区二区三区 | 成人一级视频 | 高潮毛片又色又爽免费 | 97国产精 | 亚洲成a人片在线观看高清 成年女人a毛片免费视频 | 夜夜躁日日躁狠狠久久88av | 99热在线精品国产观看 | 成人免费无码大片a毛片软件 | 88国产精品欧美一区二区三区 | 在线无码av一区二区三区 | 免费中文字幕 | 欧美精品久久久久久久免费软件 | 噼里啪啦国语影视 | 日韩视频一区在线观看 | 久久久久久aaaabbbb | 少妇高潮喷水久久久影院 | 亚洲免费色图 | 国产肥老妇对白清 | 亚洲第一天堂无码专区 | 操mm影院| 91精品国产麻豆 | 99精品国产高清在线观看 | 欧美日本另类 | 国精产品一品二品国精在线观看 | 日本人添下边视频免费 | 欧美午夜精品一区二区三区 | 夫の目の前侵犯中文字 | 欧美成人精精品一区二区三区 | 国产二区三区视频 | 91精品国产综合久久香蕉的特点 | 久久在线免费 | 男人天堂aaa| 日韩伦理大全 | 国产精品精品久久久久久甜蜜软件 | 久久精品波多野结衣 | 亚洲色偷拍另类无码专区 | 免费观看的无遮挡av | 日本男女网站 | 欧美亚洲另类视频 | 伦理av在线 | 国产精彩视频在线 | 修仙性瘾荡乳小说h | 毛片av免费 | 亚洲精品蜜桃久久久久久 | 免费久久精品 | 中文天堂在线www | 亚洲成人免费看 | av中文字幕av | 嫩草国产福利视频一区二区 | 韩国无码色视频在线观看 | 五月激情av| 久久黄网站 | 精品国精品自拍自在线 | 不卡视频国产 | 91天天| 国产精品夜夜嗨视频免费视频 | 涩涩成人 | 超污网站在线看 | 天天天操操操 | 欧美老妇与zozoz0交 | 99久久婷婷国产综合精品免费 | 欧美成人a交片免费看 | 天天曰天天操 | 欧美性色黄大片人与善 | 国产精品99久久久久久www | 黄色av网站在线免费观看 | 丁香狠狠色婷婷久久综合 | 久久久久久久久毛片精品 | 日本黄色三级网站 | 精品一卡二卡三卡四卡 | 精品久久久一区 | 国产精品三级在线观看无码 | 98视频精品全部国产 | 国产精品入口传媒小说 | 偷拍综合网 | 欧美人伦 | 精品久久久久一区二区国产 | 99久久久无码国产精品6 | 男女视频国产 | 欧美成人高潮一二区在线看 | 国产人成精品 | 在线免费观看的av | 亚洲欧美日本国产高清 | 欧美一区二区影院 | 青青操视频在线 | 久久国产自偷自偷免费一区调 | 无遮挡色视频免费观看 | 免费在线视频你懂的 | 免费人成在线观看视频高潮 | 国产亚洲精品久久久久久国模美 | 制服av在线 | 狠狠色综合网站久久久久久久高清 | 毛片av免费| 久久www免费人成看片美女图 | 日本精品三级 | 国产精品推荐 | a一级黄色片| 最新无码a∨在线观看 | 在厨房拨开内裤进入毛片 | 亚洲欧美日韩中文字幕一区二区三区 | 8090yy成人免费看片 | 日韩黄色一级大片 | 免费人成自慰网站 | 色视频欧美一区二区三区 | 久久精品人人做人人爱爱站长工具 | 一色屋精品视频在线观看 | 国产欧美日韩综合精品一区二区 | 欧美高清性xxxxhdvideos | 国产精品区一区二区三含羞草 | 美国美女黄色片 | 精品一区二区三区在线播放视频 | 中文字幕永久区乱码六区 | 一女二男一黄一片 | 国产三级黄色 | 992tv成人国产福利在线 | 亚洲精品乱码久久久久久金桔影视 | 国产精品三级一区二区 | 欧美性色黄大片a级毛片视频 | 可以免费看成人啪啪过程的软件 | 欧美在线视频免费 | 欧美亚洲综合另类 | 国产成人免费9x9x人网站视频 | 淫片在线| 精品国产乱码久久久久久1区二区 | 又爽又高潮视频a区免费看 又爽又黄axxx片免费观看 | 高清不卡一区二区 | 久久久久久亚洲精品杨幂圣光 | 中国字幕一色哟哟 | 国产高清av首播原创麻豆 | 麻麻张开腿让我爽了一夜 | 欧洲-级毛片内射 | 日本肉体xxxx裸体137大胆图 | 美女裸体视频永久免费 | 日本公妇乱偷中文字幕 | 另类视频在线观看+1080p | 久久久久久久久99精品 | 成年人免费毛片 | 日本公与丰满熄的 | 国产成人性色生活片 | 天天插天天干天天操 | 精品国产欧美一区二区 | 中文字幕日韩专区 | 国产成人一区二区三区在线观看 | 亚洲国产成人精品女人久久 | mm31美女爽爽爽爱做视频vr | 国产成人免费9x9x | 日韩欧美黄色片 | 暖暖av在线 | 午夜成人1000部免费视频 | 色婷婷av一区二区三区大白胸 | 天天草影院 | 国产精品系列在线播放 | 波多野结衣激情视频 | 国产成人精品一区二区三区网站观看 | 日本va欧美va国产激情 | 欧美精品偷拍 | 人妻丰满熟妇av无码区乱 | 亚洲精品日韩丝袜精品 | 久久99国内精品自在现线 | 日本手机在线视频 | 精品一区二区三区久久 | 精品久久久久中文字幕日本 | 中文字幕日韩二区一区田优 | 亚洲第一成年免费网站 | 国产综合内射日韩久 | 秋霞福利影院 | 免费中文字幕日韩 | 亚洲精品精华液一区 | 一级黄色免费片 | 综合伊人久久 | 波多野结衣在线播放 | 日本午夜三级 | 久久合合 | 国产偷倩视频 | 拍拍拍产国影院在线观看 | 在线天堂中文在线资源网 | 亚洲精品伊人 | 日本a√在线观看 | 亚洲爽爽爽 | 国产又黄又爽又色的视频 | 亚洲色诱| 亚洲日韩国产av无码无码精品 | 精品国精品自拍自在线 | av操操操 | av永久免费观看 | 蜜臀av免费一区二区三区久久乐 | 色婷婷av一区二区三区之e本道 | 老熟女 露脸 嗷嗷叫 | 久久久免费视频观看 | 亚洲日韩一区二区三区 | 182tv福利视频 | 女人18毛片a级毛片一区二区 | 日本久久免费 | 黑人巨大跨种族video | 天堂久久久久久久 | 中文字幕三区 | 国产情侣一区二区三区 | 成年人视频网址 | 国内精品人妻无码久久久影院蜜桃 | 中文字幕免费在线看 | 麻豆一区二区99久久久久 | 99久久国产综合精品女不卡 | 国产一二区三区 | 亚洲人成一区二区 | 国产91www| 在线观看亚洲色图 | 99精品视频免费观看 | 亚洲情在线| 苍井优三级在线观看 | 18禁黄网站禁片免费观看女女 | 九九热综合 | 成 人 免费 黄 色 视频 | 日本亚洲精品成人欧美一区 | 精品 日韩 国产 欧美 视频 | 日韩视频在线观看视频 | 先锋影音男人 | 我要看一级黄色毛片 | 中国黄色一级片 | 91豆花精品一区 | 海角社区在线视频播放观看 | 日本japanesexxx人妖 | 欧美日韩高清不卡 | 国产精品久久久久久免费免熟 | 顶级少妇做爰视频在线观看 | 亚洲天堂在线观看视频 | 国产女人和拘做受视频免费 | 亚洲一区二区三区在线 | 人av在线 | 91高清在线视频 | 性猛交ⅹxxx富婆视频 | 色综合久久久久久久久五月 | 亚洲国产成人久久一区二区三区 | 亚洲国产高清在线观看视频 | 日日摸夜夜添夜夜添一区二区 | 欧美精品久久久久久久久免 | 伊人色综合久久天天人手人婷 | 久久国产精品偷 | 国产超级va在线观看视频 | 成人免费在线视频 | 蜜臀一区 | 国产精品性色 | 国产精品毛片va一区二区三区 | 男女精品久久 | 成人午夜精品无码区久久 | 91在线视频网址 | 97久久精品人人做人人爽50路 | 激情婷婷六月 | 黄色录像a | 欧美国产日韩在线视频 | 国产精品一区二区免费视频 | 337p日本欧洲亚洲大胆艺术图 | 国产无遮挡又黄又爽免费视频 | 素人av在线 | 日韩欧美国产成人 | 伊人网免费视频 | 亚洲精品一区二区三区四区乱码 | 国产成人精品白浆久久69 | 草草夜色精品国产噜噜竹菊 | 爱爱一区| 黑人大群体交免费视频 | 日韩爱爱网| 久久天天躁狠狠躁夜夜av | 舌吻激情大尺度做爰视频 | 农村乱人伦一区二区 | 国产一区二区三区久久久 | 北条麻妃在线一区二区韩世雅 | 国产真人做爰毛片视频直播 | 国产女人视频 | 黑人性较视频免费视频 | 亚洲自拍在线观看 | 亚洲36d大奶网 | 少妇人妻偷人精品免费视频 | 欧美亚洲视频一区 | 日本妞一区 | 久久久影视文化传媒有限公司 | 色中色综合网 | 色婷婷一区二区三区四区成人网 | 国产精品一区二区久久乐下载 | 精品人妻无码一区二区三区抖音 | 亚洲精品一区中文字幕乱码 | 91啦中文| 91精品国产91久久久 | 精品国产一区二区三区在线 | 国产成人综合在线观看不卡 | 狠狠鲁影院 | 亚洲黄在线观看 | 精品国产成人av在线免 | 日韩在线观看av | 超碰在线最新地址 | av在线不卡观看 | 国产做a爰片久久毛片a片美国 | 国产精品免费观看视频 | 多p混交群体交乱小说 | 麻豆精品国产精华精华液好用吗 | 日韩一区国产二区欧美三区 | 99视频一区 | 黄色片18 | 国产叼嘿视频在线观看 | 久久久久久欧美精品se一二三四 | 麻豆专区一区二区三区四区五区 | 欧美成人做爰猛烈床戏 | 成人久久网站 | 神马午夜伦理影院 | 国产精品自拍一区 | 久久精品国产99久久99久久久 | 国产精品毛片视频 | 欧美一级淫片aaaaaaa喷水 | 中文字幕高清免费日韩视频在线 | 九九99九九精彩46 | 久久中文字幕人妻熟av女 | 久久久久久伊人高潮影院 | 亚洲美女一级片 | 精品久久久久久一区二区里番 | 国产在线拍 | 成人国产精品免费 | 免费看亚洲 | 中文字幕在线乱 | 伊人成人在线 | 女女av在线 | 深爱五月网 | 欧美一级做a爰片久久高潮 欧美一级做a爰片免费视频 | 日本少妇性生活 | 疯狂做受xxxx欧美肥白少妇 | 免费久久| 狠狠狠色丁香婷婷综合久久五月 | 久久久青草婷婷精品综合日韩 | 高h乱l高辣h文乱古文 | 国产视频精品在线 | 狠狠操天天射 | 亚洲va久久久噜噜噜久久男同 | 欧美多p视频 | 国内精品久久久久 | 骚妇毛片 | 国产午夜人做人免费视频 | 黄色一集片| 午夜久久一区 | 六月成人网| 国产成人精品综合 | 亚洲天堂网址 | 久久精品国产一区二区三区不卡 | a毛片毛片av永久免费 | а√最新版天堂资源 | 国产成人免费一区二区三区 | 国产在线拍揄自揄拍视频 | 爱久久av一区二区三区 | 最新69国产成人精品视频免费 | 国产伦精品一区二区三区视频孕妇 | 亚洲精品国产剧情久久9191 | 岛国av毛片| 日韩欧美在线综合网 | 久久免费看毛片 | 久久久国产一区二区三区四区 | 香蕉久久一区二区不卡无毒影院 | 五月天国色天香国语版 | 久久国产成人精品国产成人亚洲 | 亚洲第一av网站 | 香蕉视频免费在线观看 | 欧美日韩国产在线观看 | 电梯男女做爰视频 | 一级做a爱片久久毛片 | 天堂视频在线免费观看 | 国产做爰全过程免费视频 | 精品免费国产一区二区三区四区介绍 | 亚洲一区二区在线播放 | 日韩黄色片免费看 | 性一交一乱一色一情丿按摩 | 欧美18精品久久久无码午夜福利 | 一级特黄色大片 | 国产偷v国产偷v亚洲高清 | 色人阁亚洲 | 午夜久| 亚洲国产欧美在线观看 | 丝袜 制服 清纯 亚洲 | 裸体女人高潮毛片 | 国产成人亚洲综合 | 色婷婷5月天 | 国语精品| 国产三级理论片 | 97超碰成人| 99这里有精品 | 亚洲欧美日韩在线不卡 | 男女后进式猛烈xx00动态图片 | 欧美日韩一二三四区 | 婷婷综合少妇啪啪喷水动态小说 | 免费一级毛毛片 | 国产精品成人一区 | 性xxxx18 | 免费在线看黄色片 | 天天插日日插 | 亚洲制服丝袜一区二区三区 | 99天堂网| 鲁一鲁一鲁一鲁一色 | 99精品视频一区 | 日本大学生三级三少妇 | 97人人添人澡人人爽超碰 | 天海翼激烈高潮到腰振不止 | 黑人粗一硬一长一进一爽一a级 | 成人欧美在线视频 | 99精品国产一区二区 | 成人欧美在线视频 | 国产乱对白刺激视频 | 全国最大成人免费视频 | 午夜寂寞少妇aaa片毛片 | jzz国产| 在线成人一区 | 免费无码又黄又爽又刺激 | 欧美一区二区 | 66亚洲一卡2卡新区成片发布 | 激情人妻另类人妻伦 | 妞干网av | 风韵少妇性饥渴推油按摩视频 | 国内av免费| 无遮挡啪啪摇乳动态图 | 伦人伦xxx国语对白 伦为伦xxxx国语对白 | 欧美三级午夜理伦三级 | 国产亚洲色婷婷久久99精品 | 欧美日韩久久精品 | 亚洲国产成人aⅴ毛片大全密桃 | 岛国免费的毛片 | 免费网站日本a级淫片免费看 | 日韩视频精品一区 | 极品少妇被啪到呻吟喷水 | 性一交一无一伦一精一品 | 色噜噜狠狠一区二区三区狼国成人 | 成人精品国产 | 波多野结衣丝袜ol在线播放 | 中文字幕人妻伦伦 | 91视频播放 | 久久久久久久久久一级 | 国产香蕉在线观看 | 亚洲精品无码国产片 | 国产自偷自偷免费一区 | а天堂中文最新一区二区三区 | 性xxxx视频播放免费 | 欧美日韩精品一区二区天天拍 | 国模私拍av| 九九影院最新理论片 | 欧美激情伊人 | 久久精品伦理 | 91免费看国产 | 秋葵视频在线 |