亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Web服務器 > 正文

解析Tomcat的啟動腳本--catalina.bat

2024-09-01 13:49:36
字體:
來源:轉載
供稿:網友

概述

Tomcat 的三個最重要的啟動腳本:

  • startup.bat
  • catalina.bat
  • setclasspath.bat

上一篇咱們分析了 startup.bat 腳本

這一篇咱們來分析 catalina.bat 腳本.

至于 setclasspath.bat 這個腳本, 相信看完這一篇, 就可以自己看懂這個腳本了.
可以點擊下載 [ setclasspath.bat 腳本 ]查看附注釋的 setclasspath.bat 腳本

catalina.bat

這個腳本的代碼有點多, 就單獨弄了一篇展示 catalina.bat 腳本中的內容. 點擊 [catalina.bat 腳本 ]下載查看.

下面咱們就按照腳本中的內容一行行的來分析.

@echo offsetlocal

這兩個命令可以參考上一篇的文章(解析Tomcat的啟動腳本--startup.bat)的解釋

第一塊腳本代碼

rem Suppress Terminate batch job on CTRL+Cif not ""%1"" == ""run"" goto mainEntryif "%TEMP%" == "" goto mainEntryif exist "%TEMP%/%~nx0.run" goto mainEntryecho Y>"%TEMP%/%~nx0.run"if not exist "%TEMP%/%~nx0.run" goto mainEntryecho Y>"%TEMP%/%~nx0.Y"call "%~f0" %* <"%TEMP%/%~nx0.Y"rem Use provided errorlevelset RETVAL=%ERRORLEVEL%del /Q "%TEMP%/%~nx0.Y" >NUL 2>&1exit /B %RETVAL%:mainEntrydel /Q "%TEMP%/%~nx0.run" >NUL 2>&1

腳本的作用

判斷用戶是否使用

catalina.bat run

來啟動 Tomcat 的.

如果用戶使用 startup.bat 腳本啟動 Tomcat, 那么這段腳本不會被執行.

這段代碼看起來很亂, 慢慢分析.

第一行:

注釋, 意思就是: 禁止使用 CTRL+C 來終止批處理任務, 也不知道是怎么禁止的.

第二行:

if not ""%1"" == ""run"" goto mainEntry

首先明白這里的這個 "%1" 這個變量代表的是什么? 正常情況下, 這個腳本是被 startup.bat 腳本調用的, 被調用的同時傳遞了一個 start 參數過來(上一篇分析得出的). 在 批處理命令 中 %1 就表示命令之后的第一個參數, 在這里指的就是 start. 所以 "%1" = start. 如果用戶用 catalina.bat run 命令啟動 Tomcat 的話, 那么這里的 "%1" = run.

第三行:

if "%TEMP%" == "" goto mainEntry

這里的 %TEMP% 很有可能被認為是 空, 其實這里可以讀取到系統的環境變量. 所以, 這里的 %TEMP% 就是系統的環境變量值, 通常裝完 windows 系統的話, 系統會自動配置上這個環境變量. 所以這里一般是有值的. 大家可以去系統的環境變量看一下它指向那個目錄, 一般就是 C:/Users/用戶名/AppData/Local/Temp. 注意: AppData 是一個隱藏目錄.

第四行:

if exist "%TEMP%/%~nx0.run" goto mainEntry

這里又出現了一個新的東西 %~nx0 . 在批處理中, 我們知道 %1 表示的是程序之后的第一個參數, 那么 %0 呢? %0 表示這個可執行程序的名稱, %~nx0 的話就是程序的名稱+擴展名

在這里就是 catalina.bat . 大家可以寫一個小腳本(test.bat)驗證一下: (我的腳本放在 D 盤下)

腳本內容:

@echo offecho "%~nx0"echo "%1"

執行結果:

PS D:/> ./test.bat Hello"test.bat""Hello"PS D:/>

第五行:

echo Y>"%TEMP%/%~nx0.run"

這段代碼很簡單, 就是寫入字符 Y 到 %TEMP%/catalina.bat.run 文件中.

第六行:

if not exist "%TEMP%/%~nx0.run" goto mainEntry

