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

警惕,MyBatis的size()方法竟然有坑!

運維 數(shù)據(jù)庫運維
Mybatis是一個開源的輕量級半自動化ORM框架,使得面向?qū)ο髴?yīng)用程序與關(guān)系數(shù)據(jù)庫的映射變得更加容易。MyBatis使用xml描述符或注解將對象與存儲過程或SQL語句相結(jié)合。Mybatis最大優(yōu)點是應(yīng)用程序與Sql進行解耦,sql語句是寫在Xml Mapper文件中。

[[277105]]

來源:http://h5ip.cn/aJgJ

Mybatis是一個開源的輕量級半自動化ORM框架,使得面向?qū)ο髴?yīng)用程序與關(guān)系數(shù)據(jù)庫的映射變得更加容易。MyBatis使用xml描述符或注解將對象與存儲過程或SQL語句相結(jié)合。Mybatis最大優(yōu)點是應(yīng)用程序與Sql進行解耦,sql語句是寫在Xml Mapper文件中。OGNL表達式在Mybatis當(dāng)中應(yīng)用非常廣泛,其表達式的靈活性使得動態(tài)Sql功能的非常強大。OGNL是Object-Graph Navigation Language的縮寫,代表對象圖導(dǎo)航語言。OGNL是一種EL表達式語言,用于設(shè)置和獲取Java對象的屬性,并且可以對列表進行投影選擇以及執(zhí)行l(wèi)ambda表達式。Ognl類提供了許多簡便方法用于執(zhí)行表達式的。Struts2發(fā)布的每個版本都會出現(xiàn)的新的高??蓤?zhí)行漏洞也是因為它使用了靈活的OGNL表達式。公司后端采用Mybatis作為數(shù)據(jù)訪問層,所使用版本為3.2.3。線上環(huán)境業(yè)務(wù)系統(tǒng)在運行過程中出現(xiàn)了一個令人困惑的異常, 該異常時而出現(xiàn)時而不出現(xiàn),構(gòu)造各種OGNL表達式為空等特殊情況均不會重現(xiàn)該異常。具體異常堆棧信息如下:

  1. ### Error querying database.  Cause: org.apache.ibatis.builder.BuilderException: Error evaluating expression 'list != null and list.size() > 0'. Cause: org.apache.ibatis.ognl.MethodFailedException: Method "size" failed for object [1] [java.lang.IllegalAccessException: Class org.apache.ibatis.ognl.OgnlRuntime can not access a member of class java.util.Collections$SingletonList with modifiers "public"
  2. ### Cause: org.apache.ibatis.builder.BuilderException: Error evaluating expression 'list != null and list.size() > 0'. Cause: org.apache.ibatis.ognl.MethodFailedException: Method "size" failed for object [1] [java.lang.IllegalAccessException: Class org.apache.ibatis.ognl.OgnlRuntime can not access a member of class java.util.Collections$SingletonList with modifiers "public"
  3.     at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:23) org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:107) 
  4.     at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:98) 
  5.     at cn.com.shaobingmm.MybatisBugTest$2.run(MybatisBugTest.java:88) 
  6.     at java.lang.Thread.run(Thread.java:745) 
  7. Caused by: org.apache.ibatis.builder.BuilderException: Error evaluating expression 'list != null and list.size() > 0'. Cause: org.apache.ibatis.ognl.MethodFailedException: Method "size" failed for object [1] [java.lang.IllegalAccessException: Class org.apache.ibatis.ognl.OgnlRuntime can not access a member of class java.util.Collections$SingletonList with modifiers "public"
  8.     at org.apache.ibatis.scripting.xmltags.OgnlCache.getValue(OgnlCache.java 
  9.     at:47) 
  10.     at org.apache.ibatis.scripting.xmltags.ExpressionEvaluator.evaluateBoolean(ExpressionEvaluator.java:29) 
  11.     at org.apache.ibatis.scripting.xmltags.IfSqlNode.apply(IfSqlNode.java:30) 
  12.     at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:29) 
  13.     at org.apache.ibatis.scripting.xmltags.TrimSqlNode.apply(TrimSqlNode.java:51) 
  14.     at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:29) 
  15.     at org.apache.ibatis.scripting.xmltags.DynamicSqlSource.getBoundSql(DynamicSqlSource.java:37) 
  16.     at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:275) 
  17.     at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:79) 
  18.     at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:104) 
  19.     ... 3 more 
  20. Caused by: org.apache.ibatis.ognl.MethodFailedException: Method "size" failed for object [1] [java.lang.IllegalAccessException: Class org.apache.ibatis.ognl.OgnlRuntime can not access a member of class java.util.Collections$SingletonList with modifiers "public"
  21.     at org.apache.ibatis.ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:837) 
  22.     at org.apache.ibatis.ognl.ObjectMethodAccessor.callMethod(ObjectMethodAccessor.java:61) 
  23.     at org.apache.ibatis.ognl.OgnlRuntime.callMethod(OgnlRuntime.java:860) 
  24.     at org.apache.ibatis.ognl.ASTMethod.getValueBody(ASTMethod.java:73) 
  25.     at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:170) 
  26.     at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:210) 
  27.     at org.apache.ibatis.ognl.ASTChain.getValueBody(ASTChain.java:109) 
  28.     at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:170) 
  29.     at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:210) 
  30.     at org.apache.ibatis.ognl.ASTGreater.getValueBody(ASTGreater.java:49) 
  31.     at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:170) 
  32.     at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:210) 
  33.     at org.apache.ibatis.ognl.ASTAnd.getValueBody(ASTAnd.java:56) 
  34.     at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:170) 
  35.     at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:210) 
  36.     at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:333) 
  37.     at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:413) 
  38.     at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:395) 
  39.     at org.apache.ibatis.scripting.xmltags.OgnlCache.getValue(OgnlCache.java:45) 
  40.     ... 12 more 

