亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

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干嘛的”之前先別急著搜配置教程先給結(jié)論Tomcat不只是一個“能跑Java Web應用的軟件”它本質(zhì)上是兩個東西疊在一起——一個HTTP服務器一個Servlet容器。HTTP服務器這層負責監(jiān)聽Tomcat端口默認8080把瀏覽器發(fā)過來的TCP字節(jié)流解析成符合HTTP協(xié)議的請求把服務器返回的數(shù)據(jù)封裝成HTTP響應寫回Socket。Servlet容器這層負責加載你寫的Servlet類、解析web.xml里的映射配置、按請求路徑找到對應的類并調(diào)用它的service/doGet/doPost方法然后把結(jié)果交回HTTP服務器層。很多開發(fā)干了幾年每天在用Tomcat卻說不出這兩個層次。你問“Tomcat干嘛的”他們只能回答“部署war包的”。這不是他們的鍋因為日常開發(fā)里Tomcat被IDE藏得太好了點一下啟動按鈕日志一刷應用就起來了中間發(fā)生了什么完全不可見。手寫一遍就是強制自己把這層包裝撕掉去看真正的報文、真正的類加載、真正的Socket讀寫。我給自己定的目標是寫一個MiniTomcat能做到——啟動后監(jiān)聽指定端口訪問靜態(tài)HTML和圖片能正確返回能解析web.xml能加載并調(diào)用Servlet能模擬Tomcat的類加載器隔離機制。難度不大但每一步都要親手造輪子這比讀十遍源碼都有用。1.2 一個人手寫Tomcat需要先劃清三大邊界寫之前最容易犯的錯誤是“什么都要做”。Session、Filter、WebSocket、HTTPS、NIO、War熱部署……如果第一版就把這些全塞進去你會陷入無窮無盡的細節(jié)最后什么都寫不完。我劃分的邊界是第一版只做“通信與協(xié)議層”也就是Socket監(jiān)聽、HTTP請求解析、HTTP響應封裝第二層做“容器與路由層”也就是Servlet映射、反射調(diào)用、靜態(tài)資源分發(fā)第三層做“類加載與部署層”也就是WebAppClassLoader、web.xml加載、熱部署的簡化實現(xiàn)。這三層恰好對應Tomcat源碼里的Connector和Container兩大核心組件也對應JVM類加載體系。先跑通這三層MiniTomcat已經(jīng)能回答“Tomcat啟動后發(fā)生了什么”這個問題。Session、Filter這些后面想要都是在Servlet調(diào)用鏈上加攔截器或上下文對象不是第一版的核心矛盾。2. 動手前的關鍵決策把功能拆成Connector、Container和Loader三塊2.1 功能模塊拆解誰來監(jiān)聽端口誰來處理請求誰來加載類我設計的第一版類結(jié)構非常簡單總共分四組互相之間的依賴關系也清晰模塊職責核心類啟動入口初始化配置、綁定端口、開啟事件循環(huán)BootstrapConnector層把Socket字節(jié)流轉(zhuǎn)成HttpRequest對象把處理結(jié)果寫回SocketHttpRequest、HttpResponse、RequestParserContainer層判斷請求是靜態(tài)資源還是Servlet分別處理StaticResourceProcessor、ServletProcessorLoader層解析web.xml、加載Servlet類、實現(xiàn)類加載隔離WebConfig、WebAppClassLoader這個分組其實就是Tomcat源碼結(jié)構的縮小版。Tomcat里Connector負責協(xié)議解析和網(wǎng)絡通信Container負責調(diào)用鏈處理WebappClassLoader負責應用隔離。我不需要引入Spring那套容器概念一個請求從Socket進來落到對應的Processor上就已經(jīng)能解釋Tomcat八成的運行邏輯了。2.2 工程骨架哪些類放在哪里我建議工程結(jié)構長這樣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調(diào)用鏈。原因很實際濾器的核心是在Servlet前后插入一段代碼Session的核心是在請求里維護一個客戶端標識它們在Tomcat架構里屬于Context組件上的附屬設施而不是地基。真正的地基是“Socket變成請求對象請求路徑變成類調(diào)用”這條主線。如果第一版就糾纏Session的過期策略、Cookie寫到哪個域你會煩躁到懷疑人生。先把地基夯好Filter和Session都是往調(diào)用鏈上掛一段邏輯而已。3. 請求解析拿Socket流還原出真實的HTTP請求3.1 HttpRequest解析請求行、請求頭、請求體Tomcat處理請求的第一件事就是把Socket輸入流里的字節(jié)還原成一個結(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內(nèi)部維護了一個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響應的時候會漏掉它結(jié)果瀏覽器一直轉(zhuǎn)圈因為不知道響應體在哪里結(jié)束。我的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)一先轉(zhuǎn)字節(jié)再寫OutputStream不要用Writer去寫否則字符編碼會截斷字節(jié)。3.4 靜態(tài)資源解析與路徑穿越攔截靜態(tài)資源是最容易先跑通的部分。StaticResourceProcessor做的事很簡單把URI映射到webroot/static目錄下的文件存在的文件返回內(nèi)容不存在的返回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映射與調(diào)用反射拿到類執(zhí)行完整的Servlet生命周期4.1 用web.xml描述路由容器按圖找類真實Tomcat通過web.xml把URL路徑和Servlet類綁定起來。手寫版我直接用JDK內(nèi)置的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ù)結(jié)構時就要把“路徑可能帶通配符”考慮進去不要等第二版重構結(jié)構。4.2 ServletProcessor反射實例化與service調(diào)用我現(xiàn)在定義一個極簡Servlet接口避免引入完整Servlet API的依賴public interface MiniServlet { void service(HttpRequest request, HttpResponse response) throws IOException; }ServletProcessor拿到路徑后從WebConfig找Servlet類名再加載、實例化、調(diào)用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內(nèi)部維護一個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加載完成后、容器調(diào)用無參構造器創(chuàng)建Servlet實例的過程。如果類構造函數(shù)拋異常或者類沒有無參構造器這里的異常鏈會非常長排查時要從根因看Caused by而不是盯著最外層。4.3 生命周期、異常與500響應Tomcat里Servlet有完整生命周期init初始化、service處理請求、destroy銷毀。手寫版我在加載實例后立刻調(diào)用一次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處理異常的思路容器負責捕獲異常并轉(zhuǎn)換為標準錯誤響應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可能破壞整個體系本地找不到類時最后調(diào)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路徑本質(zhì)上就是告訴這個啟動類端口是多少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結(jié)果發(fā)現(xiàn)一個明顯問題如果一個請求處理耗時很久比如Servlet里去訪問了一個慢數(shù)據(jù)庫后面的請求全部排隊整個服務相當于卡死。后來改成每連接一線程問題又來了線程數(shù)量沒有上限幾百個并發(fā)就把內(nèi)存打爆。最終采用固定大小線程池也就是你在Bootstrap里看到的Executors.newFixedThreadPool(16)。Tomcat真正生產(chǎn)環(huán)境的線程池參數(shù)更復雜要配核心線程數(shù)、最大線程數(shù)、隊列容量、拒絕策略。手寫版用固定線程池雖然粗糙但足夠說明“連接接入和業(yè)務處理要解耦”這個核心思想。這里有個值得注意的小知識線程池不是越大越好。每個線程要占約1MB左右的??臻g如果TCP連接都是長連接線程池會被根本不發(fā)請求的空閑連接長期占滿。這也是Tomcat后來轉(zhuǎn)向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)看起來簡單它埋了一個隱患如果客戶端連接保活但遲遲不發(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過濾配置文件里??吹絉emoteAddrValve或者RemoteHostValve只放行127\.0\.0\.1或者內(nèi)網(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或內(nèi)網(wǎng)網(wǎng)卡上不暴露到外網(wǎng)。Tomcat的做法也是類似的思路——manager接口和業(yè)務接口同居一個端口但用Valve做第一層攔截。理解了這個你就知道“限制IP”不是Tomcat在給用戶添麻煩而是在做正確的事。如果你也想照著這個思路手寫一遍我的建議是從靜態(tài)文件開始不要一上來就寫類加載器。先用最簡單的Socket解析一個GET請求把靜態(tài)頁面返回成功再逐步加Servlet映射、web.xml、ClassLoader最后再碰并發(fā)和部署管理。調(diào)試時多用curl -v、telnet 8080手工發(fā)HTTP報文看原始流量能幫你肉眼確認每一行響應頭是否正確。先跑通再說別的——這句話放在幾乎所有中間件學習上都成立。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
国产9l 大屁股| 日本丝袜美腿人妻九九| 日日AV加勒比| 亚洲免费在线探花| 国产欧美成人精品| 久久AV无码网址| 激情五月天中文字幕色| 久久 国产精品 一区| 大香蕉青青9| 欧美精品一区二区少妇免费A片| 色综合美国| 欧美日韩中文字幕不卡| 天天操天天插| 天天干18禁| 密桃99999| 亚洲一区二区AV| 99免费在线视频| 草B在线| 人妻加勒比东京热| 五月天我淫我色av| 日韩欧美中文字亚洲慕| 大香蕉啪啪网| 国产欧美日韩女同性恋ww喷水精品 | 久久精品操| 中文字幕91页| 91少妇高潮| 99热最新网址| 亚洲乱色熟女一区| 97在线资源| 秋霞蝌科网日本一区| 熟妇激情| 六月婷婷激情| 激情抓乳插进去啪啪啪日韩| 久久久9 9 9精品| 99精品久久久久久久婷婷蜜桃| 后入综合久久| 亚洲美欧999| 久久国产热视频97电影| 亚洲丨在线| 久久久久久久久久久人妻| 91春色| 99青青草国产视频| www.色操逼| 国产自制av蜜乳| 亚洲自拍另类丝袜综合| JULIA一区二区三区在线播放| 国产91丝袜 在线播放| 亚洲大色堂| 日韩中文字幕人妻视频| 激情欧美97| 刺激精品视频| 丁香六月啪啪| 精品国产91内射久久| 一级黄碟| 啊啊啊啊啊操我视频| 日本免费专区| 放黄片放3级黄片没穿衣服| 美腿丝袜高跟网免费视频免费视频| 国产欧美一级在线观看| 激情一区二区| 97欧美日韩精品| 97人人爱人人做人人乐| 久草午夜| 亚洲极品| 欧美日韩人妻婷婷一区| 日日A∨| 五月婷婷激情| 久99| 91久久精品中文字幕| 校园春色五月天| 国产欧洲精品亚洲午夜拍精品| 丝袜熟女2P| 操逼日韩无码| 国产AV毛片| 日韩啊V| 超碰超碰超碰超碰的大鸡吧操黑丝袜| 亚洲精品白丝| 中文字幕久久精视频久久大全| 成年女人18级毛片毛片免费观看| 美女熟妇色| 日本亚洲嫩草影院啪啪| 国产黑白丝在线| 诱惑人妻欧美一区在线播放| 天天欧美欧美亚洲网| 抽插无码高清一区| 午夜寂寞欧美| 亚洲日韩美女中文字幕乱| 日本东京热久久久电影| 久久久亚洲熟妇熟女| 天天操福利视频综合网站| 熟妇人妻一区二区三在线| 第45页一区二区| 久久精精区一区二区一蜜桃一区二区| 伊人久久艹| 精品视频免费在线一区| a片亚洲一本通视频| 麻豆精品久久久久久久| 欧美性爱一区二区三区四区| 久久久久久久久久久久久9999| 日本片日本片祼观看网站在线看中文版网页在线看 | 久久熟女人| 色色婷婷丁香| Julia在线播放亚洲久久| 九月丁香婷婷| 污啪啪啪视频| 久久熟女人| 骚货人妻偷情自拍在线视频| Julia在线播放亚洲久久| 久久男女激情视频网站| 婷婷综合在线观看| 国产精品天干天干综合网麻豆| 四虎AV影视国产精品亚洲精品| 老色69| 亚洲无套久久嗯嗯| 日本精品人妻少妇一区二区| 啊啊啊好湿国产一二| 久操99| 日韩懂色网| 午夜欧美J进J出白浆流出久久久| 99国产精品免费| 5252色欧美在线| 97干色天堂| 97一区二区三区视频| 无码国产Av| 狠狠操夜夜| 9久久久久| 亚洲精品乱码线路中文字幕| 午夜偷拍久久熟女| h在线看免费版在线看| 久久久com| 久久九精品| 九九九偷拍| 91丨人妻丨国产丨丝袜| 1级午夜影院费免区| 国产特级毛片AAAAAA高潮流水| 一区二区三区 日韩欧美| 日韩性爱播放| 啊啊啊啊啊啊啊国| 日本加勒比无码专区一二三| 96精品久久久久久久久久| AV麻豆免费一区| 亚洲国产婷婷在线播放| 五月婷色| 日日日骚女人精品| 欧美人妻少妇| 亚洲最大的综合性av| 婷婷色导航| 欧美老妇综合网| 久久久久久久久女黄| 亚洲av青草久久一区二区| 亚洲图片色图欧美另类| 天天爽夜夜操| 2019午夜福利视频| 欧美性爱一内片一区二区三区| 欧美爆操91| 亚洲激情深爱文学小说网站| 亚洲av影音先锋| 欧美 亚洲 制服 精品| 96免费视频在线| 欧洲自拍第一页| 高清国产精品福利网站| 亚洲精品视频二区| 老熟女阿 国产91| 中文字幕,人妻,日韩| 东京热亚洲一区二区| 青青伊人久久| 日韩免费在线观看不卡| 色婷婷视频| 国产亚洲精品美女| 日韩高清黄片| 有码免费观看| 欧美福利视频啊啊啊啊| 国产黄a三级三级三级av在线看| 九一性生活免费视频| 97久久网| 久都青青视频| 美女91AV| 五月婷婷综合激情| 久久天堂网| 日韩欧美大力操| 96精品在线| 97精品一区二区视频在线观看| 啪啪性爱免费视频| 91天美传媒精品| 另类综合另类| 97香蕉网| 久9久| 韩国一级做a久久久久| 人妻久久久久久| AV久日| 欧美人妻精品一区二区| 97AV在线免费观看| 岛园激情| 久久久精品九| 中文字幕精品一区二区精品| 3PAV乱伦视频| 美日韩一卡二卡三卡免费人妻精品| 91色插| 91精品丝袜久久久久久| 欧美日韩亚洲少妇寂寞影院正在播放| 日韩女模中文造逼| 97资源站国产精品| 麻豆人妻精品一区二区| 91久久久久久久久18| 99综合免费视频| 欧美色老汉| 国产成人自拍视频在线| 亚洲情色欧美| 国产九区| www.夜夜操| 亚洲中字幕日本一区二区三区| 欧美熟妇视频| 95自拍视频在线观看| 日韩精品人妻中文字有码在线| 国产精品久久久久久久AV大片| 91午夜无码| 情色五月天久久久| 欧美日韩国产高清在线一二三区 | 久久九九精品一区二区| 久久香蕉网| 啊啊啊在线观看| 性色国产东北露脸精品视频| 黄色一区二区秘书性感| 大逼色网站| 精品久久久久,69国产成人精| 电家庭影院午夜69久久夜色精品国产69乱| 91jk色拍| 蜜乳AV色欲AVAV无码| 久久精品久久久久久久| 欧美影音在线| 手机av天堂久久久久| 无码精品久久| 天天综合网网欲色| av 模特一区了| 99视频精品| 国产内射爽爽大片| 福利五区| 欧美黄色图片| 超碰在线人妻| 美女写真| 乱欲视频| 一级免费精品| www.高清无码诱惑一区.com| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 色网站导航大全| 囯产精品强| 激情开心五月天| 无码直播久久久| 9久9久9久9久视频网站| 都市激情人妻一区二区青青操视频| 国产精品无码AV网站| 老司机福利青青草| 丝袜美腿91| 屌妞视频久久久久久久久久久久| 91操操| 成人三一级一片aaa| 大香蕉伊人75| 男人的天堂com| 久草资源欧美在线视频| 日韩精品一区二区三区四虎影视| 国产成人亚洲精品无码古代早漏男 | 欧美超碰9798| 色色色色网站| 95自拍视频在线观看| 综合色一区三区二区| 91强在线播放| 91美女在线看| 欧美图片色综合| 大香蕉啪啪啪| 九九无码视频| 熟女六十路| 亚洲精品xxx| 国产精品午夜AV完会免费| 日本大香蕉综合网红本杳社区| 玖玖爱一区在线| 国产不卡精品91| 十八禁啪啦拍视频无遮挡| 天天艹天天日| 成人97人人超碰人人| 日韩大香蕉| 久久久555| 超碰97极品9| 狠狠做深爱婷婷久久二区| 欧美色图片91| 国精品一区二区三| 伊人久久大香蕉线AV五月天| 99re3这里只有精品| 五月婷婷丁香六月| 精品超碰中文在线| 七久久久| 国产精品高潮久久AV| 中文字幕片| 中文字幕加勒比海高清无码免费视频| 亚洲91网。| av大香蕉网站| 狠狠躁天天躁日日躁| 亚洲五区熟女| 欧美亚洲se91| 少妇久久久免费| 亚洲少妇激情一区二区三区| 一本大道久| 国产乱码久久久| 一二三区视频在线观看| 美女91在线| 欧美AB在线| 国产精品第一页国产大屁股视频免费区| 玖玖综合网| 午夜精品久久99蜜桃的功能章节| 操国产高清| 亚洲精品国语在线播放| 91呆哥人妻| 久久久一级| 天堂日本亚洲欧美| 亚洲污污网站| 偷拍导航视频网站| 欧美精品久久久久久久丰满| 国产毛片在线| AA丁香综合激情| 婷婷情色综合网| 亚洲欧美中日韩| 96国产污污污丝袜| av橘色网站| 中文字幕三四区| 另类亚洲一区二区三区| 亚洲乱码尤物193YW| 欧美黄页在线| 加勒比海成人视频网 | 有码免费观看| 天天大干大香蕉| 色噜噜国产精品视频一区二区| 亚洲精品97| 国产成年免费大片黄在线观看| 国产麻豆一级精品视频| 97色色色综合网站| 日韩三级av片| 日韩无码精品综合久久| 久久激情视频| 久久久久久久久久久999| 日产精品久久久一区二区| 一区二区乱码福利| av天堂手机版追回| 久久精品老司| 日韩性爱小视频| 啪啪免费| 成人久久无码www| 国产精品午夜精品| 久久欲| 中文字幕 码 自拍 视频 区| 熟妇人妻一区二区三在线| 无码粉嫩白虎一线天b区| 99亚洲国产精品色一区二区三区| 强奸a片网| 香港日本韩国人妇99www.wccm20| 久久激情婷婷| 久久久夜夜嗨免费视频| 青青草白白色| 被男人吃奶很爽的毛片| 人人手机欧洲亚洲国产人妻| av2014 日韩在线中文字幕| 国产91亚洲精品一区二区三区| 91啪啪视频| 99精品高潮| 天天看天天日天天操| 黄片免费看黄片免费看| 亚洲和欧美裸体美女双飞视频| 久久久久久久97| 全免费a敌肛交毛片免费| 亚州再线| 20cm女自慰在线日韩欧美| 五月丁香啪啪网| 91N综合网在线| 在线观看不卡一区二区三区| 国产欧美日韩在线观看麻豆传媒公司 | 色欲久久综合| 夜夜黄| 人妻一区视频| 午夜福利区| 欧美性爽xyxOOOO| 成人五月香网在线| 人人妻人人玩人人澡人人爽| 久久九九99| 91N综合网| 久久 国产精品 一区| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 日韩一999精品| 久久久久久中文| 国产精品久久久久久久毛片1| 夜夜狼人妻| 婷婷婷婷婷婷久久久久| 吉川爱美98堂在线| 亚洲国产欧美另类自拍| 久久 久久国内精品亚洲| 日韩卡一卡二卡三在线| 青青青草伊人精品| 免费A V在线| 一本大道久| 色激情五月天| 青春草莓视频在线观看网址| 亚洲熟女综合| 久操网无码在线| 国产第二页| 国产www色在线观看| AV男人天堂网| 天天摸天天插天天日| 中英熟女操女| 国产一区二区久久| 国产女人成人精品视频| 久久久久久久9| 九九视品黄色| 国产女人和拘做爰视频| 国产白丝网站| 99999精品视频| 国产无马在线| 精品国产乱码久久久影院| 伊人99热| 日韩激情无码影院| 男人的天堂无码| 超碰人人草| 九九九免费视频| 青草香蕉网| 国产真实野战在线视频| 熟妇一区二区| 97日视频| 激情五月丁香五月| 欧美不卡在线一区二区| 熟女露脸激情自拍视频| 91亚·色| 青草青草久热| 亚洲**2021在线观看| 中文一区在线日| 日本国产亚洲一区在线观看| 五月天激情小说| 97最新在线播放视频| 久久人妻少妇| renqi久久久久久久久久久久| 亚洲中文字幕在现观看| 日本最新1区2区3区| 98一区二区精品| 日本三级一区二区 在线| 精品熟妇视频一区二区| 97免费视频网| 日韩啪啪啪啪啪| 激情五月天插| 一区二区三| 色悠久久久av| 中文字幕版| 另类图片五月天| 欧美国产欧美在线观看| 凹凸视频在线一区二区| 国产精品久久久亚洲第一牛牛_在线观看 | 欧美性爱中文字幕无线码| 国产视频第二页| x97av| 精产国品一区二三产品| 97中文超碰| 曰韩av中文字幕专区| 影音先锋日本一区二区| 97亚洲精品超碰| 欧美日韩97在线| 久久熟妇五十路一区| 亚洲激情AV| 人人操人人大香蕉| 伊人影院综合是一个与深夜成人在线| 精品人妻中文字幕4399| 国产黄色在线播放观看| 私人尤物在线精品不卡| 9999久久久| 少妇精品| 国产路线专区| 精品人妻一区二区三区不卡断| 嗯嗯啊啊好大好爽| 欧美综合制服在线| 91丝袜激情在线| 欧美性暴力猛交XXXX | 无码免费精品高清| 特级毛片特黄久久免费看| 国产美女销魂在线观看不卡| 2023天天操夜夜操| 久久性爱视频免费看| 大色综合| 丝袜人妻av一区二区| 欧美日韩97| 激情小说亚洲| 天天干天天操天天操夜夜操天天操 | 亚洲免费精品一区| 欧美中文字幕男人天堂久久精品| 校园春色制服丝袜中文字亚洲| 在线日韩视频| 亚洲五月丁香花狠狠干一区二区三区| 男人天堂2019亚洲| 嗯嗯啊啊用力视频免费| 四季AV综合网址| 日韩不卡码| 伊人aaa| 久久久久久少妇| 欧美日韩精品青青| 综合亚洲欧美| 久久精品国产Aⅴ| 男女日B国产| 老司机天天操| 国内精品久久久久影院亚洲| 欧美日不卡| 德国一二三不卡| 97精品第3页| 色阁阁AV综合网| 中文字幕午夜精品久久久| 超碰超碰超碰超碰的大鸡吧操黑丝袜| 亚洲性天堂| av毛片aaaaa免费看| 天天综合网日韩7799| 97任你吞精| 亚州伊人色综台| 天天爽夜夜欢视| 亚洲色图自拍| 九七色图| 波多野结衣被操50分钟免费视频| 国模精品娜娜一二三区| 99久久久无码| 91精品人妻啪啪间| 97色亚洲| 亚洲超碰AV| 日韩亚洲美州欧洲综三区一品在线| 久久的网站啊啊啊啊啊| 青青青草伊人精品| 天天上日日上日韩精品| 九九探花视频在线观看| 久久国产99精品72福利| 在线五区| 美国日韩黄片| 国产精品电| 久久狠狠色噜噜狠狠狠狠97| 天天天天天天天天天天干美女 | 国产精品久久妻无码网站| 亚洲少妇综合在线播放| 丝袜六区| 少妇蹲下买菜露大唇0| 欧美日本成人一区二区| 日本在线播放不卡一区| 国产一区麻豆免费观看| 超碰九区| 亚洲欧美中文日韩视频中国语| 丝袜性亚洲| 人妻熟女一区二区在线视频| 久操网视频| 男女打扑克高清网站| 久久女女| 视频国产精品未满十八禁止在线观看| 老色69| 在线播放欧洲免费av| 一级片在线观看高清无码| 91黑丝在线播放| 日韩精品一区,二区 九九...老司机| 久久的免费性爱视频| 99熟女| 久男人久久| 一本大道不卡一二三区| 亚洲综合在线高清| 啊啊啊好想要| 婷婷五月天成人网| 91熟女视频网| 国人欧美精品一区二区| 嗯嗯啊啊好疼| 亚洲成人性爱网站在线播放| 97国伦国色| 啊啊啊在线观看| 日韩人妻资源在线看| 大香交| 国精精品无码一二三区水多多| 四虎884a| 亚洲小电影免费涩涩成人在线高清| 欧美大码在线视频| 97干在线| 九九热免费国产视频婷婷伊人五月 | 成人日本精品九区| 摸奶性爱视频网站在线免费播放| 亚洲欧美九九| 秋霞午夜成人福利片片| 岛国小电影| 9色国产精品一区粉嫩| 黄色大片一区二区密桃丝袜| 女人天堂av在线播放| 青青国产精品在线| 加勒比综合| 狼人综合婷婷激情四射 | 天天天堂影视日韩亚洲91| 日本 色 导航| 中文一区二区| 99色天堂| 一区二区三| 熟女一区二区| 大香焦A片| 久久偷偷色综合蜜桃| 手机在线看片免费人成视频| 亚州五月| 久久男人的天堂国产| av三级电影在线播放| 人人操天天爽| 男女激情黄色网址| 婷婷8月天青娱乐| 亚州少妇| 免费1级a做爰片观看| 男人的天堂无码| 97人人射| 久久精品人人做人人看| 亚洲熟女乱色一区二区三区久久久 | 日比av无码| 天天干一区二区| 亚洲精品国产熟女| 这里只有97精品| 啪啪视频mP4| 操逼片国产| 伊人欧美大香蕉视频| 96久久科窝| 性色生活片久久毛片婬片免费放女人一级毛片 | 久草免费在线一区二区| 97资源久久| 大香蕉在线视频重口味毛片在线| 黄色欧美性爱视频| 蜜臀久久99精品久久久久久-DVD原版全| 九九十八精品| 女人被添高潮免费视频| 女性喷水高潮在线观看| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 99精品久久| 国产精品久久久久久高清无码免费看| 精品无码产区一区二| 天天日老熟妇| 亚洲一区二区性爱电影| www熟女乱伦com| 亚洲有薄码区久久在线一区| 夜夜騷av、一區二區| 凹凸视频特色日本特黄| 最新岛国大片| 国产精品久久| 欧美午夜熟妇黑人精品91| 人人综合| 亚洲精品一区中文字幕乱码| 久久久国产亚洲精品系列| 亚洲欧美人妻| 欧美成人贴图| 精国久久一区二区三区98| 久久精品人体| 久久九九综合| 伊人久操| 超碰成人公开| 一道α片欧美| 校园春色亚洲| 日日摸日日碰夜夜爽视频| 1024午夜激情男人的天堂| 欧美欲色| 97精品国产97久久久久久免费| 欧美成人一区二区三区在线播放| 91精品微拍福利| 天天澡天天爽日日AV| 一二三区视频在线观看| 熟女熟妇伦久久影院毛片一区二区| 台湾大香蕉99热| 91狠狠综合久久久久久| 一区二区 韩日AV| 中文字幕日本久久| 久久久久国产精品片区无码直播| 国产日韩区| 伊人五月天婷婷| 亚洲欧美一区二区网址| 探花精品 一区二区| 欧美色网络| 熟女91网站| 欧美伊人电影| 性欧美91| 伊人91| 69一区二区三区 | 亚洲图片在线| 中字一区| 人妻少妇久久| 久久久精品九| 久久黄黄黄| 91岛国动作片| 午夜操一操| 日本精品一级二级三级| 亚洲一区在线观看欧洲| 欧美区亚洲区偷拍区| 91成人高清在线观看| 精品国产无码中文| 国产高清免费不卡av| 欧美不卡二区| 99精品成人免费看| 一起草AV| 欧美另类色| 激情亚洲天堂| 999熟女精品| 国产精品一区二区麻豆| 欧美偷拍| 欧差乱伦二三| 国产精品亚洲天堂网址| 久久激情亚洲精品无码?V| 欧美日韩操逼嗦吊| 亚洲色婷婷| 久久久久久性爱片| 性性欧美| 加勒比无码毛片| 91高潮| 99re热有精品视频国产| 日韩探花精品在线视频| 婷婷亚洲综合| 亚洲男人的天堂V| 国产熟女精品区| 亚洲骚男同com| 九九九九久久久久| 正在播放国产精品一区| 天天色播亚洲综合网站| 天天爽爽爽爽| 中文字幕日韩人妻视频一区二区三区交换夫妻| 学生妹天天看| 97碰久久| 曰本人妻人人澡人人夹| 五月丁香成人网| 亚洲色图加勒比| 久久久久久九九九九九九| 久艹日日日| 丰满岳乱妇一区二区三区| 久久婷婷亚洲| 精品视频专区| 99久草| 高潮的A片激情扒开一区| 四虎影院成年人片| 2019天天操天天爽天天拍| 青青青草原| 国产精品久久天天干| 精品人人插人人操| 青青草国产盗摄一二三区| 少妇精品| 97人人操人人摸人人爱| 女色视频社区| chaopen97久久| 影音先锋日本一区二区| 天天干天天干天天| 中字一区| 国产精品一区二区亚洲人成毛片 | 欧美丰满少妇xx高潮| 欧美日韩丝袜| 黄站在线免费观看| 8x福利精品第一福利视频导航| 丁香五月偷拍| 国产精品一级片在线看| 乱日视频| 天天欧美| 久久精品国产亚洲AV成人直播| 艾草av| 超碰97亚洲| 99热伊人| 国产少妇内射| 18禁美女裸体无遮挡啪啪| 久九干| 激情欧美97| 超碰91在线| 道久久五香丁月婷婷激情综合| 国产真乱mangent| 99少妇精品视频| 欧美se综合| 日本中文字幕在线电影| 天天天堂影视日韩亚洲91| 免费黄色片。| 激情亚洲天堂| 国产精品久久妻无码网站| 日韩在线视频1234| 欧美色性情| 91丨九色丨东北熟女| 综合情欲网| 中国乱伦一区二区| 无码人妻系列少妇| 国语精品内射在线观看| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 亚洲国成人情色好看电影| 99999精品| 久久精品一区二区三区不卡| 日韩99999| 亚洲综合五月天| 欧洲亚洲少妇| 俺去久久| 操逼无码操逼| 久久久熟妇熟女国产| 手机在线免费看的av| 国产美女91视频| 亚洲国产精品99久久久| surenchaopeng| 天天激情干| 久久九操在线观看| 欧美成人黄网色网站| 夜夜嗨TV| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | 日本丝袜美腿人妻九九| 亚洲色欲天天天堂色欲网女| 黄色不卡视频| 国产高清成人mv在线观看| 欧美日本不卡| 久久99久久99久久99人受| 亚州性9| 亚洲色图20p| 天天综合网~91综合网| 久久久久久久亚洲Av无码| 爱丝福利| 蜜臀av一区二区三区免费观看| 中文字幕国产在线天堂| 99 国产丝袜在线| 日本操BAV| 四虎精品一区二区| 日本啊啊啊啊啊视频| 综合操逼| 九九九九九九九九九国产精品 | 国产人妻精品一区二区三区秋霞| 伊人色综合网电影| 69一区二区| 男人 天堂 日 亚洲| 欧美亚洲日本激情在线| 麻豆美女丝袜人妻中文| 亚州综合色图| 99在线精品观看99| 久久这里只精品免费福利| 久久超碰av在线| 操人妻少妇中文| 性在久久久久久| 人人妻人人玩人人澡人人爽| 秋霞一区二区三区四区五区六区七区| 日本在线视频导航| 国产婷婷综合在线观看| 激情视频图片| 国产午夜福利视频在线| 日欧操屄视频| 国产三级资源在线观看| 色原狠狠天天天| 国产农村妇女精品一二区| 99久久精品国产高潮| 亚洲春色一区二区三区| 91欧洲入口| 亚洲欧美另类少妇精品| 色婷婷影院| 国产日韩欧美亚洲精品95| 亚洲国产97| 蜜桃精品视频一区二区三区| 日本三级久| 日韩AV无码中文一区二区| 久久永久无码人妻视频| 嗯嗯嗯啊啊在线观看| 大香网伊人久久综合网eew| 丁香五月偷拍| 欧美一区二区观看在线| 欧美呦呦性爱| 亚洲综合九九| 夜夜黄| 一级黄碟| 91欧美美女日韩国产婷婷| 97九色人妻| 99热精品在线播放| 玖玖爱免费观看视频| 欧美日韩大黄片| 12一15性XXXX粉嫩国产| 日本女人久久久| 日韩电影免费网站麻豆视频| 97超碰巨乳| 亚洲色性情三级| 精品91摸| 97亚洲综合影院| 欧美综合综合| 久久精品女同亚洲女同13| 亚洲黄色网址| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 日韩中文字幕人妻视频| 天天综合中文字幕 91| 欧美伦乱| 在线色资源| 天美传媒av在线| 国产久久一区二区| 久久久∴| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 欧美综合在线91| 真实高潮91| 四虎 精品 WWW| 欧美乱色| 在现视频女上位好爽| 亚洲av夫妻操穴网| 大香蕉宗合网在线| 日本有码影片下载| 九九无码久久精品视频| 超碰97爽| 欧美色图片91| 欧洲乱码视频| 九九九影院| 亚洲欧洲第二视频在线观看色图| 亚州综合图片| 九九九九精品一区| 久久中文字幕女同性恋一区| 智利AV在线网| 亚洲加勒比色图| 97亚洲自在精品在线观看| 97色欧洲| 九久精品| 我要去看2个日本美女.com曹逼| av亚欧| 丁香九月 婷婷| 国产久久av| 强奸乱亚洲| 国产精品一区二区三区在线密挑| 99丝袜福利在线播放| 特级大荫道BBwBBwBBW| 免费久久9999| 久艹99| 日韩一级二级三级| 91色色网站| 小视频国产| 屁屁影院一区二区三区国产 | 国产无码久久高清| 中日亚韩免费视频| 国产吞精a级片激情电影| 熟女精品一区二区三区| 亚洲综合影视| 嗯~啊~快点 死我视频免费看网站| 成年女人18级毛片毛片免费观看| 在线观看精品国产免费| 920日本午夜免费| 好看的91视频| 青青草国产一区二区三区| 3P丝袜熟女 色综合| 中文字幕在线免费观看2| 欧美精品成人在线播放| 亚洲中文字幕精品久久久久久直播| 成人婷婷丁香| 麻豆福利视频导航| 国内精品久9| WWW.操逼.COM| 人人干人人搞人人摸| 蜜桃色色网站视频三区| 老鸭窝黄色视频网站| julia国产在线| 2019精品国产无码成人| 国产一区二区三区影片| 色性荡荡荡荡视频| 国产熟码AV| 欧美性爽xyxOOOO| 强奸乱伦动态污图免费 | 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 国产久久久9999| 欧美激情黑人| 亚洲欧洲无码bt精品合集| 一区在线观看中文字幕| 区一二区日韩亚洲乱码av电影| 熟女熟妇一区二区三区视频| 国产91亚洲精品一区二区三区| 户外裸露刺激视频第一区| 67194无码不卡| 日日97| 能在线播放的国产三级| 九九无码久久精品视频| 蜜臀va69| 无码高清国产AV| 丝袜内射| 国产一二三在线视频五十路| 国产欧美日韩精品中文| 欧美激情欧美精品| 成人性生活高清视频在线播放| 脫衣舞一区二区三区| 久久9久9久99久9久9| 中文三一区| 亚欧Av| 婷婷15月天青娱乐| 日韩精品在线放| 色妹子A V| 国产精品夜夜| 欧美日韩第一页| 欧洲亚洲综合| 福利操逼| 欧美综合制服在线| 国产精品分类在线观看| 九九无码久久精品视频| 另类欧美色| 色九区| 日产精品久久久一区二区| 激情视屏国产乱伦强奸| 少妇色综合| 777AV电影| 中文字幕97色| 操www| 男人天堂久久日韩| 囯产精品久久久久久久久久梁医生| 志村玲子视频一区二区| 香蕉精品二区二区| 五月丁香综合啪啪| 欧美在线大香999| 熟女乱伦二区| 风间由美日韩欧美久久| 最新国产亚洲精品精品国产亚洲综合| 91超碰碰在线| 国产久久av| 97免费视频在线观看视频| 精品久久久久av影院| 91少妇香蕉久久精品| 人人操人人操人人操人人操人人操人人人11.CM | 综合国产97| 免费精品国偷自产在线在线| 骚乳在线| 成人自拍三级在线观看| 白丝少妇一区二区| 综合五月婷婷亚洲一区| 龙兴卡官方查询| 亚洲AV成人无码久久精品播放| 国产乱不卡| 天天做天天爱| 国产精品美女| 台湾肥佬网一区二区三区| 日本1区2区不卡视频| 亚洲国内精品成人不卡| 强奸乱伦日韩AV| 18精品一二区| 9九九九九视频在线观看| 久久男人天堂| 四虎免费看黄| 欧日a| 婷婷午夜清品久久久久久久性色视频观| 少妇超碰在线| 午夜亚洲WWW湿好大| 美女黑人91神马| 欧美刺激色黄片免费看| 91丝袜在线播放| 欧美熟妇人体| 天天日B夜夜干B时时操B| 婷婷人妻激情| 久久9亚洲| 少妇3P性爱自拍| 亚洲性刺激| 日本不卡三级网在线播放| 97在线视频观看网站| 亚洲乱熟女一区二区| 99超碰色| 人人操人人摸人人看人人干| 少妇高潮一区二区三区在线| 日韩99神马视频播放片在线播放| 欧美特大AA级黄片| 欧美淫乱视频| 精品免费1| 欧美黄片欧美黄片xxx| 97在线观| 超碰1997| 日本三级韩三级99久久| 久久精品日韩| 97亚洲色图| 亚洲色91C| 欧美成人都市人妻| 亚洲成人日韩小说| 91少妇人妻| 亚洲日韩久久精品一区| 久久久98网站免费视频| 国产曰批免费观看久久久| 蜜臀99精品国产高清在线观看| 75大香蕉| 一区二区三区四区色图| 日韩欧美tv一区二区在线观看| 精品视频久久| 是还免费视频1727我| 亚洲青青青视频在线| 国产精品自在自拍视频| 亚洲中字幕日本一区二区三区 | 日韩成人午夜精品久久高潮| 欧美性生活综合| 国产亚洲精品无码三区| 亚洲高清综合网| 色拍偷亚洲| 中文字幕片| 亚洲丝袜色| 一级A啪啪啪啪| 高清成年美女黄网站免费大全| 欧美中文综合| 久久超碰天天| 亚洲凸凹超碰成人| 少妇一区二区三区在线观看| 婷婷99狠狠| 国产精品视频白浆免费| 国产精品久久久无码aV去| 超碰2017| 超碰97伊人| 午夜九九| 制服诱惑亚洲一区二区三区在线观看| 亚洲国产精品久久久久婷婷青年| 亚洲精品久久久久久久蜜桃臀| 天堂俺去俺来也www久久婷婷| 东京热男人的天堂| 亚欧美综合网| 黑丝制服中文字幕| 亚洲AV色图一区| 天天操人人操骚逼网站| 久插不卡| 中文字幕片| 中文字幕日产av人| 亚洲天堂人妻一区二区| 久久激情网| 一区二区三区机械有限公司| 天久久久噜噜噜久久国产精品爽爽| 免费看黄视频亚洲网站| 国产精品爆乳懂色蜜乳| 美女诱惑一区| 国产熟女无套内射| 日比av无码| 欧美激情内射| 女生看匆91网站| 一级AAA片一区二区三区| 熟女熟妇一区二区三区视频| 国产又长又大又粗的视频| 青青草无码视频| 欧美日韩美女精品久草一区二区三区 | 无码视频黄色网战| 不卡啪啪视频| 黄网在线播放| 六月丁香啪啪| 农村妇女一级二级三级视频| 精品视频久久久久九九九九9999| 97色碰| 熟女人妻av在线资源,黄色的资源| 色色国产| 青青国产精品在线| 蜜桃久久久久久| 蜜臀AV成人精品蜜臀AV久久| 精彩国产视频播放1区2区| 久久超碰、| 精品久久九| se..亚洲欧美| 91人妻在线视频| 超碰97男人| 99久久久久久久久| 深喉吞精| 国产欧美日韩臀| 久久东京国产精品视频| 天天欧美| 97碰碰日本乱偷人妻中文的| 在线性黄高清免费视频| 777超碰| 国产传媒1234区| 中文啪啪视频| 自怕偷自怕亚洲精品| 黄色片一区二区三区四区五区| 亚洲 欧美 精品专区 极品| 91伊人久| 亚洲少妇中文字幕网址| 激情综合五| 亚州再线| 天天操狠狠日夜夜干超大胆开放com大香蕉视频在线观看 | 国产高清成人mv在线观看| 韩国黄色片精品久久久| 9/A片 | 色色综合97| 2019男人的天堂| 久久午夜色播影院免费高清| 伊人网免费视频| 爆操无码| 美女黄页| 欧美超碰人妻97| 啪啪啪亚欧美视频| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 亚州 综合 色图| 日韩99999| 欧美性生活免费网| 亚洲精品一区中文字幕乱码| 亚州色图欧美|