又判斷了一下 %TEMP%/catalina.bat.run 文件是否存在.

第七行:

echo Y>"%TEMP%/%~nx0.Y"

同第五行, 寫入 Y 到 %TEMP%/catalina.bat.Y . 如果文件不存在, 則新建一個.

第八行:

call "%~f0" %* <"%TEMP%/%~nx0.Y"

這一行有點意思. 又出現了兩個新的東西:

(因為 markdown 語法限制, 把下面代碼寫到代碼塊里)

- "%~f0" : 簡單說就是表示當前命令的絕對路徑.
- "%*" : 我們知道 %1 表示第一個參數, 依次類推, %2 表示第二個.... 那么 %* 就很好理解了, 代表所有參數.

驗證一下

腳本內容:

@echo offecho "%*"echo "%~f0"

執行結果:

PS D:/> ./test.bat Hello World"Hello World""D:/test.bat"PS D:/>

那么后面的 <"%TEMP%/%~nx0.Y" 意思就是讀取 %TEMP%/catalina.bat.Y 文件中的內容.

之后又通過 call 進行調用.

我們自己寫一個例子, 在 D 盤建立 test.bat 文件, 再建立 catalina.bat.Y 文件

腳本內容:

call "%~f0" %* < D:/catalina.bat.Y

catalina.bat.Y 文件內容

Y

執行結果:

........D:/>call "D:/test.bat" Hello World 0<D:/catalina.bat.YD:/>call "D:/test.bat" Hello World 0<D:/catalina.bat.YD:/>call "D:/test.bat" Hello World 0<D:/catalina.bat.YD:/>call "D:/test.bat" Hello World 0<D:/catalina.bat.YD:/>call "D:/test.bat" Hello World 0<D:/catalina.bat.YD:/>call "D:/test.bat" Hello World 0<D:/catalina.bat.YD:/>call "D:/test.bat" Hello World 0<D:/catalina.bat.Y****** B A T C H R E C U R S I O N exceeds STACK limits ******Recursion Count=593, Stack Usage=90 percent****** B A T C H PROCESSING IS A B O R T E D ******

最上面省略了很多重復代碼, 從這里發現它不斷地調用自己本身, 直到超出了堆棧的限制才停止.

我們如果加上 @echo off 的話

@echo offcall "%~f0" %* < D:/catalina.bat.Y

結果只會出現

D:/>./test.bat Hello World****** B A T C H R E C U R S I O N exceeds STACK limits ******Recursion Count=593, Stack Usage=90 percent****** B A T C H PROCESSING IS A B O R T E D ******

我們這里只需要明白這些命令的作用就可以, 稍后我們會總結 Tomcat 執行這些命令的目的.

第十行:

set RETVAL=%ERRORLEVEL%

我們如果了解 Linux 的話都知道, 每個命令的執行都會返回一個執行完成之后的退出碼. Linux執行完一條命令之后用 echo $? 來查看上一條命令的退出碼. 在 Windows 中也是一樣的, 命令執行完之后都有自己的退出碼. 這里的 %ERRORLEVEL% 就是取的上面的 call 命令的退出碼. 賦值給一個變量 RETVAL

第十一行:

del /Q "%TEMP%/%~nx0.Y" >NUL 2>&1

這里又出現了一個 del 命令, 很容易聯想到 delete, 那么 /Q 是什么意思呢? 靜默刪除, 不會給你任何提示, 就比如 Linux 中的 rm -f 一樣, 這里是刪除 %TEMP%/catalina.bat.Y 這個文件.

后面的 >NUL 2>&1 又是什么意思呢?

于 Linux 中的輸出流的重定向原理是一樣的.

(因為 markdown 語法限制, 把下面代碼寫到代碼塊里)

- >NUL : 表示將輸出重定向到 NUL 中, 你什么也看不到- 2>&1 : 2:錯誤輸出, &1: 標準輸出, 意思就是將錯誤消息輸出到標準輸出中.- >NUL 2>&1 : 就是先將錯誤消息輸出到標準輸出中, 然后再輸出到 NUL 中.

第十二行:

exit /B %RETVAL%