List的size()方法明顯是public為何還會出現(xiàn)不可訪問的異常。該問題并不是每一次都會出現(xiàn),經(jīng)過多次嘗試,該異常一直未在測試環(huán)境重現(xiàn)。該接口在完整調(diào)用鏈路中的出錯次數(shù)占總調(diào)用次數(shù)的比率為0.01%,無意中聯(lián)想到并發(fā)問題在周期性時間內(nèi)往往是概率性發(fā)生。編寫模擬多線程環(huán)境并發(fā)讀取公司列表測試代碼:

  1. <mapper namespace="CompanyMapper"
  2.     <select id="getCompanysByIds"resultType="cn.com.shaobingmm.Company"
  3.         select * 
  4.         from company 
  5.         <where
  6.             <if test="list != null and list.size() > 0"
  7.                 and id in 
  8.        <foreach collection="list" item="id" open="(" separator="," close=")">#{id} 
  9. </foreach> 
  10.             </if> 
  11.         </where
  12.     </select
  13. </mapper> 

多線程并發(fā)環(huán)境下的壓測代碼

  1. String resource = "mybatis-config.xml"
  2.         InputStream in = null
  3.         try { 
  4.             in = Resources.getResourceAsStream(resource); 
  5.             SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); 
  6.             final List<Long> ids = Collections.singletonList(1L); 
  7.             final SqlSession session = sqlSessionFactory.openSession(); 
  8.             final CountDownLatch mCountDownLatch = new CountDownLatch(1); 
  9.             for (int i = 0; i < 50; i++) { 
  10.                 Thread thread = new Thread(new Runnable() { 
  11.                     public void run() { 
  12.                         try { 
  13.                             mCountDownLatch.await(); 
  14.                         } catch (InterruptedException e) { 
  15.                             e.printStackTrace(); 
  16.                         } 
  17.                         for (int k = 0; k < 100; k++) { 
  18.                             session.selectList("CompanyMapper.getCompanysByIds", ids); 
  19.                         } 
  20.                     } 
  21.                 }); 
  22.                 thread.start(); 
  23.             } 
  24.             mCountDownLatch.countDown(); 
  25.             synchronized (MybatisBugTest.class) { 
  26.                 try { 
  27.                     MybatisBugTest.class.wait(); 
  28.                 } catch (InterruptedException e) { 
  29.                     e.printStackTrace(); 
  30.                 } 
  31.             } 
  32.  
  33.         } catch (IOException e) { 
  34.             e.printStackTrace(); 
  35.         } catch (Throwable e) { 
  36.             e.printStackTrace(); 
  37.         } finally { 
  38.             if (in != null
  39.                 try { 
  40.                     in.close(); 
  41.                 } catch (IOException e) { 
  42.                     e.printStackTrace(); 
  43.                 } 
  44.         } 

上訴異常堆棧信息在并發(fā)環(huán)境下果然重現(xiàn)出現(xiàn),根據(jù)異常信息代碼執(zhí)行至該行代碼時發(fā)生異常:

  1. Caused by: org.apache.ibatis.ognl.MethodFailedException: Method "size" failed for object [1] [java.lang.IllegalAccessException: Class org.apache.ibatis.ognl.OgnlRuntime can not access a member of class java.util.Collections$SingletonList with modifiers "public"
  2.     at org.apache.ibatis.ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:837) 

異常信息表明OgnlRuntime類不能夠訪問java.util.Collections的私有成員SingletonList。查看源代碼發(fā)現(xiàn)能夠拋出MethodFailedException異??梢枣i定在invokeMethod方法內(nèi)部。

  1. public static Object callAppropriateMethod(OgnlContext context, Object source, Object target, String methodName, String propertyName, List methods, Object[] args) throws MethodFailedException { 
  2.         Object reason = null
  3.         Object[] actualArgs = objectArrayPool.create(args.length); 
  4.  
  5.         try { 
  6.             Method e = getAppropriateMethod(context, source, target, methodName, propertyName, methods, args, actualArgs); 
  7.             if(e == null || !isMethodAccessible(context, source, e, propertyName)) { 
  8.                 StringBuffer buffer = new StringBuffer(); 
  9.                 if(args != null) { 
  10.                     int i = 0; 
  11.  
  12.                     for(int ilast = args.length - 1; i <= ilast; ++i) { 
  13.                         Object arg = args[i]; 
  14.                         buffer.append(arg == null?NULL_STRING:arg.getClass().getName()); 
  15.                         if(i < ilast) { 
  16.                             buffer.append(", "); 
  17.                         } 
  18.                     } 
  19.                 } 
  20.  
  21.                 throw new NoSuchMethodException(methodName + "(" + buffer + ")"); 
  22.             } 
  23.  
  24.             Object var14 = invokeMethod(target, e, actualArgs); 
  25.             return var14; 
  26.         } catch (NoSuchMethodException var21) { 
  27.             reason = var21; 
  28.         } catch (IllegalAccessException var22) { 
  29.             reason = var22; 
  30.         } catch (InvocationTargetException var23) { 
  31.             reason = var23.getTargetException(); 
  32.         } finally { 
  33.             objectArrayPool.recycle(actualArgs); 
  34.         } 
  35.  
  36.         throw new MethodFailedException(source, methodName, (Throwable)reason); 
  37.     } 

invokeMethod方法代碼

  1. public static Object invokeMethod(Object target, Method method, Object[] argsArray) throws InvocationTargetException, IllegalAccessException { 
  2.         boolean wasAccessible = true
  3.         if(securityManager != null) { 
  4.             try { 
  5.                 securityManager.checkPermission(getPermission(method)); 
  6.             } catch (SecurityException var6) { 
  7.                 throw new IllegalAccessException("Method [" + method + "] cannot be accessed."); 
  8.             } 
  9.         } 
  10.  
  11.         if((!Modifier.isPublic(method.getModifiers()) || !Modifier.isPublic(method.getDeclaringClass().getModifiers())) && !(wasAccessible = method.isAccessible())) { 
  12.             method.setAccessible(true); (1) 
  13.         } 
  14.  
  15.         Object result = method.invoke(target, argsArray); (3) 
  16.         if(!wasAccessible) { 
  17.             method.setAccessible(false); (2) 
  18.         } 
  19.  
  20.         return result; 
  21.     } 

問題出現(xiàn)在method實際上是一個共享變量,也就是例子中的

  1. public int java.util.Collections$SingletonList.size() 

方法

當(dāng)?shù)谝粋€線程t1至(1)行代碼允許method方法可以被調(diào)用,第二個線程t2執(zhí)行至(2)將method的方法設(shè)置為不可以訪問。接著t1又開始執(zhí)行到(3)行的時候就會發(fā)生該異常。這是一個很典型的同步問題。Ognl2.7已經(jīng)修復(fù)了該問題,因為ognl源碼是直接打包內(nèi)嵌在mybatis包中,mybatis3.3.0版本中也已經(jīng)進行了修復(fù)升級。(劃重點)

  1. public static Object invokeMethod(Object target, Method method, Object[] argsArray) throws InvocationTargetException, IllegalAccessException { 
  2.         boolean syncInvoke = false
  3.         boolean checkPermission = false
  4.         int mHash = method.hashCode(); 
  5.         synchronized(method) { 
  6.             if(_methodAccessCache.get(Integer.valueOf(mHash)) == null || _methodAccessCache.get(Integer.valueOf(mHash)) == Boolean.TRUE) { 
  7.                 syncInvoke = true
  8.             } 
  9.  
  10.             if(_securityManager != null && _methodPermCache.get(Integer.valueOf(mHash)) == null || _methodPermCache.get(Integer.valueOf(mHash)) == Boolean.FALSE) { 
  11.                 checkPermission = true
  12.             } 
  13.         } 
  14.  
  15.         boolean wasAccessible = true
  16.         Object result; 
  17.         if(syncInvoke) { 
  18.             synchronized(method) { 
  19.                 if(checkPermission) { 
  20.                     try { 
  21.                         _securityManager.checkPermission(getPermission(method)); 
  22.                         _methodPermCache.put(Integer.valueOf(mHash), Boolean.TRUE); 
  23.                     } catch (SecurityException var12) { 
  24.                         _methodPermCache.put(Integer.valueOf(mHash), Boolean.FALSE); 
  25.                         throw new IllegalAccessException("Method [" + method + "] cannot be accessed."); 
  26.                     } 
  27.                 } 
  28.  
  29.                 if(Modifier.isPublic(method.getModifiers()) && Modifier.isPublic(method.getDeclaringClass().getModifiers())) { 
  30.                     _methodAccessCache.put(Integer.valueOf(mHash), Boolean.FALSE); 
  31.                 } else if(!(wasAccessible = method.isAccessible())) { 
  32.                     method.setAccessible(true); 
  33.                     _methodAccessCache.put(Integer.valueOf(mHash), Boolean.TRUE); 
  34.                 } else { 
  35.                     _methodAccessCache.put(Integer.valueOf(mHash), Boolean.FALSE); 
  36.                 } 
  37.  
  38.                 result = method.invoke(target, argsArray); 
  39.                 if(!wasAccessible) { 
  40.                     method.setAccessible(false); 
  41.                 } 
  42.             } 
  43.         } else { 
  44.             if(checkPermission) { 
  45.                 try { 
  46.                     _securityManager.checkPermission(getPermission(method)); 
  47.                     _methodPermCache.put(Integer.valueOf(mHash), Boolean.TRUE); 
  48.                 } catch (SecurityException var11) { 
  49.                     _methodPermCache.put(Integer.valueOf(mHash), Boolean.FALSE); 
  50.                     throw new IllegalAccessException("Method [" + method + "] cannot be accessed."); 
  51.                 } 
  52.             } 
  53.  
  54.             result = method.invoke(target, argsArray); 
  55.         } 
  56.  
  57.         return result; 
  58.     } 

 

 

