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

欧美国产日产韩国视频| 91精品专区| av日韩国产| 亚洲一区二区三区高清| 最新国产成人在线观看| 性色av一区二区三区免费| 狠狠热免费视频| 国产在线视频卡一卡二| 日本在线一区二区| 99精品国产99久久久久久白柏| 色99之美女主播在线视频| 男人插女人视频在线观看| 天天干,天天干| 成人高潮视频| 亚洲男帅同性gay1069| 国产精品69久久久久| 国产一级伦理片| 在线免费av导航| 老司机精品视频在线| 国产亚洲精品高潮| 欧美三级午夜理伦三级| 视频污在线观看| 黄色成人在线网址| 欧美成人福利视频| www.激情网| 国产哺乳奶水91在线播放| 色呦哟—国产精品| 91福利精品视频| 欧美三级电影在线播放| 在线能看的av| 妖精一区二区三区精品视频| 精品人伦一区二区三区蜜桃网站 | 国产亚洲欧美一区| xxxx视频在线观看| 八戒八戒神马在线电影| 精品在线视频一区| 精品国产依人香蕉在线精品| 日韩一区二区三区不卡视频| 欧美jizz18hd性欧美| 国内精品视频一区二区三区八戒 | 91gao视频| 成年人一级黄色片| 看亚洲a级一级毛片| 亚洲图片欧美激情| 国产精品视频福利| 日本道在线观看| 国产伦精品一区二区三区千人斩 | 国内自拍在线观看| 日韩av大全| 精品欧美一区二区三区精品久久| 日本国产在线播放| 国产视频三级在线观看播放| 日韩电影在线观看网站| 日韩中文字幕在线免费观看| 亚洲国产欧美日韩在线| sm在线播放| 欧美—级在线免费片| 国产在线a不卡| 午夜爽爽爽男女免费观看| 中文字幕亚洲在线观看| 欧美午夜影院在线视频| 超碰免费在线公开| 亚洲av综合色区无码一二三区 | 国产精品一二三在线观看| 好吊色一区二区三区| 视频一区中文字幕国产| 久久九九热免费视频| 国产精品久久久免费看| 欧美欧美在线| 欧美大片在线观看一区二区| 国产成人久久777777| 久久精品视频免费看| a美女胸又www黄视频久久| 国产精品女人网站| 国产福利久久久| 亚洲乱码视频| 久久亚洲精品视频| 美女久久久久久久久久| 成人51免费| 在线这里只有精品| 国产精品入口芒果| 密臀av在线播放| 亚洲乱码国产乱码精品精的特点| 国产制服91一区二区三区制服| 视频在线观看入口黄最新永久免费国产 | 中日韩av电影| 精品国产一区二区三区四区vr | 久久国产精品高清| 国产按摩一区二区三区| av网站免费线看精品| 日本在线观看一区| 在线中文字幕-区二区三区四区| 亚洲国产日韩在线一区模特| 樱花www成人免费视频| 日韩有码电影| 成人动漫一区二区在线| 亚洲影视九九影院在线观看| 中文字幕在线2019| 久久精品首页| 91av在线影院| 成人免费毛片xxx| 亚洲精品综合| 国产自摸综合网| 亚洲 欧美 精品| av中文字幕一区| 视频一区亚洲| 国产一二在线观看| 国产亚洲一区二区在线观看| 韩日午夜在线资源一区二区| 成人三级黄色免费网站| 国产午夜精品一区二区三区视频| 激情图片qvod| 最新av在线播放| 色婷婷综合久色| 18禁免费无码无遮挡不卡网站| 99在线视频影院| 欧美日韩在线播放三区四区| 久久精品香蕉视频| 日韩欧美中文字幕在线视频| 日韩一区二区三区视频在线观看| 国产精品嫩草影院8vv8| 久久影视精品| 欧美精品高清视频| av在线网站免费观看| 国产一区精品二区| 在线电影欧美日韩一区二区私密| 69xxx免费| 日韩欧美精品一区| 欧美在线不卡区| 中文字幕av第一页| 美女在线一区二区| 91亚洲人电影| 十八禁一区二区三区| 有码一区二区三区| 日韩五码在线观看| 日韩精品一区二区三区免费视频| 最近2019好看的中文字幕免费 | 一区二区高清| 欧美性受xxx| 黄色美女一级片| 一区二区三区资源| 亚洲欧美日本一区二区| 岛国成人av| 日韩成人在线视频观看| 性欧美精品男男| 91成人精品| 欧美日韩国产91| 伦av综合一区| 国产麻豆9l精品三级站| 国产美女精品在线观看| 黄色av免费在线看| 色天天综合色天天久久| 女人被狂躁c到高潮| 欧美3p视频| 国内免费精品永久在线视频| 波多野结衣一二区| 国产亚洲精品bt天堂精选| 日韩人妻精品无码一区二区三区| 全球av集中精品导航福利| 一本色道久久综合狠狠躁篇怎么玩| 黄色片网站在线免费观看| 久久综合九色综合97_久久久 | av在线免费观看网| 欧美亚洲精品一区| 少妇熟女视频一区二区三区| 欧美在线不卡| 国产福利成人在线| 成人在线免费看| 欧美日韩你懂得| 800av在线播放| 久久精品青草| 亚洲在线免费观看| 678在线观看视频| 精品在线小视频| 激情五月婷婷小说| 老司机午夜精品视频在线观看| 秋霞在线观看一区二区三区| 色呦呦呦在线观看| 亚洲国产福利在线| 欧美日韩在线国产| 麻豆国产精品一区二区三区| 亚洲欧美一二三| 国产 日韩 欧美 综合 一区| 欧美有码在线视频| 成人video亚洲精品| 亚洲国产成人在线播放| 最近中文字幕在线观看| 91美女片黄在线观看| 国产传媒久久久| 成人动漫视频在线观看| 97精品一区二区三区| av亚洲在线| 精品区一区二区| 国产精品国产精品国产| 夜夜亚洲天天久久| 日韩欧美亚洲另类| 日韩一级精品| 一区二区国产日产| 精品国产黄a∨片高清在线| 美日韩精品免费观看视频| 亚洲天堂中文网| 中文欧美字幕免费| 蜜臀av粉嫩av懂色av| 午夜欧美理论片| 欧美一级二级三级九九九| 日韩欧美中文字幕一区二区三区| 青草青草久热精品视频在线网站| 色欲久久久天天天综合网| 欧美系列一区二区| 日韩污视频在线观看| 成人国产精品免费观看| 欧美伦理片在线观看| 亚洲乱码视频| 中文字幕日韩精品无码内射| 欧美日韩亚洲在线观看| 国产精品久久999| 自拍视频在线播放| 日韩经典中文字幕| www.五月天激情| 亚洲电影第三页| 欧美日韩色视频| 91麻豆免费在线观看| 精品人妻二区中文字幕| 激情丁香综合五月| 三级视频中文字幕| 久久精品一区二区三区中文字幕| 久久亚洲国产成人精品无码区| 99久久精品费精品国产| 亚洲综合自拍一区| 亚洲免费一区| 久久久久久久久国产| 深夜福利在线视频| 在线视频国产一区| 91av在线免费视频| 亚洲国产三级在线| 国产主播在线观看| 一区二区免费在线播放| 日本少妇高清视频| 亚洲同性gay激情无套| 国产精品1区2区3区4区| 国产精品一区二区91| 国产精品自拍视频在线| 国产精品v亚洲精品v日韩精品| 亚洲午夜精品国产| 色综合蜜月久久综合网| 亚洲7777| 日本女优一区| 俄罗斯精品一区二区| 亚洲精品成人图区| 久久久国产一区二区三区| 都市激情在线视频| 这里只有精品在线播放| 亚洲国产精品18久久久久久| 91精品欧美一区二区三区综合在 | av免费观看不卡| 成人国产在线观看| 国产a级黄色片| 91麻豆蜜桃一区二区三区| 免费黄色在线视频| 久久久久国产精品麻豆ai换脸 | 亚洲网站免费观看| 欧美日韩精品一区二区三区蜜桃| 91av久久久| 欧美日韩国产中文精品字幕自在自线| 人人干人人干人人干| 大荫蒂欧美视频另类xxxx| 69视频免费看| 欧美精品丝袜久久久中文字幕| a天堂在线观看视频| 精品国产亚洲在线| 国产精品久久久久久久久毛片| 亚洲va欧美va天堂v国产综合| 999精品久久久| 亚洲女性喷水在线观看一区| 久久久久久免费观看| 国产精品青草久久| 亚洲天堂视频一区| 亚洲国产成人自拍| 欧美激情一区二区视频| 精品福利在线观看| 久久久精品91| 欧美午夜电影在线| 中文字幕乱码在线观看| 欧美一区二区视频在线观看2020| 日韩国产成人在线| 91精品一区二区三区在线观看| 亚洲欧美另类一区| 亚洲天堂网在线观看| 在线你懂的视频| 国产成人精彩在线视频九色| 国产精品久一| 久久综合精品一区| 乱亲女h秽乱长久久久| 99re6热在线精品视频播放速度| 福利一区二区三区视频在线观看| 668精品在线视频| 成人免费一区| 国模精品娜娜一二三区| 91欧美在线| 久久美女福利视频| 国产一区二区三区香蕉| 天堂av2020| 91在线精品一区二区三区| 来吧亚洲综合网| 亚洲欧洲精品一区二区三区| 自拍偷拍欧美亚洲| 91精品国产麻豆国产自产在线| 欧美孕妇性xxxⅹ精品hd| 欧美精品制服第一页| 国模冰冰炮一区二区| 国产99在线|中文| 成人美女黄网站| 9a蜜桃久久久久久免费| 日韩欧美电影| 国产xxxxx视频| 日产国产高清一区二区三区| 日本成人在线免费视频| 国产91精品免费| 韩国av中国字幕| 国产精品素人一区二区| 波多野结衣视频网站| 欧美zozozo| 26uuu亚洲电影在线观看| 国产精品免费久久久久影院| 色愁久久久久久| 日韩精品久久一区| 国产日韩一区| 91九色蝌蚪porny| 亚洲欧美视频在线观看视频| 中日精品一色哟哟| 亚洲少妇中文在线| 男人在线资源站| 国产精品美女av| 教室别恋欧美无删减版| 欧美爱爱视频免费看| 成人高清伦理免费影院在线观看| 国产又黄又爽又无遮挡| 欧美一区三区四区| 麻豆网站视频在线观看| 国产欧美一区二区三区在线看| 精品国产一区二区三区av片| 久热免费在线观看| 久久久久久久综合色一本| 日韩欧美一级视频| 亚洲精品成人久久久| 在线免费观看黄| 国产精品十八以下禁看| 欧美女优在线视频| 国产精品无码乱伦| 黑人精品欧美一区二区蜜桃| 蜜臀av午夜精品久久| 欧美精品乱码久久久久久按摩| 中国日本在线视频中文字幕| 国产一区深夜福利| 久久久久国产精品| 久久久久亚洲av片无码v| 一区二区三区免费看视频| 亚洲产国偷v产偷v自拍涩爱| 久久免费少妇高潮久久精品99| 国产乱人伦精品一区| 一女被多男玩喷潮视频| 久久久国产午夜精品| 综合久久中文字幕| 久久成人一区二区| 91麻豆精品激情在线观看最新 | 成人啊v在线| 国产精品v欧美精品v日韩精品 | 欧美极品少妇全裸体| 红杏成人性视频免费看| 国产精品50p| 国产精品全国免费观看高清 | 国产精品.xx视频.xxtv| 亚洲天堂电影网| 成人永久看片免费视频天堂| 青青草华人在线视频| 制服丝袜av成人在线看| 免费网站在线观看人| 成人黄色午夜影院| 色橹橹欧美在线观看视频高清| 欧美成人免费高清视频| 中文字幕精品三区| 精品人妻一区二区三区含羞草| 午夜精品免费视频| 欧美日韩性在线观看| 亚洲AV成人精品| 色综合久久久久综合体| 黄色网址在线免费| 久久福利电影| 黄色日韩网站视频| 精品欧美一区二区三区免费观看| 在线观看日韩欧美| 99国产精品免费网站| 日本在线观看免费视频| 亚洲一区视频在线| 精品人妻一区二区三区浪潮在线| 欧美在线激情网| 女人色偷偷aa久久天堂| 一区二区三区伦理片| 一本色道**综合亚洲精品蜜桃冫| 午夜免费播放观看在线视频|