退出當前批處理, /B 指定退出時的編號, 把 RETVAL 最為 退出碼, 也就是 call 執行的命令 的退出碼.

最后兩行:

:mainEntrydel /Q "%TEMP%/%~nx0.run" >NUL 2>&1

定義一個 mainEntry 標簽, 然后刪除 臨時目錄中的 catalina.bat.run 文件.

總結第一段腳本的功能

簡單說, 這段代碼的作用就是調用本身, 判斷臨時目錄中的文件是否存在來避免二次回調自己. 感覺寫的好復雜.

下面就進入 Tomcat 的正式啟動過程, 并沒有開始執行 main 方法

第二段腳本代碼

rem Guess CATALINA_HOME if not definedset "CURRENT_DIR=%cd%"if not "%CATALINA_HOME%" == "" goto gotHomeset "CATALINA_HOME=%CURRENT_DIR%"if exist "%CATALINA_HOME%/bin/catalina.bat" goto okHomecd ..set "CATALINA_HOME=%cd%"cd "%CURRENT_DIR%":gotHomeif exist "%CATALINA_HOME%/bin/catalina.bat" goto okHomeecho The CATALINA_HOME environment variable is not defined correctlyecho This environment variable is needed to run this programgoto end:okHomerem Copy CATALINA_BASE from CATALINA_HOME if not definedif not "%CATALINA_BASE%" == "" goto gotBaseset "CATALINA_BASE=%CATALINA_HOME%":gotBase

這段腳本還是比較簡單的, 主要是設置了兩個環境變量 CATALINA_HOME 和 CATALINA_BASE .

如果沒有配置 CATALINA_BASE 環境變量的話, 直接引用 CATALINA_HOME 的值

靜下心來稍微看一下就懂了.

第三段腳本代碼

rem Ensure that neither CATALINA_HOME nor CATALINA_BASE contains a semi-colonrem as this is used as the separator in the classpath and Java provides norem mechanism for escaping if the same character appears in the path. Check thisrem by replacing all occurrences of ';' with '' and checking that neitherrem CATALINA_HOME nor CATALINA_BASE have changedif "%CATALINA_HOME%" == "%CATALINA_HOME:;=%" goto homeNoSemicolonecho Using CATALINA_HOME: "%CATALINA_HOME%"echo Unable to start as CATALINA_HOME contains a semicolon (;) charactergoto end:homeNoSemicolonif "%CATALINA_BASE%" == "%CATALINA_BASE:;=%" goto baseNoSemicolonecho Using CATALINA_BASE: "%CATALINA_BASE%"echo Unable to start as CATALINA_BASE contains a semicolon (;) charactergoto end:baseNoSemicolon

這里主要是判斷 CATALINA_HOME 環境變量的值 和 CATALINA_BASE 環境變量的值是否以 分號為結尾, 如果以 分號為結尾的話, 就報錯退出.

第四段腳本代碼

rem Ensure that any user defined CLASSPATH variables are not used on startup,rem but allow them to be specified in setenv.bat, in rare case when it is needed.set CLASSPATH=rem Get standard environment variablesif not exist "%CATALINA_BASE%/bin/setenv.bat" goto checkSetenvHomecall "%CATALINA_BASE%/bin/setenv.bat"goto setenvDone:checkSetenvHomeif exist "%CATALINA_HOME%/bin/setenv.bat" call "%CATALINA_HOME%/bin/setenv.bat":setenvDonerem Get standard Java environment variablesif exist "%CATALINA_HOME%/bin/setclasspath.bat" goto okSetclasspathecho Cannot find "%CATALINA_HOME%/bin/setclasspath.bat"echo This file is needed to run this programgoto end:okSetclasspathcall "%CATALINA_HOME%/bin/setclasspath.bat" %1if errorlevel 1 goto end

設置一個臨時環境變量: CLASSPATH.

如果 Tomcat 的 bin 目錄下面存在 setnv.bat 腳本的話, 就執行它. 通常情況下是沒有的.

繼而又判斷 setclasspath.bat 腳本是否存在, 如果不存在的話, 直接報錯, 停止啟動 Tomcat.

