<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-16  評(píng)論-54  文章-0  trackbacks-0
     

    ?最近由于需要用到ThreadLocal,在網(wǎng)上搜索了一些相關(guān)資料,發(fā)現(xiàn)對(duì)ThreadLocal經(jīng)常會(huì)有下面幾種誤解

    ?一、ThreadLocal是java線程的一個(gè)實(shí)現(xiàn)
    ????? ThreadLocal的確是和java線程有關(guān),不過(guò)它并不是java線程的一個(gè)實(shí)現(xiàn),它只是用來(lái)維護(hù)本地變量。針對(duì)每個(gè)線程,提供自己的變量版本,主要是為了避免線程沖突,每個(gè)線程維護(hù)自己的版本。彼此獨(dú)立,修改不會(huì)影響到對(duì)方。

    ?二、ThreadLocal是相對(duì)于每個(gè)session的

    ??????? ThreadLocal顧名思義,是針對(duì)線程。在java web編程上,每個(gè)用戶從開始到會(huì)話結(jié)束,都有自己的一個(gè)session標(biāo)識(shí)。但是ThreadLocal并不是在會(huì)話層上。其實(shí),Threadlocal是獨(dú)立于用戶session的。它是一種服務(wù)器端行為,當(dāng)服務(wù)器每生成一個(gè)新的線程時(shí),就會(huì)維護(hù)自己的ThreadLocal。對(duì)于這個(gè)誤解,個(gè)人認(rèn)為應(yīng)該是開發(fā)人員在本地基于一些應(yīng)用服務(wù)器測(cè)試的結(jié)果。眾所周知,一般的應(yīng)用服務(wù)器都會(huì)維護(hù)一套線程池,也就是說(shuō),對(duì)于每次訪問(wèn),并不一定就新生成一個(gè)線程。而是自己有一個(gè)線程緩存池。對(duì)于訪問(wèn),先從緩存池里面找到已有的線程,如果已經(jīng)用光,才去新生成新的線程。所以,由于開發(fā)人員自己在測(cè)試時(shí),一般只有他自己在測(cè),這樣服務(wù)器的負(fù)擔(dān)很小,這樣導(dǎo)致每次訪問(wèn)可能是共用同樣一個(gè)線程,導(dǎo)致會(huì)有這樣的誤解:每個(gè)session有一個(gè)ThreadLocal

    ?三、ThreadLocal是相對(duì)于每個(gè)線程的,用戶每次訪問(wèn)會(huì)有新的ThreadLocal

    ??理論上來(lái)說(shuō),ThreadLocal是的確是相對(duì)于每個(gè)線程,每個(gè)線程會(huì)有自己的ThreadLocal。但是上面已經(jīng)講到,一般的應(yīng)用服務(wù)器都會(huì)維護(hù)一套線程池。因此,不同用戶訪問(wèn),可能會(huì)接受到同樣的線程。因此,在做基于TheadLocal時(shí),需要謹(jǐn)慎,避免出現(xiàn)ThreadLocal變量的緩存,導(dǎo)致其他線程訪問(wèn)到本線程變量

    ?四、對(duì)每個(gè)用戶訪問(wèn),ThreadLocal可以多用
    ??????? 可以說(shuō),ThreadLocal是一把雙刃劍,用得來(lái)的話可以起到非常好的效果。但是,ThreadLocal如果用得不好,就會(huì)跟全局變量一樣。代碼不能重用,不能獨(dú)立測(cè)試。因?yàn)椋恍┍緛?lái)可以重用的類,現(xiàn)在依賴于ThreadLocal變量。如果在其他沒(méi)有ThreadLocal場(chǎng)合,這些類就變得不可用了。個(gè)人覺(jué)得ThreadLocal用得很好的幾個(gè)應(yīng)用場(chǎng)合,值得參考

    ??1、存放當(dāng)前session用戶:quake want的jert

    ??2、存放一些context變量,比如webwork的ActionContext

    ??3、存放session,比如Spring hibernate orm的session

    posted @ 2006-08-01 12:09 jspark 閱讀(30747) | 評(píng)論 (12)編輯 收藏

    ?????? 說(shuō)真的,對(duì)于spring提供AOP的功能,個(gè)人實(shí)在不敢太過(guò)于恭維。主要是Spring的AOP功能沒(méi)那么強(qiáng)大,而且必須是對(duì)于spring容器管理的bean才能實(shí)施AOP功能,對(duì)于容器外的bean就無(wú)能為力了。而且spring沒(méi)有提供屬性的AOP功能。在這些方面,spring AOP真的不能和Aspectj相比。Aspectj的AOP功能才真的是真正意義的AOP框架,提供的功能非常強(qiáng)大,幾乎可以實(shí)現(xiàn)任何類型的AOP。不過(guò)Aspectj的學(xué)習(xí)曲線相對(duì)要比spring AOP稍微陡峭一點(diǎn),主要是spring AOP可以當(dāng)成普通javabean來(lái)處理,而Aspectj還要另外做編譯器,比較麻煩。不過(guò),慶幸的是,eclipse下面有Aspectj插件,開發(fā)起來(lái)也是很方便。所以一般,復(fù)雜的AOP功能,還是推薦用Aspectj

    ???? 對(duì)于一般的J2EE開發(fā)來(lái)說(shuō),要實(shí)現(xiàn)一些比較常用的AOP,Spring 還是能滿足的。比如事務(wù)、異常、日志、權(quán)限等等,在這些方面,spring AOP還是比較方便的,特別是事務(wù)處理,spring提供了相當(dāng)好的集成。如果事務(wù)處理用Aspectj來(lái)實(shí)現(xiàn),不見得好多少。

    ??? 一直以來(lái),覺(jué)得spring AOP最好用的一個(gè)地方就是提供了BeanNameAutoProxyCreator,這個(gè)類真的非常方便,以至于個(gè)人一旦遇到要實(shí)現(xiàn)AOP,首先就是求組于BeanNameAutoProxyCreator,如果BeanNameAutoProxyCreator實(shí)現(xiàn)不了,再考慮別的。不過(guò),一般情況來(lái)說(shuō),BeanNameAutoProxyCreator的確能滿足需要了,除非你的需求真的千奇百怪。

    ???在應(yīng)用spring AOP功能時(shí),優(yōu)先考慮用接口。因?yàn)槿绻媒涌诘脑挘敲磗pring會(huì)創(chuàng)建一個(gè)代理,并在代理里面實(shí)現(xiàn)AOP增強(qiáng)代碼,并調(diào)用真正的實(shí)例對(duì)象。不過(guò),spring AOP功能不一定非要用接口,一些普通類也是可以的。對(duì)于普通類,spring會(huì)用CGLIB來(lái)動(dòng)態(tài)生成一個(gè)新類。并且CGLIB會(huì)保持一個(gè)生成類的cache,因此它不會(huì)一直生成新類。spring使用ProxyCallbackFilter對(duì)象把其它對(duì)象放進(jìn)map進(jìn)行管理。如果沒(méi)有管理好cache,將會(huì)產(chǎn)生大量的java對(duì)象,直至出現(xiàn)OutOfMemoryErrors。因此使用springaop時(shí),一定要正確實(shí)現(xiàn)equals and hashCode。

    ???
    不過(guò),不管怎么樣,在應(yīng)用spring AOP時(shí),還是優(yōu)先考慮接口方式,畢竟面向接口方式還是值得推薦的一個(gè)編程思想。

    posted @ 2006-07-31 19:37 jspark 閱讀(4110) | 評(píng)論 (11)編輯 收藏
    ???? 最近在負(fù)責(zé)一個(gè)大項(xiàng)目,項(xiàng)目組成員包括項(xiàng)目經(jīng)理大概10個(gè)人左右。項(xiàng)目技術(shù)用struts+spring+hibernate實(shí)現(xiàn)。項(xiàng)目的規(guī)模相對(duì)來(lái)說(shuō)是比較大的,總共有10大模塊,每個(gè)大模塊又分為有十幾個(gè)、甚至幾十個(gè)小模塊。開發(fā)工具用eclipse,由于在開發(fā)階段,項(xiàng)目開發(fā)成員需要頻繁重啟服務(wù)器。在啟動(dòng)服務(wù)器的時(shí)候,每次啟動(dòng)時(shí)間總是會(huì)超過(guò)1分鐘。記得以前在做另外一個(gè)項(xiàng)目時(shí),啟動(dòng)時(shí)間不到5秒鐘,相差了10倍,而且項(xiàng)目規(guī)模是差不多的。

    ??? 從初步分析來(lái)說(shuō),應(yīng)該是hibernate解釋hbm.xml時(shí)花費(fèi)時(shí)間,或者可能是spring容器啟動(dòng)并解釋所有的bean配置文件。診斷了一下,發(fā)現(xiàn)1分鐘消耗的時(shí)間主要分布在hibernate解釋hbm.xml花費(fèi)5秒;spring容器從啟動(dòng)到解釋bean配置文件竟然花了58秒,真是太囂張了。當(dāng)時(shí)非常懷疑spring的效率問(wèn)題。企圖從網(wǎng)上搜索相關(guān)資料,看看有什么優(yōu)化措施。

    ??? 首先是找到了hibernate的啟動(dòng)優(yōu)化 http://www.hibernate.org/194.html? 里面的主要思想是通過(guò)將xml序列花到本地的文件里,每次讀取的時(shí)候根據(jù)情況,從本地文件讀取并反序列化,節(jié)省了hibernate xml的解析時(shí)間。按照這個(gè)方式測(cè)試了一下,發(fā)現(xiàn)hibernate的啟動(dòng)時(shí)間從5秒降低到3秒,但是這個(gè)優(yōu)化對(duì)于整個(gè)啟動(dòng)過(guò)程是杯水車薪的,毫無(wú)用處。

    ??? 沒(méi)辦法,又仔細(xì)查看了spring的資料,終于發(fā)現(xiàn)spring的容器是提供了lazy-load的,即默認(rèn)的缺省設(shè)置是bean沒(méi)有l(wèi)azy-load,該屬性處于false狀態(tài),這樣導(dǎo)致spring在啟動(dòng)過(guò)程導(dǎo)致在啟動(dòng)時(shí)候,會(huì)默認(rèn)加載整個(gè)對(duì)象實(shí)例圖,從初始化ACTION配置、到service配置到dao配置、乃至到數(shù)據(jù)庫(kù)連接、事務(wù)等等。這么龐大的規(guī)模,難怪spring的啟動(dòng)時(shí)間要花將近1分鐘。嘗試了一下,把beans的default-lazy-init改為true就,再次啟動(dòng),速度從原來(lái)的55秒,降到8秒鐘!!Great!雖然是非常小一個(gè)改動(dòng),但是影響確實(shí)非常大。一個(gè)項(xiàng)目組10個(gè)人,假若每個(gè)人一天平均需要在eclipse下啟動(dòng)測(cè)試服務(wù)器50次。那么一天項(xiàng)目組需要重啟500次,每次節(jié)省50秒的話,就是25000秒,將近幾個(gè)小時(shí),差不多一個(gè)工作日,多么可觀的數(shù)字!

    ?? 不過(guò)在運(yùn)行期間第一次點(diǎn)頁(yè)面的時(shí)候,由于spring做了lazy-load,現(xiàn)在就需要啟動(dòng)一部分需要的beans,所以稍微慢2-3秒鐘,但是明顯比等幾十秒要快很多,值得一鑒。

    ??? 以上是針對(duì)開發(fā)階段的spring容器啟動(dòng)優(yōu)化,在部署到實(shí)際環(huán)境中,倒是沒(méi)必要設(shè)置為lazy-load。畢竟部署到實(shí)際環(huán)境中不是經(jīng)常的事,每次啟動(dòng)1分鐘倒不是大問(wèn)題。
    posted @ 2006-07-29 13:27 jspark 閱讀(3272) | 評(píng)論 (2)編輯 收藏
    ?????? 上面說(shuō)到代碼混淆方法之混淆器使用,主要針對(duì)proguard進(jìn)行了說(shuō)明。其實(shí),只要我們的類被其他地方的類調(diào)用到的話,那么代碼混淆器就似乎沒(méi)有辦法了,因?yàn)榇a混淆如果把代碼的簽名一起改了的話,其他地方是肯定調(diào)用不到,并會(huì)出錯(cuò)。而且,針對(duì)代碼調(diào)用,有幾點(diǎn)是我們肯定不能避免的:一是jsp頁(yè)面,如果在jsp頁(yè)面調(diào)用了某個(gè)類,那么如果類被混淆了的話,jsp頁(yè)面肯定會(huì)出錯(cuò);二是xml配置文件,比如在hibernate開發(fā)中,對(duì)于hbm.xml文件,就沒(méi)辦法了。不過(guò),很慶幸的是,proguard的功能很強(qiáng),可以通過(guò)配置,只針對(duì)私有方法、私有變量做混淆。但是,這種混淆效果肯定是不如所愿。下面將說(shuō)明代碼混淆方法之二(tomcat下面代碼加密)

    ?????? 應(yīng)用服務(wù)器加密的方法不外就是通過(guò)修改該應(yīng)用服務(wù)器的類轉(zhuǎn)載器,來(lái)載入我們的類。首先我們通過(guò)一定算法,將我們的class文件加密,并部署到應(yīng)用服務(wù)器。然后修改修改該應(yīng)用服務(wù)器的類轉(zhuǎn)載器,通過(guò)解密算法將class文件反編譯并加載。從而達(dá)到class文件的加密。下面主要針對(duì)tomcat下面的加密、解密說(shuō)明。

    ???? 首先得研究一下tomcat的類裝載機(jī)制:tomcat的類裝載機(jī)制主要分為下面幾種:

    ???1、Bootstrap: 由虛擬機(jī)提供
    ???2、System:類路徑等相關(guān)
    ?? 3、Common:tomcat下面的公共包
    ?? 4、Catalina:tomcat自己的包,比如server目錄下面
    ?? 5、Shared:各個(gè)war包的共享包
    ?? 6、Webapp:各個(gè)war包自己的相關(guān)類包

    ???由于一般的典型情況是,我們是要加密自己的應(yīng)用程序,那么,我們就要覆蓋上面所說(shuō)的Webapp類裝載器。tomcat的Webapp類裝載器位于${tomcat.home}\server\lib\catalina.jar下面的類org.apache.catalina.loader.WebappClassLoader。我們從tomcat的網(wǎng)站下面下載tomcat的源代碼,WebappClassLoader的源代碼位于目錄\jakarta-tomcat-catalina\catalina\src\share\org\apache\catalina\loader下面,打開源代碼,可以看到里面的調(diào)用機(jī)制是這樣的:
    ??? ?該類里面提供了很多諸如addRepository、addJar之類的方法,這是tomcat給類路徑添加相應(yīng)的目錄和包,比如在啟動(dòng)時(shí),tomcat會(huì)將我們的應(yīng)用程序下面的WEB-INF/lib/*.jar和WEB-INF/classes/**.class添加到資源路徑下面。
    ????
    ????首先,在加載類的時(shí)候,會(huì)調(diào)用loadClass方法。我們先定位到下面這個(gè)方法???
    ???? public Class loadClass(String name, boolean resolve)
    ??????? throws ClassNotFoundException?

    ???? 仔細(xì)觀察該方法,可以發(fā)現(xiàn),tomcat提供了很多緩存機(jī)制,首先分別從各個(gè)級(jí)別的緩存加載類,如果加載到類,就直接返回,否則會(huì)調(diào)用下面的方法: clazz = findClass(name);

    ???? 繼續(xù)定位到方法 public Class findClass(String name) throws ClassNotFoundException?
    ???? 該方法里面有一句調(diào)用 clazz = findClassInternal(name); 這個(gè)很關(guān)鍵,也就是我們最需要關(guān)心的一個(gè)方法了。再仔細(xì)閱讀一下,就能發(fā)現(xiàn),tomcat從本地的資源庫(kù)里面找,并先查找資源緩存,如果找到的話,直接返回緩存類。若找不到,就會(huì)讀取類文件的byte[]數(shù)組,并最后調(diào)用defineClass方法。defineClass文件是類裝載的最后一個(gè)類定義方法。下面就是findClassInternal方法的代碼小段

    ?????????? if (entry.loadedClass == null) {
    ??????????? synchronized (this) {
    ??????????????? if (entry.loadedClass == null) {
    ?????????????????
    ??????????????????clazz = defineClass(name, entry.binaryContent, 0,
    ??????????????????????????????????????? entry.binaryContent.length,
    ??????????????????????????????????????? codeSource);???????????????
    ?????????????????}
    ??????????????????? entry.loadedClass = clazz;
    ??????????????????? entry.binaryContent = null;
    ??????????????????? entry.source = null;
    ??????????????????? entry.codeBase = null;
    ??????????????????? entry.manifest = null;
    ??????????????????? entry.certificates = null;
    ??????????????? } else {
    ??????????????????? clazz = entry.loadedClass;
    ??????????????? }
    ??????????? }
    ??????? } else {
    ??????????? clazz = entry.loadedClass;
    ??????? }

    ??????entry是一個(gè)存放類屬性的bean,其中類的數(shù)組流存放在binaryContent,那么我們的加密解密就從這里入手。為了方便起見,我們用base64算法加密,加密方法很簡(jiǎn)單。通過(guò)調(diào)用base64加密方法,把原有的class文件加密;推薦的base64加密方法是commons包的codec工程。可以從apache上面下載。把加密后的class文件替換tomcat下面的部署類文件。 那么在類裝載時(shí)就可以解密,并加載了。例如,為了測(cè)試,個(gè)人只對(duì)OrganizationServiceImp.class進(jìn)行加密,那么通過(guò)修改以上的裝載方法,就可以實(shí)現(xiàn)解密,修改后的代碼為如下,其中黑體為修改的

    ??????? if (entry.loadedClass == null) {
    ??????????? synchronized (this) {
    ??????????????? if (entry.loadedClass == null) {
    ??????????????? ?
    ??????????????? ?if(name.indexOf("OrganizationServiceImp") >=0)
    ??????????????? ?{
    ????????????????????byte[] base64Array = entry.binaryContent;
    ????????????????????byte[] orginByteArray = Base64.decodeBase64(base64Array);
    ????????????????????clazz = defineClass(name, orginByteArray, 0,
    ??????????????????????orginByteArray.length,?
    ???????????????????????????????codeSource);
    ?????????????????}
    ??????????????? ?else
    ??????????????? ?{
    ??????????????? ??clazz = defineClass(name, entry.binaryContent, 0,
    ??????????????????????????????????????? entry.binaryContent.length,
    ??????????????????????????????????????? codeSource);
    ???????????????????????????????????????
    ??????????????? ?}

    ??????????????????? entry.loadedClass = clazz;
    ??????????????????? entry.binaryContent = null;
    ??????????????????? entry.source = null;
    ??????????????????? entry.codeBase = null;
    ??????????????????? entry.manifest = null;
    ??????????????????? entry.certificates = null;
    ??????????????? } else {
    ??????????????????? clazz = entry.loadedClass;
    ??????????????? }
    ??????????? }
    ??????? } else {
    ??????????? clazz = entry.loadedClass;
    ??????? }
    ??????
    ??????
    運(yùn)行服務(wù)器,一切正常,說(shuō)明解密、加密成功,到此完成tomcat服務(wù)器下面的解密、加密。可以看出,tomcat下面的類裝載機(jī)制其實(shí)挺簡(jiǎn)單,不像其他服務(wù)器,比如weblogic、websphere服務(wù)器那么復(fù)雜。若能在這些服務(wù)器下面實(shí)現(xiàn)類似的效果,將是一個(gè)多么爽的事。個(gè)人在近幾天將對(duì)weblogic服務(wù)器下面的部署應(yīng)用進(jìn)行類似的研究

    posted @ 2006-07-25 12:25 jspark 閱讀(9078) | 評(píng)論 (13)編輯 收藏

    ??? 我們做java開發(fā)的一般都會(huì)遇到如何保護(hù)我們開發(fā)的代碼問(wèn)題。java語(yǔ)言由于是基于jvm上面,所以反編譯class文件很很容易。假如我們做了一個(gè)web程序,并把這個(gè)web程序發(fā)布給客戶。實(shí)際上,客戶是很容易反編譯出我們的源代碼出來(lái),包括所有的src文件和jsp文件等等。

    ???那么,如何保護(hù)我們的源代碼,實(shí)際上,應(yīng)該有幾種方法可以使用:1、使用代碼混淆器? 2、重載應(yīng)用服務(wù)器的classloader

    ???對(duì)于第一種方法來(lái)說(shuō),現(xiàn)在外面有很多開源工具可以使用,個(gè)人認(rèn)為最好用的當(dāng)屬proguard莫屬。proguard主要是易用易學(xué)。而且提供的功能也挺多。下面是個(gè)人一點(diǎn)使用心得

    ???(1)、從網(wǎng)上download proguard工具,proguard工具主要包含是幾個(gè)jar文件和一些example,下載地址http://proguard.sourceforge.net/

    ???(2)、將里面的幾個(gè)jar文件添加到類路徑下面。當(dāng)然,也可以不添加,但是下面在做混淆的時(shí)候,必須指定classpath,使在做混淆的過(guò)程中,能否訪問(wèn)該類

    ???(3)、編寫一個(gè)配置文件,主要是混淆器的一些參數(shù)。比如,下面是一個(gè)例子
    -injars?????? platform.jar
    -outjars????? platform_out.jar
    -libraryjars? <java.home>/lib/rt.jar
    -libraryjars ibatis-common-2.jar
    -libraryjars ibatis-dao-2.jar
    -libraryjars ibatis-sqlmap-2.jar
    -libraryjars junit-3.8.1.jar
    -libraryjars d:/j2ee.jar
    -libraryjars struts.jar
    -libraryjars commons-lang.jar
    -libraryjars D:/0working/coreproject/byislib/jasperreports-0.6.1.jar
    -libraryjars? commons-beanutils.jar

    -printmapping proguard.map
    -overloadaggressively
    -defaultpackage ''
    -allowaccessmodification
    -dontoptimize

    -keep public class *
    {
    ?public protected *;
    }

    -keep public class org.**

    -keep public class it.**

    各個(gè)參數(shù)的含義參考proguard文檔,該文檔非常詳細(xì),上手很容易

    OK,到此就完成了代碼混淆,打開產(chǎn)生的jar包可以看到,多了好多a、b、c之類的類文件。說(shuō)明混淆結(jié)果已經(jīng)成功。將原jar刪除、運(yùn)行產(chǎn)生的混淆jar包,一切正常!

    常見問(wèn)題:使用過(guò)程中個(gè)人遇到了幾個(gè)問(wèn)題,開始也是找了很久才解決
    ???a. 內(nèi)存溢出異常: 主要是proguard在做混淆的時(shí)候,吃了很多內(nèi)存,因此,在運(yùn)行混淆器的時(shí)候,可以增加內(nèi)存,比如 java -mx512m .....
    ? b.棧溢出異常: 主要是proguard在做混淆的時(shí)候,會(huì)對(duì)一些代碼進(jìn)行優(yōu)化,若遇到一些相對(duì)復(fù)雜的方法時(shí),可能會(huì)拋出此異常。對(duì)付的辦法是增加配置參數(shù)-dontoptimize,如上面的配置例子所示

    對(duì)于第二種方法,重載服務(wù)器的classloader的原理是這樣。 首先我們通過(guò)一定算法把class文件加密; 然后寫我們自己的classloader,替換服務(wù)器的classloader。 這樣,我們可以讀取class文件,通過(guò)我們自己的算法反加密成正確的class,然后再次進(jìn)行l(wèi)oad。這個(gè)方式還沒(méi)應(yīng)用起來(lái),這幾天個(gè)人正在研究,有什么新成果會(huì)在此做一些總結(jié)。

    posted @ 2006-07-24 15:03 jspark 閱讀(7916) | 評(píng)論 (6)編輯 收藏
    終于在blogjava開通了個(gè)人blog,真是開心
    其實(shí)很早以前就想來(lái)這里開通一個(gè),只是一直忙于項(xiàng)目中,沒(méi)什么工夫過(guò)來(lái)。平時(shí)在項(xiàng)目中,或多或少總是會(huì)有很多心得,有時(shí)候沒(méi)記下來(lái),過(guò)一陣時(shí)間可能會(huì)忘光光,所以很想有個(gè)blog,記錄這些閃光點(diǎn)。

    最近在研究spring源代碼,以后有什么心得會(huì)寫出來(lái)
    posted @ 2006-07-21 17:58 jspark 閱讀(503) | 評(píng)論 (4)編輯 收藏
    僅列出標(biāo)題
    共2頁(yè): 上一頁(yè) 1 2 
    主站蜘蛛池模板: 日产乱码一卡二卡三免费| 无码av免费一区二区三区| 亚洲av色香蕉一区二区三区| 91亚洲国产成人久久精品网址| rh男男车车的车车免费网站| 老司机午夜免费视频| 亚洲性色高清完整版在线观看| 伊人久久亚洲综合影院| 黄网站色在线视频免费观看| 在线观看免费av网站| 国产免费人成视频在线播放播 | 亚洲国产成人精品女人久久久 | 四虎必出精品亚洲高清| 亚洲精品天堂在线观看| 亚洲精华国产精华精华液好用 | 老色鬼久久亚洲AV综合| 亚洲国产av美女网站| 亚洲综合av一区二区三区不卡 | 国产天堂亚洲国产碰碰| 日日躁狠狠躁狠狠爱免费视频| 国产99久久久久久免费看| 在线播放免费人成毛片乱码| 24小时免费看片| 国内精品久久久久影院免费 | a级特黄毛片免费观看| 91香焦国产线观看看免费| 美女视频黄的全免费视频| 国产极品粉嫩泬免费观看| 国产性爱在线观看亚洲黄色一级片| 在线观看永久免费视频网站| 亚洲人成电影在线播放| 亚洲AV日韩精品久久久久久久| 亚洲欧洲中文日产| 久久精品国产亚洲av瑜伽| 亚洲av日韩综合一区二区三区| 高清免费久久午夜精品| 97在线视频免费| 免费jjzz在线播放国产| 亚洲AV无码一区东京热久久 | 亚洲理论片中文字幕电影| 鲁死你资源站亚洲av|