免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

深耕商務建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

手寫迷你Tomcat:拆解HTTP服務器與Servlet容器核心原理

手寫迷你Tomcat:拆解HTTP服務器與Servlet容器核心原理 去年我用兩個周末從零手寫了一個能跑靜態(tài)頁面、能部署Servlet的迷你Tomcat。做完那一刻再回頭看那些“IDEA配置Tomcat”“VSCode配置Tomcat”的教程才終于明白一個道理大多數(shù)配置教程只是在教你怎么當一個操作員而手寫一遍Tomcat才能讓你真正擁有回答“Tomcat干嘛的”的底氣。這個項目最大的收獲不是代碼量而是把Tomcat這層“中間件黑盒”徹底拆開了。你日常部署war包、改端口、配web.xml時遇到的每一個詭異問題追到根上基本都逃不出這幾件事HTTP協(xié)議報文怎么解析、Servlet類從哪里加載、請求映射到哪個方法、連接怎么復用。如果你正在學Java Web底層、準備面試被問Servlet容器原理或者每次配Tomcat總遇到似懂非懂的報錯我強烈建議跟我一樣動手寫一個簡化版。1. 網(wǎng)上一堆Tomcat配置教程我為什么反而選擇手寫一遍1.1 在回答“Tomcat干嘛的”之前先別急著搜配置教程先給結論Tomcat不只是一個“能跑Java Web應用的軟件”它本質上是兩個東西疊在一起——一個HTTP服務器一個Servlet容器。HTTP服務器這層負責監(jiān)聽Tomcat端口默認8080把瀏覽器發(fā)過來的TCP字節(jié)流解析成符合HTTP協(xié)議的請求把服務器返回的數(shù)據(jù)封裝成HTTP響應寫回Socket。Servlet容器這層負責加載你寫的Servlet類、解析web.xml里的映射配置、按請求路徑找到對應的類并調用它的service/doGet/doPost方法然后把結果交回HTTP服務器層。很多開發(fā)干了幾年每天在用Tomcat卻說不出這兩個層次。你問“Tomcat干嘛的”他們只能回答“部署war包的”。這不是他們的鍋因為日常開發(fā)里Tomcat被IDE藏得太好了點一下啟動按鈕日志一刷應用就起來了中間發(fā)生了什么完全不可見。手寫一遍就是強制自己把這層包裝撕掉去看真正的報文、真正的類加載、真正的Socket讀寫。我給自己定的目標是寫一個MiniTomcat能做到——啟動后監(jiān)聽指定端口訪問靜態(tài)HTML和圖片能正確返回能解析web.xml能加載并調用Servlet能模擬Tomcat的類加載器隔離機制。難度不大但每一步都要親手造輪子這比讀十遍源碼都有用。1.2 一個人手寫Tomcat需要先劃清三大邊界寫之前最容易犯的錯誤是“什么都要做”。Session、Filter、WebSocket、HTTPS、NIO、War熱部署……如果第一版就把這些全塞進去你會陷入無窮無盡的細節(jié)最后什么都寫不完。我劃分的邊界是第一版只做“通信與協(xié)議層”也就是Socket監(jiān)聽、HTTP請求解析、HTTP響應封裝第二層做“容器與路由層”也就是Servlet映射、反射調用、靜態(tài)資源分發(fā)第三層做“類加載與部署層”也就是WebAppClassLoader、web.xml加載、熱部署的簡化實現(xiàn)。這三層恰好對應Tomcat源碼里的Connector和Container兩大核心組件也對應JVM類加載體系。先跑通這三層MiniTomcat已經(jīng)能回答“Tomcat啟動后發(fā)生了什么”這個問題。Session、Filter這些后面想要都是在Servlet調用鏈上加攔截器或上下文對象不是第一版的核心矛盾。2. 動手前的關鍵決策把功能拆成Connector、Container和Loader三塊2.1 功能模塊拆解誰來監(jiān)聽端口誰來處理請求誰來加載類我設計的第一版類結構非常簡單總共分四組互相之間的依賴關系也清晰模塊職責核心類啟動入口初始化配置、綁定端口、開啟事件循環(huán)BootstrapConnector層把Socket字節(jié)流轉成HttpRequest對象把處理結果寫回SocketHttpRequest、HttpResponse、RequestParserContainer層判斷請求是靜態(tài)資源還是Servlet分別處理StaticResourceProcessor、ServletProcessorLoader層解析web.xml、加載Servlet類、實現(xiàn)類加載隔離WebConfig、WebAppClassLoader這個分組其實就是Tomcat源碼結構的縮小版。Tomcat里Connector負責協(xié)議解析和網(wǎng)絡通信Container負責調用鏈處理WebappClassLoader負責應用隔離。我不需要引入Spring那套容器概念一個請求從Socket進來落到對應的Processor上就已經(jīng)能解釋Tomcat八成的運行邏輯了。2.2 工程骨架哪些類放在哪里我建議工程結構長這樣mini-tomcat/ ├── src/main/java/com/example/minitomcat/ │ ├── Bootstrap.java │ ├── connector/ │ │ ├── HttpRequest.java │ │ ├── HttpResponse.java │ │ └── RequestParser.java │ ├── container/ │ │ ├── StaticResourceProcessor.java │ │ └── ServletProcessor.java │ └── loader/ │ ├── WebAppClassLoader.java │ └── WebConfig.java └── webroot/ ├── conf/web.xml ├── classes/ └── static/Bootstrap是入口類似于Tomcat的catalina.sh腳本加上Server組件。webroot是應用根目錄里面三個子目錄分別放web.xml、Servlet編譯后的class文件、靜態(tài)資源。這里有一個容易被忽略的設計點webroot一定要做成可以外部配置的參數(shù)而不是在代碼里寫死“D:/webroot”。Tomcat之所以有CATALINA_HOME和webapps的區(qū)分就是因為容器安裝目錄和部署目錄要解耦手寫版哪怕只有兩個參數(shù)也要把這個習慣保留下來。2.3 為什么第一版不做Session和Filter我在設計時故意把Session、Filter、Listener從第一版里砍掉了只保留了Servlet調用鏈。原因很實際濾器的核心是在Servlet前后插入一段代碼Session的核心是在請求里維護一個客戶端標識它們在Tomcat架構里屬于Context組件上的附屬設施而不是地基。真正的地基是“Socket變成請求對象請求路徑變成類調用”這條主線。如果第一版就糾纏Session的過期策略、Cookie寫到哪個域你會煩躁到懷疑人生。先把地基夯好Filter和Session都是往調用鏈上掛一段邏輯而已。3. 請求解析拿Socket流還原出真實的HTTP請求3.1 HttpRequest解析請求行、請求頭、請求體Tomcat處理請求的第一件事就是把Socket輸入流里的字節(jié)還原成一個結構化對象。HTTP請求文本的格式非常固定依次是請求行、多個請求頭、空行、請求體。比如瀏覽器訪問http://localhost:8080/hello時發(fā)出的原始請求長這樣GET /hello HTTP/1.1 Host: localhost:8080 User-Agent: Mozilla/5.0 Accept: text/html最后那個空行是HTTP協(xié)議里請求頭和請求體的分隔標志解析任何HTTP報文都要靠它切分階段。我寫了RequestParser做這件事核心解析函數(shù)如下public void parse() throws IOException { parseRequestLine(); parseHeaders(); parseBody(); } private void parseRequestLine() throws IOException { String line readLine(); if (line null || line.isEmpty()) { throw new IOException(empty request line); } String[] parts line.split( ); this.method parts[0]; String fullPath parts[1]; int idx fullPath.indexOf(?); if (idx 0) { this.uri fullPath.substring(0, idx); this.queryString fullPath.substring(idx 1); } else { this.uri fullPath; } } private void parseHeaders() throws IOException { String line; while ((line readLine()) ! null !line.isEmpty()) { int colon line.indexOf(:); if (colon 0) { headers.put(line.substring(0, colon).trim().toLowerCase(), line.substring(colon 1).trim()); } } } private void parseBody() throws IOException { String len headers.get(content-length); if (len ! null) { int length Integer.parseInt(len); body new byte[length]; int read 0; while (read length) { int n input.read(body, read, length - read); if (n -1) break; read n; } } }這里有一個拿捏細節(jié)注釋中的Host頭在許多HTTP/1.1請求里是必需的Tomcat處理虛擬主機時要靠它區(qū)分站點。手寫版即使不實現(xiàn)虛擬主機也應當在解析請求頭時統(tǒng)一把小寫化的Header名存進Map否則后面想加功能還得回頭改。3.2 為什么手寫解析時要避開BufferedReader這是我自己踩過的一個大坑。剛開始我用BufferedReader.readLine()逐行讀請求頭和請求行看著很省事但一旦請求里有POST請求體就會出現(xiàn)數(shù)據(jù)丟失或阻塞。原因很簡單BufferedReader內部維護了一個8KB緩沖區(qū)讀第一行時它可能已經(jīng)把后面的請求頭甚至請求體全部讀進了緩沖區(qū)。你再去從Socket的InputStream里讀body時數(shù)據(jù)已經(jīng)被BufferedReader截走了讀到的是null或者殘缺數(shù)據(jù)。Tomcat底層的Connector之所以寫得很復雜一個重要原因就是在字節(jié)層面精確控制“哪些字節(jié)屬于請求頭哪些字節(jié)屬于請求體”絕對不能依賴帶緩沖的Reader越界讀字節(jié)。所以我后來改成了逐字節(jié)手動讀取private String readLine() throws IOException { ByteArrayOutputStream bos new ByteArrayOutputStream(); int ch; while ((ch input.read()) ! -1) { if (ch \r) { int next input.read(); if (next \n || next -1) { break; } bos.write(ch); bos.write(next); } else if (ch \n) { break; } else { bos.write(ch); } } return bos.toString(StandardCharsets.ISO_8859_1); }注意這里用了ISO_8859_1而不是UTF-8。請求行和請求頭里的ASCII字符用Latin-1解碼是最安全的因為后續(xù)URL解碼和請求體解碼可以按具體字符集處理。一旦這里用了UTF-8遇到某些特殊字節(jié)會產(chǎn)生奇奇怪怪的亂碼。3.3 HttpResponse把狀態(tài)行、Content-Length和響應體寫對請求解析完就得設計響應對象。最基礎的HTTP響應用幾行就能說明白HTTP/1.1 200 OK Content-Type: text/html; charsetUTF-8 Content-Length: 55 htmlbodyh1Welcome/h1/body/html第一行是狀態(tài)行包含協(xié)議版本、狀態(tài)碼、原因短語。請求頭里最關鍵的是Content-Length它告訴瀏覽器響應體有多少字節(jié)。很多人手寫HTTP響應的時候會漏掉它結果瀏覽器一直轉圈因為不知道響應體在哪里結束。我的HttpResponse封裝了下面的核心能力public void sendError(int status, String reason) throws IOException { setBody(htmlbodyh1 status reason /h1/body/html); } public void setBody(String content) throws IOException { byte[] data content.getBytes(StandardCharsets.UTF_8); OutputStream out socket.getOutputStream(); out.write((HTTP/1.1 status reason \r\n).getBytes(StandardCharsets.ISO_8859_1)); out.write((Content-Type: contentType ; charsetUTF-8\r\n).getBytes(StandardCharsets.ISO_8859_1)); out.write((Content-Length: data.length \r\n).getBytes(StandardCharsets.ISO_8859_1)); out.write(\r\n.getBytes(StandardCharsets.ISO_8859_1)); out.write(data); out.flush(); }注意兩個細節(jié)一是\r\n絕不能只寫\nHTTP協(xié)議規(guī)定行分隔符是CRLF很多客戶端和網(wǎng)關對裸換行非常敏感二是所有文本統(tǒng)一先轉字節(jié)再寫OutputStream不要用Writer去寫否則字符編碼會截斷字節(jié)。3.4 靜態(tài)資源解析與路徑穿越攔截靜態(tài)資源是最容易先跑通的部分。StaticResourceProcessor做的事很簡單把URI映射到webroot/static目錄下的文件存在的文件返回內容不存在的返回404。但這里必須加一個安全檢查——過濾..路徑穿越。如果不攔截用戶請求/../conf/web.xml就能直接讀到你的配置文件這在真實Tomcat里同樣是禁忌。我寫了一個最小檢查public void process(HttpRequest request, HttpResponse response) throws IOException { String path request.getUri(); if (path.contains(..)) { response.sendError(403, Forbidden); return; } File file new File(WebConfig.getWebRoot(), static path); if (!file.exists()) { response.sendError(404, Not Found: path); return; } response.setContentType(Files.probeContentType(file.toPath())); response.writeFile(file); }另外靜態(tài)資源的Content-Type在真實環(huán)境里要求很嚴格text/html、application/javascript、image/png必須正確設置否則瀏覽器會亂碼或拒絕執(zhí)行腳本。Java的Files.probeContentType可能返回null手寫版建議維護一個簡單的擴展名映射表兜底。4. Servlet映射與調用反射拿到類執(zhí)行完整的Servlet生命周期4.1 用web.xml描述路由容器按圖找類真實Tomcat通過web.xml把URL路徑和Servlet類綁定起來。手寫版我直接用JDK內置的DOM解析不需要引入第三方庫。最簡web.xml長這樣?xml version1.0 encodingUTF-8? web-app servlet servlet-namehello/servlet-name servlet-classcom.demo.HelloServlet/servlet-class /servlet servlet-mapping servlet-namehello/servlet-name url-pattern/hello/url-pattern /servlet-mapping /web-appWebConfig解析該文件時先建立servlet-name到servlet-class的映射再建立url-pattern到servlet-name的映射最終得到一個MapString, String路徑到類名。這里我要特別提一下路徑匹配的優(yōu)先級。真實Tomcat的url-pattern匹配規(guī)則很復雜支持精確匹配、前綴匹配/hello/*、擴展名匹配*.do精確匹配優(yōu)先級最高。手寫版第一版只支持精確匹配是合理的但設計Map數(shù)據(jù)結構時就要把“路徑可能帶通配符”考慮進去不要等第二版重構結構。4.2 ServletProcessor反射實例化與service調用我現(xiàn)在定義一個極簡Servlet接口避免引入完整Servlet API的依賴public interface MiniServlet { void service(HttpRequest request, HttpResponse response) throws IOException; }ServletProcessor拿到路徑后從WebConfig找Servlet類名再加載、實例化、調用service。關鍵點在于加載這一步必須用WebAppClassLoader而不是默認的應用類加載器這是整個手寫項目里最貼近Tomcat靈魂的地方public class ServletProcessor { public void process(HttpRequest request, HttpResponse response) throws Exception { String path request.getUri(); String className WebConfig.findServletClass(path); if (className null) { response.sendError(404, No servlet mapped for: path); return; } MiniServlet servlet WebConfig.getServletInstance(className); servlet.service(request, response); } }WebConfig內部維護一個MapString, MiniServlet實例緩存同一個Servlet類只加載一次、只實例化一次。這和Tomcat的行為一致Servlet默認是單實例多線程模型所有請求共享同一個Servlet對象。而線程安全問題自然降臨到Servlet開發(fā)者身上容器不負責加鎖。反射創(chuàng)建實例的代碼比較簡單public static MiniServlet loadServlet(String className) throws Exception { WebAppClassLoader loader new WebAppClassLoader(WebConfig.getWebRoot(), Thread.currentThread().getContextClassLoader()); Class? clazz loader.loadClass(className); Object instance clazz.getDeclaredConstructor().newInstance(); if (!(instance instanceof MiniServlet)) { throw new IllegalArgumentException(className is not a MiniServlet); } return (MiniServlet) instance; }這個getDeclaredConstructor().newInstance()看似不起眼實際上對應Tomcat里ClassLoader加載完成后、容器調用無參構造器創(chuàng)建Servlet實例的過程。如果類構造函數(shù)拋異?;蛘哳悰]有無參構造器這里的異常鏈會非常長排查時要從根因看Caused by而不是盯著最外層。4.3 生命周期、異常與500響應Tomcat里Servlet有完整生命周期init初始化、service處理請求、destroy銷毀。手寫版我在加載實例后立刻調用一次init()雖然接口里沒體現(xiàn)但在實現(xiàn)類里可以約定如果需要初始化資源就重寫init()。還有一個非常容易忽略的異常處理分支Servlet的service方法可能拋異常尤其是數(shù)據(jù)庫連接超時、空指針這類。此時容器不能把異常原樣吞掉也不應該把堆棧打到控制臺就完事而要給客戶端一個明確的500響應。我加了一個簡單的兜底try { servlet.service(request, response); } catch (Exception e) { response.sendError(500, Internal Server Error: e.getMessage()); }這段代碼雖然少但代表了Tomcat里StandardWrapperValve處理異常的思路容器負責捕獲異常并轉換為標準錯誤響應Servlet開發(fā)者不需要在業(yè)務代碼里到處處理HTTP狀態(tài)碼。5. 類加載器手寫版也要把雙親委派機制拆了重裝5.1 雙親委派機制JVM為什么要父優(yōu)先這是整個手寫Tomcat里面試最愛考的點也是很多人看源碼時最難理解的一環(huán)。先說JVM默認的雙親委派機制當應用類加載器AppClassLoader需要加載一個類時它不先自己找而是先委托給父加載器——擴展類加載器JDK 9之后叫PlatformClassLoader擴展類加載器再委托給啟動類加載器Bootstrap ClassLoader。父加載器加載不了才輪到子加載器自己找。這個機制的安全意義在于確保核心類庫永遠是同一個版本。比如java.lang.String只能由啟動類加載器加載即使你在自己的classpath里塞一個同名同包名的偽造類雙親委派也會阻止它進入JVM從而防止核心API被篡改。5.2 Tomcat為什么反著來先看本地類再找父加載器Tomcat的WebappClassLoader卻把默認邏輯倒過來了加載一個類時先在自己負責的類路徑里找也就是應用目錄下的WEB-INF/classes和WEB-INF/lib本地找不到才委托給父加載器。為什么要這么做因為一個JVM里可能同時跑多個Web應用每個應用可以依賴不同版本的Spring、MyBatis。如果用默認的雙親委派Spring的類一旦被父加載器加載所有應用就共享同一個版本沒法做應用隔離。更麻煩的是類一但被加載后很難卸載熱部署時舊版類會一直杵在JVM里。手寫MiniTomcat的WebAppClassLoader核心代碼其實很短public class WebAppClassLoader extends ClassLoader { private final Path webAppRoot; public WebAppClassLoader(String webAppRoot, ClassLoader parent) { super(parent); this.webAppRoot Paths.get(webAppRoot); } Override protected Class? loadClass(String name, boolean resolve) throws ClassNotFoundException { synchronized (getClassLoadingLock(name)) { Class? loaded findLoadedClass(name); if (loaded ! null) { return loaded; } if (name.startsWith(java.) || name.startsWith(javax.)) { return super.loadClass(name, resolve); } try { Path classFile webAppRoot.resolve(classes) .resolve(name.replace(., /) .class); byte[] data Files.readAllBytes(classFile); loaded defineClass(name, data, 0, data.length); if (resolve) { resolveClass(loaded); } return loaded; } catch (IOException e) { return super.loadClass(name, resolve); } } } }注意這里的兩個關鍵動作java.*和javax.*開頭的類必須強制交給父加載器絕對不能本地優(yōu)先否則你自己寫的javax.servlet.Servlet可能破壞整個體系本地找不到類時最后調super.loadClass走默認雙親委派保證容器自身的類比如MiniServlet接口還是由系統(tǒng)類加載器加載。5.3 熱部署原理換一個ClassLoader的生命周期熱部署為什么一定要和類加載器綁在一起因為JVM不允許在運行時替換一個已被加載的類但允許你新建一個ClassLoader用新的ClassLoader重新加載同名類。舊的ClassLoader和它加載的類對象只要沒有外部引用就會被GC回收。Tomcat的reloadabletrue就是這樣一個循環(huán)過程監(jiān)控WEB-INF/classes和WEB-INF/lib里的文件時間戳發(fā)現(xiàn)有變化就把當前Web應用上下文整個停掉創(chuàng)建新的WebappClassLoader重新加載所有類。手寫版的簡化實現(xiàn)可以做得很直接if (classFile.lastModified() loadedTime) { WebAppClassLoader newLoader new WebAppClassLoader(webRoot, parentClassLoader); WebConfig.clearServletCache(); WebConfig.setClassLoader(newLoader); }這里踩過的坑是熱部署時如果舊的Servlet實例還被全局Map引用新Loader和舊Loader的類就同時存在于JVM里容易造成ClassCastException。所以換Loader的同時必須清空實例緩存Tomcat重啟Context也是同樣的道理——不是JVM重啟而是應用級的狀態(tài)全部清空重建。6. 啟動與排查手寫容器第一次跑起來哪些坑必須先知道6.1 Bootstrap的啟動流程端口、根目錄、事件循環(huán)Bootstrap的main方法其實相當樸素public class Bootstrap { public static void main(String[] args) throws Exception { int port args.length 0 ? Integer.parseInt(args[0]) : 8080; WebConfig.init(Paths.get(webroot)); ExecutorService pool Executors.newFixedThreadPool(16); try (ServerSocket serverSocket new ServerSocket(port)) { while (!Thread.currentThread().isInterrupted()) { Socket socket serverSocket.accept(); pool.submit(() - handle(socket)); } } } private static void handle(Socket socket) { try (socket) { HttpRequest request new HttpRequest(socket.getInputStream()); request.parse(); HttpResponse response new HttpResponse(socket); if (request.getUri().startsWith(/servlet/)) { new ServletProcessor().process(request, response); } else { new StaticResourceProcessor().process(request, response); } } catch (IOException e) { // 客戶端斷開等場景忽略并關閉連接即可 } } }這段代碼已經(jīng)能體現(xiàn)Tomcat啟動的核心流程解析配置、綁定端口、循環(huán)接收連接、將連接交給處理器。你在IDEA里配置Tomcat時填的port、deployment路徑本質上就是告訴這個啟動類端口是多少webroot在哪。手寫版跑通之后再回去看那些配置界面你會覺得每個選項都極其熟悉。6.2 啟動階段三類報錯及排查鏈路我實際運行mini-tomcat時第一天就撞了三堵墻每一堵都很有代表性第一類是端口沖突。啟動時報BindException: Address already in use通常就是8080被其他進程占了。排查命令建議直接背下來Windows用netstat -ano | findstr :8080Linux用ss -lntp | grep 8080macOS用lsof -i :8080。找到PID后要么殺掉占用進程要么換一個端口啟動。第二類是靜態(tài)資源404。這個問題幾乎都是webroot路徑不對導致的。我一開始把靜態(tài)資源放在了工程根目錄下的static但Bootstrap啟動時的工作目錄如果是另一個模塊Paths.get(webroot)就找不到。解決方法是把webroot作為啟動參數(shù)傳進來并且用絕對路徑驗證Path root Paths.get(webroot).toAbsolutePath(); if (!Files.isDirectory(root)) { throw new IllegalStateException(webroot not found: root); }第三類是ClassNotFoundException。這鍋甩給JDK之前先檢查兩件事web.xml里的servlet-class類名是不是全限定名以及class文件是否真的存在于webroot/classes對應的包路徑下。注意用自定義WebAppClassLoader時類文件的位置不是看classpath而是看Loader里定義的webAppRoot/classes這兩個概念一開始非常容易混淆。6.3 高版本JDK的隱藏坑最近幾個JDK大版本包括我寫的JDK 17、21以及更往后的版本在模塊化上做得越來越嚴格Socket和ServerSocket這套API倒是沒變但反射訪問私有成員的限制觸發(fā)了很多舊中間件的問題。以前很多框架靠setAccessible(true)強行突破封裝高版本JDK會輸出類似“Illegal reflective access operation”的警告甚至直接拋異常。手寫Tomcat時我建議從現(xiàn)在開始就養(yǎng)成一個習慣ServletRequest、Servlet響應這類對象里不需要用反射去拿私有字段盡量走公開接口。如果實在要反射啟動時準備好--add-opens java.base/java.langALL-UNNAMED這類參數(shù)但能避開就避開。這不是讓你抵制新版本而是舊習慣在JDK高版本下已經(jīng)不值錢了。7. 并發(fā)接入與后臺安全從單線程到線程池再到上傳war被限制IP7.1 從單線程到線程池別讓一個慢請求堵死全局第一版我偷懶用單線程for循環(huán)處理每個Socket結果發(fā)現(xiàn)一個明顯問題如果一個請求處理耗時很久比如Servlet里去訪問了一個慢數(shù)據(jù)庫后面的請求全部排隊整個服務相當于卡死。后來改成每連接一線程問題又來了線程數(shù)量沒有上限幾百個并發(fā)就把內存打爆。最終采用固定大小線程池也就是你在Bootstrap里看到的Executors.newFixedThreadPool(16)。Tomcat真正生產(chǎn)環(huán)境的線程池參數(shù)更復雜要配核心線程數(shù)、最大線程數(shù)、隊列容量、拒絕策略。手寫版用固定線程池雖然粗糙但足夠說明“連接接入和業(yè)務處理要解耦”這個核心思想。這里有個值得注意的小知識線程池不是越大越好。每個線程要占約1MB左右的棧空間如果TCP連接都是長連接線程池會被根本不發(fā)請求的空閑連接長期占滿。這也是Tomcat后來轉向NIO的重要原因——用更少的線程處理更多的并發(fā)連接。7.2 HTTP/1.1與keep-alive線程復用的兩面HTTP/1.1默認開啟keep-alive意思是同一個TCP連接可以連續(xù)發(fā)多個HTTP請求不用每次請求都重新建立連接。手寫版為了簡單直接處理完一個請求就關閉Socket也能跑但如果你想往上靠就得在循環(huán)里連續(xù)解析請求boolean keepAlive true; while (keepAlive !socket.isClosed()) { HttpRequest request new HttpRequest(socket.getInputStream()); request.parse(); HttpResponse response new HttpResponse(socket); process(request, response); response.flush(); keepAlive keep-alive.equalsIgnoreCase(request.getHeader(connection)); }這個循環(huán)看起來簡單它埋了一個隱患如果客戶端連接?;畹t遲不發(fā)下一個請求服務端線程會阻塞在readLine()上大量keep-alive空閑連接會白白占住線程資源。Tomcat 8之后默認用NIO核心就是解決“線程阻塞在空連接上”的問題。手寫版你能把這個矛盾親手復現(xiàn)一遍再去看NIO和Reactor模型理解會完全不同。7.3 上傳war被限制IP后臺管理權限的最小實現(xiàn)順便聊聊網(wǎng)上經(jīng)常搜到的問題“tomcat后臺頁面上傳war被限制ip”。這個現(xiàn)象根因是Tomcat默認的manager應用出于安全考慮只允許本機訪問。它通過Context里的Valve做IP過濾配置文件里常看到RemoteAddrValve或者RemoteHostValve只放行127\.0\.0\.1或者內網(wǎng)IP段。所以你在本地訪問manager通常正常從遠程一上傳war就403。這個安全策略背后的道理值得細想上傳war包等于允許執(zhí)行任意代碼。如果你只靠一個用戶名密碼來保護上傳接口密碼一旦泄露或者口令爆破成功攻擊者直接傳一個webshell是整臺服務器的權限。所以Tomcat用最底層、最不容易被繞過的網(wǎng)絡層IP限制來兜底而不是把安全全押在認證上。手寫版要模擬這個行為可以在Bootstrap的accept邏輯后加一段判斷如果是部署或管理接口的請求先校驗來源IP不是白名單就直接返回403InetAddress remote socket.getInetAddress(); if (!isAllowedManagerIp(remote)) { HttpResponse response new HttpResponse(socket); response.sendError(403, manager access forbidden from remote.getHostAddress()); socket.close(); return; }生產(chǎn)環(huán)境更嚴格的方案是管理端口和業(yè)務端口徹底分開管理端口只綁定在127.0.0.1或內網(wǎng)網(wǎng)卡上不暴露到外網(wǎng)。Tomcat的做法也是類似的思路——manager接口和業(yè)務接口同居一個端口但用Valve做第一層攔截。理解了這個你就知道“限制IP”不是Tomcat在給用戶添麻煩而是在做正確的事。如果你也想照著這個思路手寫一遍我的建議是從靜態(tài)文件開始不要一上來就寫類加載器。先用最簡單的Socket解析一個GET請求把靜態(tài)頁面返回成功再逐步加Servlet映射、web.xml、ClassLoader最后再碰并發(fā)和部署管理。調試時多用curl -v、telnet 8080手工發(fā)HTTP報文看原始流量能幫你肉眼確認每一行響應頭是否正確。先跑通再說別的——這句話放在幾乎所有中間件學習上都成立。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
色五月综合婷婷| 色色色综合视频| 97色片| 区美毛片子| 大香蕉婷婷| 亚洲精品午夜国产va久久成人| 五月丁香另类图片| 日本乱论99| 色激情五月| 五月的丁香六月的婷婷| 激情五月婷婷综合| 丁香色情五月天| 国产成人综合亚洲| 丁香色色网| 开心深爱激情网| 超级碰碰99| 色婷婷导航| 丁香六月婷婷色播| 噜噜色噜噜网| 夜丁香五月婷婷| 国产噜一噜天天噜| 婷婷午夜| 亚洲AV电影av| 啪啪日本欧美| 99视频内射三四| 欧美色性色好| 99精品亚洲| 日韩无码人妻一区二区三区综合| 天天艹天天综合网| 99这里有精品久久97| 久久免费丁香| 91热久久| 色色色视频免费无码 | 中文字幕精品在线观看| 激情久久久久| 丁香无五月网| 亚洲成人色五月婷婷综合| 99在线精品视频| 六月丁香婷婷综合影院| 玖玖婷婷色五月| 色久一| 久久婷婷五月丁香蜜桃网| 日韩操人| 色婷婷中文| 日韩在线看AV| 激情超碰网| 色亭亭丁香五月天| 婷婷色偷拍| 久久免费丁香| 色 免费网站视频| 99热青青草| 狼友视频在线观看18| 五月丁香婷婷色色色| 六月撸婷婷| 91婷婷五月丁香碰| 国产免费一区二区在线A片视频| 粉嫩av懂色av蜜臀av熟妇| 任你操精品免费| www、丁香五月天| 青青草轻轻操| 综合激情五月综合激情五月激情1| 精品久色| 久久五月婷婷开心网| 天天射天天射一道本日本社区| 这里只有国产精品在线| 婷婷开心激情| 五月天婷婷在线视频| 色色色色热| 少妇性按摩无码中文A片| 国产真实乱对白精彩| 精品一二三区久久AAA片| 日韩五月婷婷久久| 欧美久久婷婷| 蜜乳国产网站| 影音先锋一区| 伊人久久丁香五月91| 91五月花丁香| jiujiu热在线视频| 无码人妻一区二区三区免费九色| 六月丁香五月婷婷| 强壮的公次次弄得我高潮A片日本 | 久久A极片| 色护士综合| 婷婷玖玖五月天| 五月丁香六月激情综合网| 色婷婷视频| 婷婷五月天干干| 女人天堂AV| 91viP在线看| 黑人糟蹋人妻HD中文字幕| 黄网在线免费观| 婷婷丁香六月激情综合| 丁香五月五月婷婷欧美大香蕉 | 久久五月婷天天干| 丁香五月天啪啪| 色欲天天综合| 亚洲综合激情五月久久| 中文字幕丰满孑伦无码专区| 亚欧州精品视频| 亚洲综合激| 久久99热这里只有精品| 丁香花社区av| 天天噜天天爱| 色婷婷久久综合| 欧美婷婷色| 韩国19 主播内部福利vip免费播放| 97色色色色| 华人在线免费| 久久婷婷五月天激情新地址| Av性爱网| 开心激情综合| 狠狠爱综合网| 在线播放中文字幕| 婷婷99中文字幕| 欧美综合五月丁香五月天| 亚洲AV成人片无码网站| 亚洲综合999| 天天日天天操天天干| 五月婷婷色播| 久久玖玖综合| 婷婷情爱五月天6| 成人无码精品1区2区3区免费看| 五月天停停日日| sewuyue第四色| 六月激情婷婷| 99色天堂| 婷婷五月综合在线| wwwss在线观看| www.天天干| 激情网 久久| 五月丁香怕怕综合| 亚洲精品字幕| 婷婷综合在线观看视频| 亚洲精品第一国产综合亚AV| 色丁香五月综合网| 4438全国最大视频成人网站在线观看| 天天干com| 影音先锋男人女人| 五月婷婷丁香狠狠撸久久| 青青青在线视频国产| 五月丁香福利| 搡BBBB搡BBB搡18| 六月婷婷色综合| 色婷婷五月天成人网| 五月丁香婷婷激情爱爱| 五月婷婷,狠狠操| 99色日本| www.五月天婷婷| 成人网址在线观看| 婷婷伊人綜合中文字幕小说| 五月丁香六月合| 搡BBBB搡BBB搡18| 九九热只有这里是精品| 日本色啪| 超碰93在线观看| 色婷婷久久综| 六月丁香五月婷婷| 久久久精品色色色| 中文字幕综合| 久久久网站| 五月天激情播播网| A片天天| 五月综合婷婷久久在线| 色哟哟性爱av| 五月丁香成人网| 五月丁香六月婷婷中合网| 中文字幕精品无码一区二区| 精品久久久人妻| www.久久色.com| 五月婷婷激情五月| 97色色色色色色色| 97超碰在线观看免费| 色婷狠狠| 人人草公开操| 日韩av在线播放综合网| 丁香婷婷基地| 亚洲激情色色| 色婷婷成人网| 国产午夜成人免费看片无遮挡| 99爱免费在线视频| 五月丁香琪琪| 婷婷色五月大香蕉在线| 另类精品视频在线观看| 天天干天天 亚洲| 色色色色色日韩午夜激情| 伊人网啪啪| 婷婷五月在线免费| 超碰免费电影| www.激情| 99热精品在线| 五月丁香久久呀| 黄色五月婷| 欧美婷婷日本| 天天精品视频在线观看视频| 色婷婷五月天av在线| 四季8848精品成人免费网站| 九九色99| 思思热精品在线| 成人丁香五月| 色婷成人狠干| 日韩野外 无套| 在线播放中文字幕| 欧洲色| 久久婷婷丁香五月一二三| 99视频综合网| 91人人人人人| 亚洲成人免费在线| 综合激情五月天| www.五月激情红色| 开心 五月 综合| 怡红院91a√| 午夜色婷婷| 玖玖资源在线视频| 日本激情五月天‘| 亚洲日韩26uuu| 91久久五月天| 婷婷基地成人五月天| 激情久久久| 日本爆乳片手机在线播放| 2025中文在线视频字幕免费观看| 欧美精品999| 精品热青草| 99热99在线| 久久色五月天激情小说| 国色天香伊人狠狠色| 婷婷丁香六月| 婷婷五月天激情网| 婷婷五月天激情小说| 丁香99| 99亚洲精品| 狼人久草| 99色视频| 亚洲精品99| 噜一噜在线| 另类激情五月天| www.日日日.com| 丁香花色色网| 五月天日日操夜夜操 | 婷婷 亚洲图片 丁香| 碰碰女| 9色免费网| 国产91在线视频| 最新高清无码专区| AV中文网| 成人va在线| 色哟呦av| 国产黄色大片| 怡春院久操| 九草性爱| 久9久9久9久9久9久9| 天天综合五月天| 激情综合婷婷久久| 超级碰碰碰97免费| 色婷五月天| 亚洲AV中文在线| 欧美日韩国产一区| 丁香无月在线观看| 久久在这里有精品| 色色五月婷婷丁香| 国产精品电影网| 97资源欧美日韩大香蕉超碰一区| 婷婷激情综合网| 99久.| 九九色影视| 色99网站| 欧美久久一级内射wwwwww.| 国产欧美熟妇另类久久久| 久久女婷| 男人的天堂在线婷婷| 亚洲婷婷丁香五月| 狠狠丁香| 《》【无码】想被搞到爽AV应募而来的超M素人 西纯子 10musume-011723-01 | 99久久五月丁香野外| 日韩无码性爱| www.超碰| 色欲资源网| 亚洲五月天婷婷在线| 五月花婷婷丁香| 5月婷婷激情网| 色婷婷五月综合| 久久九九@| 超碰成人电影| 五月综合激情久久| 色色免费网站| 九九在线这里只有精品视频 | 99操| 激情五月天激情综合网| 激情五月丁香五月| 9l视频自拍九色9l黑人| 99碰碰| site:901-07.com| 九九一综合精品| 婷婷五月天高清无码| 9月色婷婷| 99热在线观看| 婷婷五月天AV在| 婷婷香蕉| 激情五月天婷婷在线网址发给我| 欧美99热| 香蕉大综综综合久久| 激情五月综合网| 激情五月六月丁香| 99热最新| 日本三级中文字幕| 亚洲AV成人无码久久精品老人法拉利| 超碰人人操人人干| 色五月婷婷91在线| 午夜丁香六月婷| 色丁香五月| 婷婷五月影院| 亚州操操| 26uuu精品国产| 天天干天干| 人五月天婷婷喷水| 开心五月丁香综合久久| 久久婷婷综合网| 丁香五月狠狠在线观看| 激情五月图| 日日夜夜狠狠操| 涩涩涩五月天| 亚卅毛片| 综合久久五月天| 色综合色色| 久久久久久久久久久44| 开心五月天激情网站| 国产精品色色| 婷婷六月色开| 色狠狠999综合| 精品综合网在线| 色噜噜狠狠色综合无码久久欧美| 99热爱爱干干日| 婷婷五月天激情在线| 99∨VTV| 日韩高清成人| 久久大香蕉同僚| 月丁香久久久| se99视频| 区啪精品| 国产色色视频| 9伊人网| 夜夜操天天爽| 久久无意婷婷| 九九热视| 六月丁香狠狠爱| 五月天成人小说网| 五月丁香婷婷99| 久久久精久人妻| 能看的av| 色五月天中文字幕| 超碰v| 色婷婷内射| 五月激情站| 色综合久久综合中文综合网| 99热日本| 五月天国产成人| 操久久网| 这里都是精品99| 99视频内射三四| 日本啪啪天堂| 99热在线观看| 四色女婷婷| 91se精品国产| 国产精品人人妻人人爽| 婷婷狠狠18禁久久| 九九人人操| 99色在线观看免费| 久久精品凹凸分类| 久久婷婷视频| 婷婷丁香在线| 熟女人妻一区二区三区免费看 | 五月天成人在线播放丁香| 日韩黄色影院| 婷婷干五月综合在线播放| 久久丁香婷婷色情综合| 激情五月婷| 亚洲精品成人| 丁香综合| 丁香五月综合激情性爱| 五月丁香激情综合啪| 婷婷在线视频| 婷婷五月天综合久久| 五夜丁香| 国产人妻777人伦精品HD| 日韩按摩二区| 五月丁香在线观看99| 综合久久高清| 五月天综合区| 国产日韩av片| 99婷婷精品推荐在线视频| 激情五月婷婷色播网| 日韩成人综合| 日日日日日| 天天射天天射一道本日本社区 | 婷婷丁香五月天熟女丝袜| 久艹大香蕉| 亚洲精品va| 韩国中文字幕91| 26uuu在线观看| 在线成人网站| wuyuedingxiang| 精品成人在线观看| 五月丁香六月花| 97碰人人操| 极品少妇XXXX精品少妇偷拍| 丁香成人五月天| 婷婷丁香五月亚洲欧美| 婷婷伊人视婷婷婷| 欧美在线| 伊人激情啪啪| 婷婷伊人五月天| 91精品久久久久久77777| 亚洲日韩乱码一区二区三区四区| 另类视频五月天| 婷婷激情五月天激情在线| 亚洲成人在线观看网址| 亚洲精品无码一区二区| 色日本综合| 色婷婷五月基地在线| 色婷久| 少妇AB又爽又紧无码网站| 色五月天婷婷| 五月天婷婷五月| 色婷网| 婷婷丁香五月视频| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 开心五月婷婷激情| 五月婷婷视频在线观看| 五月天婷婷五月| 六月99天天婷婷激情综合| 97人人操人人操人人操人人| 五月天久久色| 国产真人做爰视频免费| 日本狠狠色| 91人碰| 免费视频这里只有精品| 九九热区一区二区三区| 色五月成人婷婷| 欧美日本国产欧美日本韩国99| 在线视频婷婷| 国产成人精品一区二三区熟女在线| 激情久久久久久久久| 99热这里只有的精品视| 色婷婷丁香五月天激情综合网| 91chinese在线| 日本123区日韩欧美不卡在线看| 成人做爰A片免费看视频| 超碰日日操| 六月色播| 99热这里只有精品22| www.狠狠操.com| 五月婷婷免费在线| 色综合夜夜| 九九九九国产| 五月天综合在线| 六月丁香六月婷婷欧美| 91婷婷色五月| 色婷婷WWW| 婷婷综合激情| 丁香婷婷综合激情五月色,开心五月丁香花综合网,激情综合五月亚洲婷婷,五月天 | 亚洲激情五月| 婷婷丁香六月天| 人妻人人操| 欧美激情综合| 色狠狠综合| 五月婷婷五月| 最近中文字幕2019视频1| 日本色色色| 九月婷婷综合八月丁香在线观看 | 欧美色色色色色色色| 欧美日本黄色| 五月天日日操夜夜操 | 亚洲综合视频在线| 大香蕉久| 五月天大香蕉av| 欧美性爱丁香五月| 丁香青青五月天| 成人网站高清无码| 亚洲色碰| 五月婷婷丁香五月亚洲色| 色色色视频免费无码| 99热这里只有精品10| 五月婷婷成人网首页| 亚洲射激情| 激情五月婷婷综合色播小说| 丁香婷婷影院| 五月激情婷婷丁香| 日韩精品无码一区二区| 久久久噜噜噜www成人| 97婷婷五月激情六月丁香伊人| www一起操在线观看| 超碰在线中文字幕| 久热这里这里有精品| 婷婷六月天精品| 色婷亚洲| 操操啪| 丁香婷婷五月份| 日本全黄一级999| 一级性感黄色内射视频| 思思热性操 | www婷婷| 亚洲精品字幕在线观看| 丁香97综合| 久九色| 九九热这里只有精品一| 欧洲亚洲免费视频9| 五月婷婷六月丁香| 97碰碰在线观看视频| 天天狠狠婷婷在线| 五月丁香亚洲综合| 亚洲成人综合在线| 色婷婷操逼网| 五月婷综合性中心| 97碰啪啪| 99情色五月天| 人人亚洲| 久久人人九| 中文毛片无遮挡高潮免费| 去色色五月天| 久久婷出差欧美色两性综合网| 激情五月婷婷五月| 99精品视频在线观看| 丁香五月婷婷五月| 久久婷婷五月天激情| 精品久久9| 国产av网| 狠狠色综合777| 国产精品成人AV在线| 国产成人综合电影| 色五月开心婷婷| 五月天婷婷成人| 欧美色五月| 亚洲性视频| 成人狠狠成人狠狠成人狠狠成人狠狠| www.yw尤物| 日韩精品无码AV| 五月天激情小说电影| 六月婷久久| 婷婷五月成人社区| 国产精品国产VA片国产| 99亚洲视频| 538任你爽视频不一样的| 色高清无码视频| 青草激情综合| 亚洲婷婷91丁香| 婷婷五月在线播放| www.色欲丁香婷婷| 五月色精品| 拍真实国产伦偷精品| 丁香六月婷婷综合激情欧美| 五月丁香婷婷色色| 亚洲啪啪网| 久草婷婷视频| 五月婷天天搞视频| 亚洲传媒在线观看| 久久机只有这里精品| 亚洲综合五月天| 久久激情视频| 99色热| 色色免费网站| 26uuu最新地址| 婷婷性爱网| 4399人妻无码久久久| 亚洲精品成人片在线播| 天天干电影| 性爱五月婷婷| 久9热视频| 91九色中文字幕女在线观看| 久9久成人精品视频| 丁香六月av| 婷婷婷婷婷婷婷五月丁香| 99精品丰满| 天天射色五月天| 婷婷五月天丁香综合网| 噜噜视频| 五月丁香成人| 天天舔天天爽| 开心婷婷五月花| 欧美三级巜人妻互换| 色婷五月丁香久亚洲| 刘玥av在线| 狠狠干青青草| 一级性感毛片| 人妻人人操| 久热只有这里有精品| 九九热精品| 婷婷五月综合在线视频| 综合久久综合综合| 五月停停色色丁香| 激情五月第四色| 色狠狠色噜噜AV天堂五区| 天天摸天天高潮天天爽| 婷婷99丁香| 久久精品婷婷| 婷婷爱综合| www,婷婷,com| 色婷婷a| 国产片天天爽夜夜爽| 日本人妻伦在线中文字幕| 亚洲综合婷婷六月丁香五月| 免费播放片大片| 五月天婷婷影院| 夜夜夜夜做天天天做无码视频| 九九婷婷热| 五月婷婷激情网| 九九热在线亚洲免费视频| 精品人妻在线免费观看| 97se视频在线| 亚洲激情视频网| 91丁香| 久久久久久人妻| 亚洲天堂aaa| 国产 亚洲 在线| 成人做爰高潮A片免费视频| 99视频网| 99热热九九| 欧美色色日韩| 国产偷人爽久久久久久老妇APP| 成人丁香婷婷| 久久激情综合| 亚洲 视频 导航 一区| 噼里啪啦在线观看免费完整版视频| 色五月亚洲开心网| 成人va在线观看视频| 大香蕉丁香婷婷| 天天干狠狠| 天天天天天天操| 色综合爱综合| 日本久久综合| 久草五月婷| 国产精产国品一二三在观看| 天堂中文国产| 99思思热只有在这里看| 五月欧美色播| 黑人无码一区| 99操不停| 日日爽日日| 成人超碰AV| 久久色五月| 日日操夜夜操不卡| 白人荫道BBWBBB大荫道| 99色亚洲| 婷婷丁香激情综合色情| 婷婷五月天激情诱惑| 99视频精品视频| 九九99九九99九九99视频网| se.久久视频在线观看| 51精品国自产在线| 欧美色色色| 色呦呦美女| 色五月婷婷在线观看| 久久婷婷五月天激情| 精品久色| 九九久久99| 激情久久久久久久久久久| 国内自拍97在线| 99精品成人无码A片观看金桔| www色色色com| AV在线大香蕉| 欧美97色| 久久9视频| 久久99热这里只频精品6学生| 天天操夜夜爱| 激情五月婷在线精品| 狠狠色狠狠鲁| 天天操天天操天天操| 亚洲精99| 欧美va国产va| 嫩草综合网| 五月丁香婷婷无码A∨| 亚洲精品va| 欧美日韩91| 热中文字幕| 天天舔天天插天天爱| 久久婷婷五月综合97色一本| 久久这里只有精彩| 久久五月天激情婷婷| 色婷婷内射| 久久五月人人摸| 天天做天天双| 战争与艾拉电影免费观看| 天天干天天色天天干| 夜夜撸天天日| 色五月婷婷五月| 婷婷成人AV| 99热日韩| 99精品国产在热久久| 香蕉AV777XXX色综合一区| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 婷婷色五月天色色| 久久狠狠干| 久er免费视频| 婷婷五月天AV激情| 婷婷五月天在线观看第二页| 天天爱天天做天天| 五月天色图| 五月激情天| 97碰碰草| 久久狠狠干| 久久视这里只有精品| 婷婷色系婷色| 天天草天天摸| 99re热视频这里只精品| 免费观看全黄做爰的视频| 五月婷婷伊| av激情在线| 色情五月天小说| 一级A片天天操夜夜操| 操一操干一干| 色婷婷网| 婷婷五月六月丁香| 青青.com| 婷婷五月天成人小说| 大香蕉精品视频| 亚洲精品字幕| 激情丁香六月| 国产另类综合| 激情综合自拍五月婷婷色五月| 97好吊操| 99热免| 欧美日韩一区二区三区四区| 爽极品色| 激情综合网 激情五月天| 综合网啪| 色婷婷伊人激情在线观看| 成人在线综合| 狠狠干青青草| 婷婷五月天小说网| 色站9/| 免费精品66| 操97免费超级视频| 97日本在线播放| 99色婷婷视频| 日日操日日撸| 日韩成人影片网站| 色婷婷五月影视| 99无码黄色视频| 99热成人| 亚洲色综合| 开心激情网五月天| 五月婷婷涩涩爱| 大香蕉伊人久久| 天天摸天天舔天天天天爽| 无码少妇高潮喷水A片免费| 久久久久亚洲AV无码网影音先锋| 亚洲精品国产精品乱码不99| 涩五月婷婷| 这里只有精品视频在线| 国内一级精品| 天天日天天爽夜夜爽| 双性美人被调教到喷水A片| 色播婷婷五月天| 日婷婷| 另类婷婷五月天啪帕帕| 丁香花五月天| 亚洲精品99| 丁香六月啪啪| 日韩成人无码人妻| 久久精品五月天| 久久精品视频在这里有| 五月天婷婷青青草| 婷婷五月天性| 国产午夜精品一区二区三区四区| 99热欧美在线观看| 这里只有精品视频99| 人妻久久婷婷| 97香蕉久久超级碰碰高清版| 九九性爱网| 激情五月天婷婷丁香| 久在线综合69| 天天操夜夜爽歪歪| 成人精品网站在线观看| SESE无码AV| 天天色中文字幕女优AV| 婷婷丁香五月天狠狠| 成人中文网| 在线色五月婷婷| 成人做爰A片免费看视频| 超碰人人摸人人操| 啪啪啪五月天| 男女啪啪视频久 9| 久99热| 五月天堂六月丁香亚州中文字幕久久| 欧美成人精品老美女噜噜噜| 久久婷婷网址| 永久精品| 日韩超碰在线| 丁香六月婷婷久久综合| 丁香5月激情网| 日本狠狠干| 99这里只有精品国产| 无码人妻少妇色欲AV一区二区| 婷婷六月丁香激情综合| 丁香婷婷成年| 强伦轩人妻一区二区电影| 色婷婷最新域名 | 国产乱码久久| 八戒青柠影视剧在线观看| 手机激情网| 五月丁香综合网| 啪啪操超碰| 丁香五月婷婷黑人妻黄色电影院| 99日韩| 五月综合激情综合久| 欧美A片在线视频免费观看| 成人开心五月天| 中文字幕人妻在线| 色9999日韩国产| www.夜夜.com| 日本97在线| 久久人妻视频| 99综合一区| 丁香五月情| 色婷五月天| 六月丁香影院| 免费婷婷| 思思re最新视频| 99精品视频免费观看| 97色婷婷成人综合在线观看| 亚洲亚洲人成综合网络| 丁香五月婷婷在线观看| 色碰碰视频| 久草婷婷网| 久久婷婷人人| 开心四月婷婷在线色播播| 久久久人人操A V| 99亚洲精品视频| 色丁香五月综合网| 五月天激情影院| 亚洲av| 超碰日日操| www.人人操人人看人人想人人摸 人人人人操,COM | 99激情在线| 激情二色月| 狠狠第四色| 无码少妇高潮喷水A片免费| 丁香婷婷六月| ji'qing'luan'ren'lun| 神马欧美精| 欧美精品在线观看| 五月停停色色丁香| 婷婷丁香激情五月天色色| 在线网黄| 啪啪色激情五月天| 狠狠操综合| 五月丁香六月婷婷成人电影| 日本熟妇人妻在线| 欧美日韩123| 99热香港| 婷婷五月丁香五月| 9l视频自拍9l九色9l成人| 天插天啪天啪天啪| 97操碰| 99在线视频女女视频| 国产肥白大熟妇BBBB视频| 99热1| 亚洲欧美一区二区三区爱爱动图 | 开心五月六月婷婷| 亚州综合色| 欧美 色婷婷| 亚洲黄色影视| 97碰| 亚洲中文乱字字幕在线永久| 思思热热久久| 亚州激情网站无码| 爱操人妻| 久热超碰91| 婷婷基地成人五月天| 国产午夜精品一区二区三区四区| 97天堂| 久久激情天堂| 五月丁香在线观看| 色永久| 在热视频精品| 亚洲色vA| 久久视频九九视频| 婷婷五月激情片| 新99色色色色色色| 六月丁香啪啪| 色五月激情网| 色婷视频| 91综合在线| 欧美影院婷婷| www超碰| 色五月网址| 久久激情五月| 色综合色| 性色欲情 网站| 欧美日韩一a.无| 五月丁香婷婷色| 91精品无码| 久久99操| 色婷婷五月天激情| 婷婷色女| 噜噜噜噜噜日本视频| 亚洲婷婷月丁香五月| 久久er九九| 五月天婷婷青青| 婷婷丁香一月| 99热只有这里才是精品| 婷婷激情五月天视频在线| 五月停停激情网| 99热精品中文字幕| 欧洲色| 性欧美日本| 九九精品热| 狠狠色婷婷| 成人.在线日韩| 超碰2021| 精品久久婷婷| 婷婷综合在线| 蜜桃婷婷丁香五月天狠狠久久综合| 桃色激情婷婷伊人网| 婷婷五月AV| 直接看的av| 成人在线网址| 国产精品国产成人国产三级| av操逼网| 9久9久| 大香蕉啪啪啪| 草AV9999| 99久热| 日日干天天| 内射 无码 伊人| 操逼巨乳91| 亚洲综人色综网| 五月丁香婷婷六月天| 日本色色色| 啊V视频在线观看| 无码成人AAAAA毛片AI换脸| 熟妇国产| 婷婷五月天黄色| 五月婷婷中文网| 丁香五月六月综合欧美| 国产无套精品一区二区| 国产AV一区二区三区日韩| 五月亭久久无码视频| 国产67194| 天天擼久久擼在线| 久久婷婷五月丁香网| 国产成人精品123区免费视频| 91成人看| 欧美在线视频99| 26uuu亚洲欧美| 99热国产精品| 久久5 9视频免费观看| 9人人操人人看| 怡红院院久久| 久久婷丁香五月| 婷婷中合| 在线日韩视频| 色色AV色色色东莞| 俺去也婷婷| 五月婷婷,狠狠操| 婷婷五月天亚洲天堂| 激情综合五月天| 青草视频在线观看视频| 91肏| 久久这里有精品视频| 另类激情中文| 五月丁香综合影院| 天天久久综合| 日日夜夜狠狠| 黄网在线观看免费| 丁香五月六月激情| 天天操夜夜操| 久久久久网站| 啪到高潮激情丁香五月| 色综合久| 嫩草视频在线观看| 天天做天天爱天天要| 日本乱子人伦在线视频| 欧美三级欧美一级| 亚洲视频色婷婷| 婷婷99综合| 丁香午月AV中文字幕| 26uuu丁香婷婷五月| www.夜夜爱.com| 色噜噜,噜噜色| 91狠狠综合久久| 色综合狠狠色| 久久久久久性爱视频| 婷婷五月丁香五月基地| 丁香五月AV在线| 99在线精品观看99| 极品色丁香| 99精品热| 五月开心啪啪| 五月婷婷丁香av| 天天操综合网| 激情网战码亚洲A| 色婷婷九月| 久久激情五月天| 五月开心色| 97婷婷五月| 丁香激情婷婷网| 亚洲妇女熟BBW| 色婷婷在线视频久| 九九综合久久| 精品国产人人爱人人| 伊人婷婷五月天| 激情另类综合| 99热老网站| 9热视频在线观看| 五月婷婷深深爱| 99九九热视频| 天天插天天干| 日本久久视频| 大香蕉五月丁香| 99热日韩| 五月丁香综合激情网| 国产韩日亚洲美州欧亚综合在线| 香蕉综合网| 久久最新色色色| 色九月| 啪啪啪五月天| 久久九九Com| 毛片色五月| aaaa.黄| 97色永久免费视频| 久久久99久久| 婷婷五月婷婷| 思思99热在线| 综合色五月亭亭| 天天舔天天摸视频| 大香AV| 91精品久久久久久77777| 天天干,天天舔| 国产一区二区三区影院| 色青五月天| 婷婷丁香黄色| 黄网免费观看| 精品视频这里只有精品| 国产99久久久国产精品免费看| 成年人99热| 九九热91| 五月婷婷激情综合网| 五月婷婷五月天激情视频| 五月天网址在线刘玥| 啪啪六月婷婷| WWW.久久久久久久| 五月天婷婷色色| 五月丁香欧美在线| 国产熟女大叫受不了| 99热在线播放| 五月开心激情网| 91成人看片| 99热这里只有精品8| 五月婷婷丁香狠狠撸久久| 九九干视频| www.夜夜操| 色婷婷www| 九九色精品| 激情色五月天| 超碰九九热| 26UUU欧美激情一区二区| 午夜免费高清AV片| 日日撸夜夜操| 99性爱视频网站| 婷婷伊人网| 91九色PORNY肉丝在线| 香蕉婷婷色五月| 五月天堂婷婷| www.婷婷.com| 精品久久久中文字幕大豆网推荐理由| 五月丁香六月婷婷色情| 亚洲激情无码久久| 秋霞少妇毛片| 99热这里是精品| 激情五月综合婷婷| 六月综和久久| 久久久久网站| 婷婷五月在线影院| 热九九精品| 五月丁香婷婷成人综合网| 五月天婷婷影院| 高清免费在线视频| 日日日日日| 色综合五月| 美女激情婷婷| 日韩欧美一级大黄网站| 狠狠色噜噜狠狠亚洲A∨| 99热欧美| 五月丁香天天| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 人妻久久久久久久 | 极骚大香蕉伊人| 五月婷婷之综合激情| 色亭亭五月天丁香综合AV - 百度 - 百度| 开心五月天私房婷婷| 亚洲乱码w在线观看| 久久五月天激情| 婷婷五月激情图片| 婷婷激情视频| 九九热视频精品| 久久久五月激| 激情五月天婷婷免费观看| 99久操| 午夜在线成人网站免费观看| 99久久网站| 一区视频网站| jiZZdr| 婷婷综合爱| 五月天婷婷激情干干| 婷婷五月大| 99ri久久| 激情五月综合久久| 九热视频免费观看| 97碰碰叉| 激情综合网激情五月婷婷| 九九热视频在线观看| 色五月婷婷丁香五月| 婷婷欧美综合| 看全色黄大色大片| 亚洲六月婷婷| 婷婷五月天电影网| 99热无码首页| 色色综合网络| 97婷婷五月| www夜夜操comwww| 岛国av电影网站| 五月天婷a| 五月婷丁香亚洲| 成人狠狠成人狠狠成人狠狠成人狠狠| 丁香五月婷婷丫| 噜噜综合网| 久久狠狠色| 桃色激情婷婷伊人网| 激情五月激情综合网一级丸片| 金桔一区二区ab地址| www.激情.com.| 五月丁香日本在线视频观看| 思思色播| 综合xx网| caopeng97日韩| 五月婷婷色情| 亚洲激情精品| 婷婷开心五月| 5五月综合网亚洲| 99亚洲视频| 色婷婷视频| 伊人大香蕉综合在线| 另类图片五月激情| 国产精品岛国片在线观看免费| 丁香五月手机视频| 日本97在线| 五月天堂色| 高清无码.com| 五月天色综合服务平台| 26uuu欧美亚洲日韩| 日本在线噜噜| 激情五月天婷婷五月天| 久9久成人精品视频| 婷婷五月情| 九九性视频| 丁香五月激情久久麻豆| 久久五月婷综合网| 色天堂在线| 色婷婷色五月另类综合| 丁香伊人综合| 婷婷深爱五月| 婷婷伊人网| 欧美交换配乱吟粗大25P| 五月婷婷av在线| 久xxxx| 六月丁香久久| 伊人天天色| 婷婷va| 丁香色婷婷| 国产黄大片在线观看画质优化| 就去色色五月丁香婷婷久久久| 色婷婷色综合激情91| 五月丁香啪| 婷婷激情丁五月| 久久综合五月天| 色五月首页| 亚洲网站观看视频| Www.狠狠| 婷婷色五月婷婷姐妹| 婷婷中文字暮| 中文字幕视频在线播放| 婷婷五月天福利| se.久久视频在线观看| 婷婷五月天在线看| 色情五月天A片| 婷婷五月丁香综合| 超碰在线免费观看日韩| 超碰猛烈的性猛交| 在线五月色播| 97色操| 98国产精品综合一区二区三区 | 五月婷婷中文字幕AV| 99热这里只有精品在线观看| 91色五月在线观看| 日本三级黄色大片| 天天干天天爽天天操| 中文字幕AV在线播放| AV中文网| 久久综合九九| 婷婷五月六| 中文字幕日产A片在线看| 偷偷操99| 色久综合天天做视频| 久久综合人妻| 婷婷五月天AV在| 天天爱天天做综合| 99热青青草| 久久免费干| 99爱免费在线观看| 伊人网啪啪| 91呦呦呦| 凹凸7777操操操| 26.uuu丁香五月婷婷| 99色人| 婷婷在线五月天观看| 久久婷婷综| 一级性感毛片| 欧美va| 天天做天天爽| 色情久久久| 婷婷五月天色播| 激情涩播| 婷婷六月丁香激情综合| 久久五月丁香| 色天使色婷婷| 五月婷六月| 丁香九月激情在线视频| 99综合婷婷五月| 婷婷激情图片| 九九热中文| 日本久久人| 欧美久人人| 婷婷.com| 色色999三级片| 亚洲五月婷天天操| 六月丁香婷| 狠狠色色| 亚洲精品视频在线| 五月婷婷深深爱| 女人天堂AV| 九九超日本| 五月综合婷婷五月| 婷婷五月天渟渟| 2025年最新亚洲在线欧美| 日韩成人中文| 精品人妻久久久| 五月天开心网| 婷婷丁香午夜综合影视| 日本色婷婷| 色热久资源| 亚洲天堂热| 开心深爱五月天| 婷婷视频网| 色噜噜伊人| 久99视频在线观看| 成人丁香| 九九干视频| 亚欧州精品视频| 丁香六月狠狠干| 香蕉综合在线| 精品久色| 人妻av在线| 5月丁香综合网| 国产性爱在线| 亚洲激情综合免费| 五月天婷婷激情在线色图| 婷婷激情视频|