如果存在的話, 就去調用它, 并把 第一個參數傳進去.

setclasspath.bat 這個腳本主要設置了幾個環境變量

  • JAVA_HOME
  • JRE_HOME
  • JAVA_ENDORSED_DIRS = %CATALINA_HOME%/endorsed
  • _RUNJAVA = %JRE_HOME%/bin/java.exe
  • _RUNJDB = %JAVA_HOME%/bin/jdb.exe

第五段腳本代碼

rem Add on extra jar file to CLASSPATHrem Note that there are no quotes as we do not want to introduce randomrem quotes into the CLASSPATHif "%CLASSPATH%" == "" goto emptyClasspathset "CLASSPATH=%CLASSPATH%;":emptyClasspathset "CLASSPATH=%CLASSPATH%%CATALINA_HOME%/bin/bootstrap.jar"if not "%CATALINA_TMPDIR%" == "" goto gotTmpdirset "CATALINA_TMPDIR=%CATALINA_BASE%/temp":gotTmpdirrem Add tomcat-juli.jar to classpathrem tomcat-juli.jar can be over-ridden per instanceif not exist "%CATALINA_BASE%/bin/tomcat-juli.jar" goto juliClasspathHomeset "CLASSPATH=%CLASSPATH%;%CATALINA_BASE%/bin/tomcat-juli.jar"goto juliClasspathDone:juliClasspathHomeset "CLASSPATH=%CLASSPATH%;%CATALINA_HOME%/bin/tomcat-juli.jar":juliClasspathDone

這段代碼主要做了三件事:

  • 把 Tomcat bin 目錄下的 bootstrap.jar 加入到環境變量中
  • 設置 CATALINA_TMPDIR 環境變量的值為 Tomcat 目錄下的 temp 目錄
  • 把 Tomcat bin 目錄下的 tomcat-juli.jar 加入到環境變量中

第六段腳本代碼

if not "%JSSE_OPTS%" == "" goto gotJsseOptsset JSSE_OPTS="-Djdk.tls.ephemeralDHKeySize=2048":gotJsseOptsset "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%"rem Register custom URL handlersrem Do this here so custom URL handles (specifically 'war:...') can be used in the security policyset "JAVA_OPTS=%JAVA_OPTS% -Djava.protocol.handler.pkgs=org.apache.catalina.webresources"if not "%LOGGING_CONFIG%" == "" goto noJuliConfigset LOGGING_CONFIG=-Dnopif not exist "%CATALINA_BASE%/conf/logging.properties" goto noJuliConfigset LOGGING_CONFIG=-Djava.util.logging.config.file="%CATALINA_BASE%/conf/logging.properties":noJuliConfigset "JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG%"if not "%LOGGING_MANAGER%" == "" goto noJuliManagerset LOGGING_MANAGER=-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager:noJuliManagerset "JAVA_OPTS=%JAVA_OPTS% %LOGGING_MANAGER%"

主要是追加一系列的啟動參數到 JAVA_OPTS 這個環境變量中.

第八段腳本代碼

echo Using CATALINA_BASE: "%CATALINA_BASE%"echo Using CATALINA_HOME: "%CATALINA_HOME%"echo Using CATALINA_TMPDIR: "%CATALINA_TMPDIR%"if ""%1"" == ""debug"" goto use_jdkecho Using JRE_HOME: "%JRE_HOME%"goto java_dir_displayed:use_jdkecho Using JAVA_HOME: "%JAVA_HOME%":java_dir_displayedecho Using CLASSPATH: "%CLASSPATH%"

主要是打印相關的環境變量信息.

第九段腳本代碼

set _EXECJAVA=%_RUNJAVA%set MAINCLASS=org.apache.catalina.startup.Bootstrapset ACTION=startset SECURITY_POLICY_FILE=set DEBUG_OPTS=set JPDA=

設置一些列的環境變量:

  • _RUNJAVA : %JRE_HOME%/bin/java.exe
  • MAINCLASS : 指定了 Tomcat 的啟動類, 沒錯 main 方法就是在這個類里面.
  • ACTION : 動作: 就是啟動
  • SECURITY_POLICY_FILE : 安全策略文件, 如果啟動的時候加上了 -security 參數的話, 下面會對這個參數指定到 Tomcat 的 conf 目錄下的 catalina.policy 文件.
  • JPDA : 這個參數可以百度一下, 我們平時幾乎用不到.