責(zé)任編輯:龐桂玉 來源: Java后端技術(shù)
相關(guān)推薦

2020-11-03 06:57:10

MyBatis數(shù)據(jù)庫

2020-07-07 07:37:36

Integer源碼Java

2022-09-04 12:43:03

算法裁員Meta

2021-07-05 18:05:40

SpringBean方法

2018-09-11 08:05:44

千兆路由器廠商

2019-06-14 08:48:46

Tomcat日志SpringBoot

2022-02-14 12:04:43

前綴SpringJpa

2015-07-20 15:26:56

WiFi感知

2020-11-27 09:16:21

BlockingQue

2021-12-08 08:30:55

Java AQS機制 Java 基礎(chǔ)

2016-06-07 09:23:05

瀏覽器技巧快捷鍵

2025-02-06 07:45:44

2021-05-07 05:34:25

Windows10操作系統(tǒng)微軟

2017-10-31 12:53:38

云計算虛擬化上云

2017-11-14 06:53:41

云計算云安全IT

2021-02-03 20:19:08

Istio流量網(wǎng)格

2020-11-02 08:35:59

內(nèi)存數(shù)據(jù)庫Redis

2017-03-07 17:45:42

Windows磁盤碎片整理

2021-06-10 09:00:33

單例模式數(shù)據(jù)庫

