黄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
相關文章:
主站蜘蛛池模板: 日本疯狂做爰xxxⅹ高潮视频 | 精品熟人一区二区三区四区 | 国产日韩精品视频 | 成人做爰黄 | 台湾chinesehdxxxx少妇 | 国偷自产av一区二区三区 | 精一区二区 | 亚洲国产婷婷香蕉久久久久久 | 国产精品天天av精麻传媒 | 亚洲欧美在线不卡 | 亚洲欧美精选 | 亚洲男人的天堂网站 | 秋霞国产午夜精品免费视频 | 国产精品资源网 | 亚洲精品久久久久国产 | 国产露脸久久高潮 | 加勒比久久综合网天天 | 欧美精品第一页 | 国产精品去看片 | mm131亚洲精品| 日批视频在线看 | 日日夜夜添 | 日本55丰满熟妇厨房伦 | 久久中文字幕伊人小说小说 | 色婷婷婷婷 | 男人的天堂伊人 | 这里只有久久精品 | 成人做爰www网站视频 | 免费成人在线网 | 91精品国产黑色瑜伽裤 | 99视频在线播放 | 韩日精品视频在线观看 | 国产精品99久久久精品无码 | 黑人巨茎美女高潮视频 | 国产精品第一 | 国产人成无码视频在线观看 | 92国产精品午夜福利 | 亚洲男同网| 国产伦久视频免费观看视频 | 免费一区二区 | 亚洲精品久久久久午夜 | 在线观看www | 色小姐av| 精品国产一区二区三区久久影院 | 一级做a爰全过程免费视频毛片 | www亚洲最大aⅴ成人天堂 | 成人午夜免费在线观看 | 亚洲午夜精品久久久久久浪潮 | 三上悠亚精品二区 | 伊人网综合 | 麻豆网神马久久人鬼片 | 亚洲男人天堂2024 | 亚洲一区二区三区四 | 毛片首页 | 舒淇裸体午夜理伦 | 日本体内she精高潮 中国无码人妻丰满熟妇啪啪软件 | 国产精华xxx | 一二三区精品视频 | 中文字幕无码一区二区免费 | 超清 忍不住的亲子伦中文字幕 | 狠狠躁18三区二区一区ai明星 | 真实的国产乱ⅹxxx66小说 | 亚洲欧洲色| 亚洲综合视频网站 | 亚洲精品一区二区三区婷婷月 | 巨大乳做爰视频在线看 | 午夜av无码福利免费看网站 | 色婷婷久久 | 三级网站国产 | 国产网址在线 | 黄色一级一片 | 日日摸日日碰夜夜爽av | 99在线视频观看 | 欧美日韩影院 | 极品少妇被猛得白浆直流草莓视频 | 天堂中文8资源在线8 | 狠狠躁夜夜躁人蜜臀av小说 | 一级做a爱片性色毛片 | wwwyoujizz日本| 青春草在线视频免费观看 | 色网站免费观看 | 亚洲乱码视频在线观看 | 懂色av懂色aⅴ精彩av | 国产区视频在线观看 | 国产精品一区二区羞羞答答 | 久久综合九色综合久99 | 午夜视频在线观看一区 | 久久久久久久久久久久久女国产乱 | 国产95在线 | 亚洲 | 野狼第一精品社区 | 亚洲女同性ⅹxx关女同网站 | 色噜噜狠狠一区二区三区果冻 | 日韩午夜影院 | 黄色网占 | 国产男人搡女人免费视频 | 北条麻妃在线一区二区 | 黄色片子免费 | 成人激情综合网 | 在线观看av国产一区二区 | 精品一区二区超碰久久久 | 啪啪在线视频 | 欧美日韩一区二区三区不卡 | 日本精品久久久久中文字幕乱中年 | 女女女女bbbb日韩毛片 | 孕妇怀孕高潮潮喷视频孕妇 | 欧洲肉欲k8播放毛片 | 色偷偷av男人的天堂 | 亚洲欧洲国产十 | 最近免费中文字幕mv在线视频3 | 草草影院精品一区二区三区 | 国产精品亚洲а∨天堂免在线 | 少妇挑战黑人3p | 韩国19禁无遮挡啪啪无码网站 | 国产精品码在线观看0000 | 成人免费观看视频网站 | 午夜精品久久久久久久久久久久久 | 91嫩草视频在线观看 | 日韩免费高清大片在线 | 国产精品视频久久久久久久 | 风间由美一区二区 | 免费国精产品wnw2544 | 国产成人在线一区二区 | 麻豆精品导航 | аⅴ资源天堂资源库在线 | 人妻丰满熟妇无码区免费 | 免费在线观看的av | 国产精品伦一区二区三级视频 | 成人免费视频a | 国产亲子乱弄免费视频 | 欧美性xxxx偷拍 | 日本久久99 | 日本精品久久久久中文字幕 | 黄网免费在线观看 | av永久天堂一区二区三区 | 久久久久久黄色 | 国产91区| 秋霞二区 | 乱色精品无码一区二区国产盗 | 欧美日韩精品一区二区 | 亚洲老妈激情一区二区三区 | 天天躁日日躁狠狠躁 | 国产精品美女www爽爽爽三炮 | 亚洲天堂免费在线观看视频 | 亚洲自国产拍揄拍 | 国产刺激出水片 | 毛片在线免费播放 | 国产主播福利 | 国产成a人片在线观看视频下载 | 亚洲免费视频在线 | 无码欧美毛片一区二区三 | 精品视频无码一区二区三区 | 久久都是精品 | 欧美三级欧美成人高清www | 超h高h肉h文教室学长男男视频 | 亚洲精品1区 | 夜夜夜夜bbbbbb欧美 | 神秘马戏团在线观看免费高清中文 | 亚洲 丝袜 另类 校园 欧美 | 人妻熟妇乱又伦精品视频app | 久久久久久久网站 | 99自拍视频| 国产丝袜人妖ts黄檬 | 2019中文字幕在线观看 | 30岁少妇又紧又嫩 | 亚洲欧美国产高清va在线播放 | 国产视频中文字幕 | 中文字幕视频二区 | 无套内谢少妇在线观看视频 | 欧美一区二区三区久久 | 久久精品视频8 | 国产成人无码a区在线观看视频 | 成年网站在线观看 | 风间由美在线观看 | 四虎国产精品成人免费影视 | 少妇性bbb搡bbb爽爽爽 | 久久无码人妻精品一区二区三区 | 最大胆裸体人体牲交 | 久久久久国产综合av天堂 | 久久综合导航 | 狠狠狠色丁香婷婷综合久久88 | 57pao成人国产永久免费视频 | 两个人日本www免费版 | 免费激情av| 久久久99精品免费观看 | 波多野结衣电车痴汉 | xx视频在线观看 | www.色日本| 亚洲精品无码av中文字幕电影网站 | 亚洲色视频| 91亚洲国产成人精品一区 | 日韩精品1区 | 免费一级做a爰片性视频 | 国产极品美女高潮无套 | 国产色精品久久人妻 | 天天操天| 国产最新在线视频 | 嫩草在线观看 | 日本欧美大码a在线观看 | 中文字幕有码av | 污网站在线观看免费 | 少妇三级全黄 | 老色鬼永久精品网站 | 亚洲天堂免费av | 婷婷激情五月 | 国产露脸150部国语对白 | 9l蝌蚪porny中文自拍 | 久久精品国产久精国产 | 亚洲成人精品久久久 | yw视频在线观看 | 日韩成人免费观看视频 | 国产中文字幕在线视频 | 国产在线不卡一区 | 欧美在线一区二区三区四区 | 少妇下蹲露大唇无遮挡 | 国产精品无码翘臀在线观看 | 日本在线成人 | 秋霞欧美一区二区三区视频免费 | 免费精品人在线二线三线 | 玖玖爱在线精品视频 | 人人干人人噪人人摸 | 日韩亚洲第一页 | 国产大尺度做爰床 | 亚洲综合站 | 乳女教师の诱惑juliamagnet | 欧美精品亚洲精品日韩精品 | 小镇姑娘国语版在线观看免费 | 激情无码人妻又粗又大 | 欧美成人久久久 | 男人猛躁进女人免费播放 | 先锋影音av资源在线观看 | 国产在线视频一区二区三区 | 在线视频91 | 小向美奈子在线观看 | 1级av| 18禁黄无码免费网站高潮 | 午夜老司机福利 | 免费观看的av毛片的网站 | 国产精品久久高潮呻吟粉嫩av | 国精产品乱码一区一区三区四区 | 国产女人高潮视频 | 四虎在线观看视频 | 国产福利小视频在线 | 久久av免费看| 在线播放国产一区二区三区 | 欧美午夜精品一区二区三区电影 | 日韩av看片 | 亚洲欧美日韩精品色xxx | 欧美精品亚洲一区 | 999一个人免费看ww | 久久牛牛| 绿帽在线观看99av | 国产真人做爰视频免费 | 中文字幕视频网 | 偷拍久久网 | 强辱丰满人妻hd中文字幕 | 国产亚洲欧美日韩精品一区二区三区 | 欧美成人高清 | 步兵在线一区二区三区 | 91精品久久久久久久久久入口 | 一本大道久久加勒比香蕉 | 黑人大荫蒂高潮视频 | 一区二区三区欧美在线 | 国产99视频精品免费播放照片 | 日韩精品久久久久久免费 | 黄色三级在线观看 | 在线久久 | 亚洲一区h | 福利二区视频 | 亚洲三级在线播放 | 黄色av免费播放 | 欧美最猛黑人xxxx黑人表情 | 丁香婷婷在线观看 | 国产成人精品电影在线观看 | 国产青青草 | 亚洲精品一区二区三区蜜臀 | 日韩欧美在线免费观看 | 一区二区三区在线 | 网站 | 天堂а√在线地址中文在线 | 人人干人人舔 | 成人影院免费 | 久久久久久国产精品免费免费男同 | 五月婷婷色 | 国产在线视频你懂的 | 国产成人精品一区二区三区在线观看 | 国产精品天天av精麻传媒 | 福利视频在线播放 | 国产足控在线网站 | 国产在线精品一区二区在线播放 | 国产在线精品二区 | 久久久精品视频免费看 | 色网站在线 | 成人区人妻精品一区二区不卡视频 | 亚洲理论中文字幕 | 中国极品少妇xxxxⅹ喷水 | 日本精品一区二区三区视频 | 91成人免费版 | 最新国产精品久久精品 | 在线成人播放 | 亚洲成成品网站 | 亚洲一区二区三区成人网站 | 免费播放黄色片 | 国产人妻精品一区二区三区不卡 | 国产99久久久国产 | 成人福利在线视频 | 亚洲国产黄色 | 久久午夜场 | 久久天天躁狠狠躁夜夜免费观看 | 日韩欧美中文字幕一区 | 日韩黄色一级片 | 国产免费一区二区 | 免费看黄av| 国产v亚洲v天堂无码久久久 | 92看片淫黄大片欧美看国产片 | 综合狠狠 | 国产手机在线精品 | 成人爽a毛片一区二区免费 成人爽爽爽 | 日韩中文字幕在线一区二区三区 | 亚洲欧美一区二区三区视频 | 免费黄色片网站 | 影音先锋久久久久av综合网成人 | 国产日韩精品一区二区 | 日本不卡一区 | 国产在线观看免费 | 国产偷窥老熟盗摄视频 | 在线观看1区 | 久草热8精品视频在线观看 人妻互换 综合 | 天天澡天天狠天干天 | 无码精品人妻一区二区三区湄公河 | 99热一区二区 | 绯色av粉嫩av蜜臀av | 欧美粗大猛烈老熟妇 | 久久这里只有精品99 | 国产九九在线视频 | 一区二区在线精品 | 国产刺激视频 | 一本久久综合亚洲鲁鲁五月天 | 日韩在线一区二区三区免费视频 | 色网在线免费观看 | 97超碰在线播放 | 伊人网伊人网 | 粗大的内捧猛烈进出在线视频 | 一级黄色大片免费观看 | 中文字幕国产剧情 | 伊人黄色片 | 亚洲成色www久久网站瘦与人 | 超碰在线影院 | 国产在线观看你懂的 | 亚洲日韩欧美综合 | av色综合久久天堂av色综合在 | 国产精品嫩草影院入口日本一区二 | 99久久精品国产毛片 | 理论片在线观看视频 | 成人美女黄网站色大色费全看在线观看 | 国产卡一卡二卡三无线乱码新区 | 国产精品国产免费无码专区不卡 | 各种少妇正面bbw撒尿 | 中文字幕人妻高清乱码 | 青青久草在线视频 | 人人草人人看 | 日韩精彩视频在线观看 | 国产性网 | 日本人做受免费视频 | 国产亚洲中字幕欧 | 国模妙妙超大尺度啪啪人体 | 99久久久成人国产精品 | 亚洲一区二区欧美 | 91美女高潮出水 | 综合无码一区二区三区 | 白嫩嫩翘臀美女在线视频 | 精品视频网站 | 欧美一级黄色片视频 | 九九热国产在线 | 香蕉视频网页 | 久久国产精品偷任你爽任你 | 久久亚洲精品无码aⅴ大香 人人妻人人玩人人澡人人爽 | 夹得我好紧好爽日出了水视频 | 日本黄页网站免费大全 | 成人三级做爰视频在线看 | 一二三区不卡 | 亚洲 欧美日韩 国产 中文 | 国产69久久久欧美一级 | 亚洲欧洲免费无码 | 尤物视频在线观看免费 | 波多野结衣免费一区视频 | 91人人爽人人爽人人精88v | 手机看片日韩在线 | 深夜国产福利 | 免费国产裸体美女视频全黄 | 伊人久久婷婷五月综合97色 | 人人爽久久涩噜噜噜小说 | 日日碰狠狠添天天爽 | 欧美大黑帍在线播放 | 性视屏 | 亚洲欧洲日产国码无码久久99 | 免费看成年人视频 | 中国美女乱淫免费看视频 | 亚洲国产av无码综合原创国产 | 国产精品污 | 野花社区www高清视频 | 一本久久精品一区二区 | 成人黄色在线观看 | 中文毛片无遮挡高潮免费 | 开心激情婷婷 | 国产绳艺sm调教室论坛 | 国产精品美女一区二区三区 | 美国伦理3野性 | 暖暖 在线 日本 免费 中文 | 国产精品亚洲专区无码牛牛 | 丁香激情综合久久伊人久久 | 大蜜桃臀偷拍系列在线观看 | 国产理论视频 | 十八禁毛片 | 亚洲熟妇无码另类久久久 | 国产精品成人久久久久久久 | 国产午夜精品久久久久久久久久 | 国产福利姬喷水福利在线观看 | 亚洲成人黄色网 | 中文字幕精品亚洲无线码二区 | 人妻少妇精品无码专区二区 | 日韩亚洲欧美中文在线 | 日本www免费 | 天天色综合图片 | 99在线精品免费视频九九视 | 超碰在线国产97 | 欧美人伦 | 欧美极品少妇xxx | 亚洲精品免费在线视频 | 国产欧美一区二区精品97 | 久久久久中文字幕 | 大尺度做爰呻吟舌吻网站 | 日韩精品一卡二卡 | 一本大道综合伊人精品热热 | 亚洲欧美色一区二区三区 | 三级黄视频| 亚洲午夜免费福利视频 | 国产一区二区三区在线看 | 精品久久人人爽天天玩人人妻 | 亚洲男人的天堂在线视频 | 日本免费三区 | 亚洲精品一区二区三区四区五区 | 成年人视频免费看 | 欧美黄色www | 久久久久久98 | 69xxx18—19xxx视频 | 亚洲人视频在线观看 | 丰满少妇免费做爰大片人 | 国产人人看 | 国产伦精品一区二区三区视频网站 | 亚洲精品一区二区三区影院忠贞 | 很很干很很日 | 每日av在线 | 日本一区二区免费在线观看 | 中文字幕免费一区二区 | 精品成人免费一区二区在线播放 | 精品国产网 | 国产精品入口免费视 | 露脸叫床粗话东北少妇 | 肉肉视频在线观看 | 91精品综合久久久久久 | 成人影院一区 | 99爱精品 | 久久影院午夜 | 午夜天堂一区人妻 | 日韩天堂在线观看 | 五月婷香蕉久色在线看 | 天天拍夜夜添久久精品 | 亚洲色图视频在线观看 | 中文字幕一区二区视频 | 免费的色视频 | 大陆女明星裸体毛片 | 亚洲午夜成人片 | 国精产品一区二区 | 日韩三区四区 | 美女黄在线观看 | 婷婷综合少妇啪啪喷水 | 翘臀后进娇喘呻吟的少妇91 | 国产精品丝袜在线 | av午夜激情| 99久久精品一区二区三区 | 2023精品国色卡一卡二 | 久久ク成人精品中文字幕 | 粉嫩av国产一区二区三区 | 国产极品美女高潮无套小趴菜 | 成人激情免费 | 国产精品中文久久久久久久 | 中国肥胖女人真人毛片 | 国产女爽爽视频精品免费 | 手机av在线 | 2022亚洲无砖无线码 | 玖玖伊人 | 国产精品18久久久久久首页狼 | 亚洲宅男天堂 | fc2-ppv系列 | 国产亚洲精品久久久久蜜臀 | 免费视频久久 | 少妇放荡的呻吟干柴烈火动漫 | 日韩少妇内射免费播放18禁裸乳 | 欧美国产日产一区二区 | 日韩午夜激情视频 | 首页 亚洲 欧美 制服 丝腿 | 日本色中色 | 成人影片在线免费观看 | 国精产品一区一区三区有限公司杨 | av成人在线网站 | 中文字幕亚洲精品一区 | 国内精品国产成人国产三级粉色 | 激情综合激情五月俺也去 | jizz越南zz女人18 | 国产一线二线三线女 | 99精品视频网站 | 亚洲欧洲成人在线 | 波多野结衣aⅴ在线 | 日本a在线免费观看 | 久久久久在线观看 | 国产裸体永久免费视频网站 | 精品区一区二区三区 | 丝袜人妻一区二区三区网站 | 亚洲乱乱| 国产精品亚洲专区无码牛牛 | 亚洲精品久久夜色撩人男男小说 | 欧美 日韩 国产在线 | 亚洲综合网在线 | 毛片基地在线观看 | 国产色xx群视频射精 | 在线看毛片网站 | 成人在线网址 | 在线看黄网 | www.三级.com| 18国产精品福利片久久婷 | 国产色av| 干干人人| 在线观看特色大片免费网站 | 少妇专区| 婷婷五月综合色中文字幕 | 精品亚洲欧美无人区乱码 | 97精品国产97久久久久久粉红 | 亚洲一区二区三区日本久久九 | 亚洲欧美国产双大乳头 | 亚洲精品一区二区国产精华液 | 国模无码视频一区 | 在线精品视频一区二区三区 | 国产91脚交调教 | 狠狠操中文字幕 | 在线天堂中文www视软件 | 亚洲中文字幕无码久久2017 | jizz久久精品永久免费 | 欧美精品一级在线观看 | 国产一区二三区好的精华液69 | 午夜视频在线观看网站 | 亚洲一区二区三区在线播放 | 国产又色又爽又黄的 | 久久综合网av | 亚洲欧美视频一区 | 日本老熟妇毛茸茸 | 亚洲码欧美码一区二区三区 | 欧美一区二区三区色 | 精品乱码一区二区三四区 | 超碰最新网址 | 亚洲宅男天堂 | 风间由美乳巨码无在线 | 亚洲色图制服丝袜 | 亚洲天堂2017无码 | 天天碰天天碰 | 四虎影视免费永久观看在线 | 成人3d动漫一区二区三区 | 亚洲欧美日韩国产精品一区二区 | 黑料av在线 | 久久精品国产99国产精偷 | 伊人精品成人久久综合 | 久久亚洲美女 | www亚洲一区二区三区 | 一区不卡在线观看 | 四虎综合网 | 亚洲日本va午夜蜜芽在线电影 | 亚洲狼人av | 秋霞视频在线观看 | 亚洲美女视频网站 | 国产精品久久久久无码人妻 | 国产精自产拍久久久久久蜜 | 国产一线二线三线在线观看 | 在线免费看av片 | 桥本有菜免费av一区二区三区 | 亚洲成人第一网站 | 国产二区三区视频 | 最新日韩精品 | 欧美激情第三页 | 欧美又粗又深又猛又爽啪啪九色 | 国产成人精品电影在线观看 | 探花视频在线版播放免费观看 | 国产超碰人人做人人爱ⅴa 日韩人妻无码精品久久久不卡 | 69xxx中国| 日韩乱码一区二区 | 国产人妻精品一区二区三区 | 欧洲亚洲自拍 | 日韩欧美精品在线观看 | 日韩免费片| 亚洲 小说 欧美 激情 另类 | caoporn视频在线 | 国产91麻豆视频 | 佐佐木明希奶水喷出在线视频 | 久久中文字幕一区 | 国产精品嫩草影院com | 免费在线观看av网站 | 精品久久久久久久久久软件 | 日韩午夜片 | 日韩欧美高清在线视频 | jizz视频| 午夜专区| 天天操天天摸天天干 | 色综合a怡红院怡红院 | 国内精品少妇在线播放98 | 欧美日韩免费网站 | 五月婷婷网 | 性欧美巨大乳 | 久久久久久久女国产乱让韩 |