第十段代碼

if not ""%1"" == ""jpda"" goto noJpdaset JPDA=jpdaif not "%JPDA_TRANSPORT%" == "" goto gotJpdaTransportset JPDA_TRANSPORT=dt_socket:gotJpdaTransportif not "%JPDA_ADDRESS%" == "" goto gotJpdaAddressset JPDA_ADDRESS=localhost:8000:gotJpdaAddressif not "%JPDA_SUSPEND%" == "" goto gotJpdaSuspendset JPDA_SUSPEND=n:gotJpdaSuspendif not "%JPDA_OPTS%" == "" goto gotJpdaOptsset JPDA_OPTS=-agentlib:jdwp=transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND%:gotJpdaOptsshift:noJpda

好像直接從第一行跳到了最后一行, 沒錯, 一般我沒啟動的時候沒有加 jpda 參數的話, 這里會直接跳過, 里面的腳本是關于 JPDA 的設置等.

第十一段腳本代碼

if ""%1"" == ""debug"" goto doDebugif ""%1"" == ""run"" goto doRunif ""%1"" == ""start"" goto doStartif ""%1"" == ""stop"" goto doStopif ""%1"" == ""configtest"" goto doConfigTestif ""%1"" == ""version"" goto doVersionecho Usage: catalina ( commands ... )echo commands:echo debug Start Catalina in a debuggerecho debug -security Debug Catalina with a security managerecho jpda start Start Catalina under JPDA debuggerecho run Start Catalina in the current windowecho run -security Start in the current window with security managerecho start Start Catalina in a separate windowecho start -security Start in a separate window with security managerecho stop Stop Catalinaecho configtest Run a basic syntax check on server.xmlecho version What version of tomcat are you running?goto end

好似一個 switch 開關.

  • 如果我們用 startup.bat 啟動 Tomcat 的話, 這里的 "%1" 的值是 start
  • 如果通過 catalina.bat run 啟動 Tomcat 的話, 這里的 "%1" 的值是 run

第十二段腳本代碼