2018-06-15 14:28:36

華為云
點贊
收藏

51CTO技術(shù)棧公眾號

成人免费播放视频| 日韩一级片一区二区| 男人的天堂av网站| 成人亚洲一区二区| 91精品国产色综合久久不卡蜜臀| 美女黄色片网站| 男人的天堂a在线| 久久久一二三| 欧美成人精品三级在线观看| 成人性生活免费看| 国产精品久久久久久久久久齐齐| 亚洲欧美另类小说| 麻豆av一区二区| 97在线视频人妻无码| 亚洲日本欧美| xxxxx成人.com| 国产亚洲色婷婷久久99精品91| 成人午夜毛片| 激情成人在线视频| 精品久久免费观看| 人成免费电影一二三区在线观看| 精品一区二区三区不卡 | 伊人久久大香线蕉综合热线| 国产午夜精品视频免费不卡69堂| 亚洲成人激情小说| 精品欧美日韩精品| 岛国视频午夜一区免费在线观看| 一区一区视频| 国产综合在线观看| 成人av电影在线观看| 91免费国产网站| 一级一级黄色片| 亚洲免费激情| 色综合视频一区中文字幕| 懂色av粉嫩av浪潮av| 丝袜美腿综合| 亚洲第一男人av| 久久精品一卡二卡| 欧美aaaaaaaa| 欧美在线视频你懂得| 能在线观看的av| a级片在线免费观看| 亚洲综合一二三区| 毛片在线视频观看| 国产一二三区在线观看| 一色屋精品亚洲香蕉网站| 神马影院一区二区三区| 久蕉在线视频| 91在线播放网址| 精品国产乱码久久久久久郑州公司 | 婷婷久久一区| 色偷偷9999www| 亚洲一二三精品| 国产一区二区三区四区二区| 亚洲欧美精品在线| 亚洲一区二区观看| 香蕉久久99| 精品在线欧美视频| 亚洲AV无码片久久精品| 蜜桃a∨噜噜一区二区三区| 亚洲国产日韩欧美综合久久| 深田咏美中文字幕| 四虎5151久久欧美毛片| 国产视频欧美视频| av男人的天堂av| 国产调教一区二区三区| 中文字幕9999| 中文字幕91视频| 91精品天堂福利在线观看| 久久躁日日躁aaaaxxxx| 欧美激情一区二区视频| 亚洲精品1234| 欧美在线一级视频| 日本精品入口免费视频| 美女视频黄免费的久久 | 亚洲系列第一页| 九色porny丨国产精品| 91精品综合视频| 亚洲h视频在线观看| eeuss影院一区二区三区| 欧美精品尤物在线| 999在线视频| 亚洲久草在线视频| 无码 制服 丝袜 国产 另类| 欧美久久天堂| 欧美日韩一级大片网址| 在线观看一区二区三区视频| 欧美电影免费网站| 中日韩美女免费视频网址在线观看 | 粉嫩虎白女毛片人体| 亚洲一区二区小说| 亚洲成人激情在线| 成人小视频免费看| 欧美另类视频| 国产91网红主播在线观看| 亚洲系列在线观看| 99久久久国产精品免费蜜臀| 亚洲va韩国va欧美va精四季| 色婷婷av在线| 在线观看日产精品| 亚洲一区和二区| 日韩a一区二区| 97国产在线视频| 中文字幕在线观看你懂的| 成人一区二区三区视频| 日韩精品在在线一区二区中文| 操你啦视频在线| 色综合久久久久综合体| 伦伦影院午夜理论片| 宅男在线一区| 欧美极品xxxx| 国产又粗又猛视频免费| 久久嫩草精品久久久久| 国产精品一色哟哟| 久久69成人| 日韩第一页在线| 少妇久久久久久被弄高潮| 日本美女一区二区三区视频| 日韩欧美视频在线| 粉嫩av懂色av蜜臀av分享| 日本道不卡免费一区| 亚州精品天堂中文字幕| 99精品免费观看| 欧美极品美女视频| 国产97在线 | 亚洲| 国产精品中文| 色综合伊人色综合网站| 欧美日韩精品区| 国产精品888| 亚洲第一精品区| 亚洲综合av一区二区三区| 日韩av在线网| 九热这里只有精品| 国产成人在线视频免费播放| 中文字幕欧美日韩一区二区三区 | 亚洲国产综合91精品麻豆| 污视频网址在线观看| 国产欧美亚洲精品a| 97精品伊人久久久大香线蕉| 丰满人妻一区二区三区四区53| 亚洲欧洲日韩在线| 福利片一区二区三区| 第一会所sis001亚洲| 国产精品www网站| 黄色av网站在线免费观看| 欧美日韩免费看| 朝桐光av一区二区三区| 99国内精品| 国产美女99p| 蜜桃视频m3u8在线观看| 日韩精品有码在线观看| 精品欧美一区二区三区免费观看| av在线综合网| 国产91xxx| 亚洲免费成人av在线| 91精品国产91久久久久福利| 三级网站在线看| 激情懂色av一区av二区av| 亚洲第九十七页| 羞羞答答国产精品www一本 | 青青草国产成人a∨下载安卓| 国产精品成av人在线视午夜片| 黄色av免费在线观看| 欧洲一区二区三区免费视频| 极品蜜桃臀肥臀-x88av| 久久国产生活片100| 爱爱爱视频网站| 免费一级欧美片在线观看网站| 欧美裸体男粗大视频在线观看| 草逼视频免费看| 亚洲国产精品人人做人人爽| 日韩aaaaa| 日韩中文字幕不卡| 中文字幕日韩一区二区三区不卡| 国产成年精品| 97国产在线观看| 岛国最新视频免费在线观看| 欧美喷水一区二区| 国产一级片免费| 91蝌蚪porny成人天涯| 男人插女人下面免费视频| 99久久夜色精品国产亚洲1000部| 91精品综合久久| 日韩欧美一中文字暮专区| 国产一区二区黄| 国产乱子伦精品无码码专区| 亚洲国产va精品久久久不卡综合| 国精品无码人妻一区二区三区| 麻豆国产精品一区二区三区 | 91精品欧美福利在线观看| 精品无码久久久久久久久| 久久日韩精品一区二区五区| 亚洲一区精品视频在线观看| 精久久久久久| 亚洲欧洲一二三| 国产66精品| 国产女精品视频网站免费| caoporn视频在线| 色青青草原桃花久久综合| 黄色一级a毛片| 欧美日韩在线三区| jizz国产免费| 国产精品伦一区二区三级视频| 激情综合激情五月| 久久99精品国产麻豆婷婷| 国产精品久久中文字幕| 婷婷丁香综合| 欧美中文娱乐网| 成人资源在线播放| 国产在线视频一区| 最新日韩精品| 欧美黄色片视频| 男人在线资源站| 亚洲精品自拍偷拍| 丰满少妇一级片| 51精品秘密在线观看| 久久久黄色大片| 亚洲综合免费观看高清完整版| 国产激情av在线| 久久亚洲精精品中文字幕早川悠里| 五月天国产视频| 卡一卡二国产精品 | 亚洲精品福利电影| 久久久久久久久久国产| 男人天堂久久久| 一个色综合导航| 日中文字幕在线| 精品国产91亚洲一区二区三区婷婷| 国产又大又黄的视频| 色婷婷国产精品| 日本熟妇成熟毛茸茸| 亚洲精品亚洲人成人网| 午夜成人亚洲理伦片在线观看| 国产午夜精品美女毛片视频| a视频免费观看| 成人av午夜电影| 日本女人性视频| 国产一区二区视频在线| 中日韩av在线播放| 久久精品久久综合| 91看片在线免费观看| 石原莉奈一区二区三区在线观看| 国产一区二区在线视频播放| 亚洲视频日本| 每日在线观看av| 影音国产精品| 91黄色在线看| 日韩一级在线| 婷婷无套内射影院| 妖精视频成人观看www| av免费观看大全| 在线亚洲伦理| 欧美国产亚洲一区| 天堂在线一区二区| 美女喷白浆视频| 美腿丝袜亚洲三区| 一级黄色片国产| 国产乱理伦片在线观看夜一区| 国产999免费视频| 国产高清不卡一区| 日本三级日本三级日本三级极| 99久久综合国产精品| www.自拍偷拍| 国产精品青草综合久久久久99| 99国产精品无码| 亚洲三级电影网站| 久久久久成人片免费观看蜜芽| 亚洲高清不卡在线| 日本中文字幕第一页| 欧美天天综合网| 99热精品在线播放| 亚洲黄色有码视频| 国产高清视频在线| 久久伊人精品一区二区三区| 在线观看电影av| 欧美中文在线观看国产| 成人日韩在线观看| 91日本视频在线| 久久99精品国产自在现线| 欧美一区免费视频| 我不卡影院28| 国产 日韩 亚洲 欧美| 日韩成人精品在线| 欧美一级免费在线| www成人在线观看| av资源在线免费观看| 亚洲图片欧美色图| 成人黄色激情视频| 欧美mv日韩mv国产网站| 国内在线精品| 欧美高清无遮挡| 国精产品一区一区三区四川| 91久久久久久| 亚洲桃色综合影院| 中文字幕在线观看一区二区三区| 亚洲激情在线| 不卡的在线视频| 99精品国产视频| 99久久婷婷国产综合| 福利一区视频在线观看| 国产三级三级在线观看| 亚洲欧美在线磁力| 激情在线视频播放| 国产精品色悠悠| 青青视频一区二区| 超级碰在线观看| 日本欧美一区二区三区| 国产性生活毛片| 亚洲免费资源在线播放| 男人天堂2024| 亚洲福利视频二区| 欧美激情免费| 日韩av电影国产| 精品深夜福利视频| 免费成人进口网站| 免费人成网站在线观看欧美高清| 亚洲天堂美女视频| 伊人色综合久久天天人手人婷| 中文字幕人妻互换av久久| 日韩精品视频免费专区在线播放| 污片视频在线免费观看| 国产精品直播网红| 国产精品一国产精品| 日本福利视频在线| 成人晚上爱看视频| 免费一级a毛片夜夜看| 制服丝袜日韩国产| 亚洲1卡2卡3卡4卡乱码精品| 欧美在线视频播放| 精品午夜电影| 日本免费a视频| 国产精品一区二区x88av| 日本裸体美女视频| 欧美日韩精品一区二区天天拍小说| 日韩porn| 欧美最猛性xxxx| 日韩欧美ww| 国产成人精品视频免费看| www.欧美亚洲| 免费看日韩毛片| 亚洲国产欧美久久| 国产高清中文字幕在线| 国产亚洲自拍偷拍| 亚洲黄色三级| 亚州av综合色区无码一区| 午夜电影网一区| 亚洲人成色777777精品音频| 96精品视频在线| 亚洲精品一级二级三级| 国产精品免费成人| 国产人成一区二区三区影院| 国产精品露脸视频| 日韩中文字幕第一页| 成人免费观看49www在线观看| 永久免费精品视频网站| 国产在线观看免费一区| 欧美日韩在线国产| 亚洲成人激情视频| 都市激情综合| 亚洲精品中字| 久99久精品视频免费观看| 亚洲国产成人精品综合99| 亚洲第一中文字幕| 色老头在线一区二区三区| 欧美一区二区三区精美影视| 青青草视频一区| 精品国产视频在线观看| 日韩精品一区二区三区蜜臀| 免费高潮视频95在线观看网站| 欧美二区在线| 理论电影国产精品| 欧美精品久久久久性色| 亚洲精品suv精品一区二区| 天堂а√在线最新版中文在线| 欧美一区观看| 国产乱码精品一区二区三区五月婷| 国产一国产二国产三| 亚洲欧美日韩国产中文| 欧美伊人亚洲伊人色综合动图| 免费的av在线| 久久综合九色欧美综合狠狠| 亚洲香蕉在线视频| 午夜精品久久久久久久男人的天堂| 亚洲激情播播| 99精品视频免费版的特色功能| 亚洲动漫第一页| 98在线视频| 国产一区自拍视频| 久久精品国产亚洲aⅴ| 久久精品99久久久久久| 国产亚洲在线播放| 日韩精品一区二区三区中文字幕 | 92久久精品| 亚洲国产精品一区二区第四页av| 国产一区在线观看视频| 香蕉影院在线观看| 久久久国产一区二区| 网曝91综合精品门事件在线 | thepron国产精品| 在线观看一二三区|