:doRunshiftif not ""%1"" == ""-security"" goto execCmdshiftecho Using Security Managerset "SECURITY_POLICY_FILE=%CATALINA_BASE%/conf/catalina.policy"goto execCmd:doStartshiftif "%TITLE%" == "" set target="_blank">解析Tomcat的啟動腳本-startup.bat》


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲影视九九影院在线观看| 亚洲人成网站在线播| 性欧美在线看片a免费观看| 国产成人精品999| 久久在线观看视频| 亚洲jizzjizz日本少妇| 成人黄色免费网站在线观看| 国产精品欧美日韩一区二区| 青青草原一区二区| 久久视频免费观看| 日韩精品免费视频| 欧美亚洲第一页| 国产欧美精品一区二区三区-老狼| 亚洲欧洲在线观看| 亚洲伊人一本大道中文字幕| 热re99久久精品国产66热| 国产精品久久久91| 欧美二区乱c黑人| 国产欧美一区二区三区四区| 亚洲国产又黄又爽女人高潮的| 一道本无吗dⅴd在线播放一区| 欧美精品在线免费观看| 久久久这里只有精品视频| 精品一区二区三区四区| 欧美性猛交xxxxx免费看| 国产精品视频99| 91精品在线观看视频| 欧美视频在线免费| 91精品国产色综合久久不卡98口| 亚洲小视频在线观看| 55夜色66夜色国产精品视频| 国产精品成熟老女人| 亚洲视频axxx| 日本久久久久久久| 91中文字幕在线| 亚洲精品少妇网址| 日产精品99久久久久久| 久久影院模特热| 国产亚洲人成a一在线v站| 亚洲www永久成人夜色| 在线播放日韩专区| 尤物精品国产第一福利三区| 丝袜亚洲另类欧美重口| 国产丝袜视频一区| 欧美国产日产韩国视频| 国产精品国产三级国产aⅴ浪潮| 国产精品第100页| 美日韩精品免费视频| 色综合色综合久久综合频道88| 国外成人免费在线播放| 成人精品视频久久久久| 日韩精品在线影院| 欧美一级淫片videoshd| 国产91精品久久久久久久| 日韩精品中文在线观看| 一本一本久久a久久精品牛牛影视| 成人福利视频网| 亚洲人成在线免费观看| 亚洲欧美中文字幕| 国产精品美女主播在线观看纯欲| 日韩欧美在线视频| 国产欧美在线播放| 亚洲精品成人免费| 国产亚洲激情视频在线| 自拍偷拍亚洲在线| 亚洲第一精品福利| 欧美激情欧美激情| 欧美黄色小视频| 色偷偷88888欧美精品久久久| 欧美www视频在线观看| 欧美另类精品xxxx孕妇| 亚洲美女av在线| 久久国产精品久久久久久| 精品国产乱码久久久久久天美| 亚洲一区二区三区在线视频| 中文字幕亚洲国产| 亚洲国产精品va| 亚洲欧洲高清在线| 91免费的视频在线播放| 亚洲第一免费网站| 美女久久久久久久久久久| 亚洲日本中文字幕免费在线不卡| 国产亚洲精品一区二区| 亚洲美女动态图120秒| 亚洲午夜久久久久久久| 97国产真实伦对白精彩视频8| 欧美乱妇高清无乱码| 亚洲人成电影网站色…| 日韩欧美亚洲成人| 国产精品1234| 国产精品手机播放| 欧美激情国产精品| 成人黄色免费看| 国产91久久婷婷一区二区| 亚洲精品视频在线观看视频| 国产精品久久久久免费a∨大胸| 美日韩在线视频| 色系列之999| 日韩精品极品视频免费观看| 三级精品视频久久久久| 久久久久99精品久久久久| 亚洲精品456在线播放狼人| 尤物tv国产一区| 日韩成人在线观看| 亚洲成人网av| 久久理论片午夜琪琪电影网| 国产精品久久久久aaaa九色| 国产成人精品一区| 中文字幕v亚洲ⅴv天堂| 国产精品成人播放| 亚洲国产婷婷香蕉久久久久久| 欧美另类暴力丝袜| 91久久久久久久久久| 国产精品激情av在线播放| 亚洲第一偷拍网| 中文字幕亚洲图片| 一区二区成人精品| 亚洲色图50p| 亲爱的老师9免费观看全集电视剧| 欧美一级高清免费播放| 日韩一区二区三区国产| 欧美野外wwwxxx| 欧美最近摘花xxxx摘花| 久久亚洲精品中文字幕冲田杏梨| 久久九九国产精品怡红院| 米奇精品一区二区三区在线观看| 91精品免费视频| 欧美黑人性猛交| 国内伊人久久久久久网站视频| 精品国产一区二区三区久久狼黑人| 亚洲美女在线看| 日韩高清电影好看的电视剧电影| 中文字幕日韩综合av| 黑人巨大精品欧美一区二区三区| 91视频免费在线| 亚洲午夜久久久影院| 91九色精品视频| 精品视频在线播放色网色视频| 亚洲精品日产aⅴ| 亚洲一区二区久久久| 日韩高清电影免费观看完整| 久久精品久久久久久| 亚洲免费电影一区| 亚洲欧美一区二区三区情侣bbw| 国产精品99蜜臀久久不卡二区| 亚洲欧美制服第一页| 91精品国产91久久久久久最新| 日韩精品一二三四区| 国产精品免费一区豆花| 日韩av在线精品| 久久精品一偷一偷国产| 国精产品一区一区三区有限在线| 精品久久久久久久久久| 亚洲一区二区中文字幕| 久久久女人电视剧免费播放下载| 5278欧美一区二区三区| 91国产精品91| 国产午夜精品一区理论片飘花| 最近2019中文免费高清视频观看www99| 国产成人亚洲综合青青| 久久精品国产成人| 国产精品免费一区豆花| 欧美成人精品在线观看| 欧美中文字幕在线观看|