日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Tomcat處理http請求之源碼分析

瀏覽:284日期:2023-09-08 20:45:27
目錄1 請求包裝處理2 請求傳遞給Container3 Container處理請求流程1 請求包裝處理

tomcat組件Connector在啟動的時候會監聽端口。以JIoEndpoint為例,在其Acceptor類中:

protected class Acceptor extends AbstractEndpoint.Acceptor { @Override public void run() {while (running) { …… try {//當前連接數countUpOrAwaitConnection();Socket socket = null;try { //取出隊列中的連接請求 socket = serverSocketFactory.acceptSocket(serverSocket);} catch (IOException ioe) { countDownConnection();}if (running && !paused && setSocketOptions(socket)) { //處理請求 if (!processSocket(socket)) {countDownConnection();closeSocket(socket); }} else { countDownConnection(); // Close socket right away closeSocket(socket);} } ……} }}

在上面的代碼中,socket = serverSocketFactory.acceptSocket(serverSocket);與客戶端建立連接,將連接的socket交給processSocket(socket)來處理。在processSocket中,對socket進行包裝一下交給線程池來處理:

protected boolean processSocket(Socket socket) { try {SocketWrapper<Socket> wrapper = new SocketWrapper<Socket>(socket);wrapper.setKeepAliveLeft(getMaxKeepAliveRequests());wrapper.setSecure(isSSLEnabled());//交給線程池處理連接getExecutor().execute(new SocketProcessor(wrapper)); } …… return true;}

線程池處理的任務SocketProccessor,通過代碼分析:

protected class SocketProcessor implements Runnable { protected SocketWrapper<Socket> socket = null; protected SocketStatus status = null; @Override public void run() {boolean launch = false;synchronized (socket) { SocketState state = SocketState.OPEN; try {serverSocketFactory.handshake(socket.getSocket()); } …… if ((state != SocketState.CLOSED)) {//委派給Handler來處理if (status == null) { state = handler.process(socket, SocketStatus.OPEN_READ);} else { state = handler.process(socket,status);} }}} ……}

即在SocketProcessor中,將Socket交給handler處理,這個handler就是在Http11Protocol的構造方法中賦值的Http11ConnectionHandler,在該類的父類process方法中通過請求的狀態,來創建Http11Processor處理器進行相應的處理,切到Http11Proccessor的父類AbstractHttp11Proccessor中。

public SocketState process(SocketWrapper socketWrapper) { RequestInfo rp = request.getRequestProcessor(); rp.setStage(org.apache.coyote.Constants.STAGE_PARSE); // Setting up the I/O setSocketWrapper(socketWrapper); getInputBuffer().init(socketWrapper, endpoint); getOutputBuffer().init(socketWrapper, endpoint); while (!getErrorState().isError() && keepAlive && !comet && !isAsync() && upgradeInbound == null && httpUpgradeHandler == null && !endpoint.isPaused()) {……if (!getErrorState().isError()) { // Setting up filters, and parse some request headers rp.setStage(org.apache.coyote.Constants.STAGE_PREPARE); try {//請求預處理prepareRequest(); } ……}……if (!getErrorState().isError()) { try {rp.setStage(org.apache.coyote.Constants.STAGE_SERVICE);//交由適配器處理adapter.service(request, response);if(keepAlive && !getErrorState().isError() && (response.getErrorException() != null ||(!isAsync() &&statusDropsConnection(response.getStatus())))) { setErrorState(ErrorState.CLOSE_CLEAN, null);}setCometTimeouts(socketWrapper); } } } ……}

可以看到Request和Response的生成,從Socket中獲取請求數據,keep-alive處理,數據包裝等等信息,最后交給了CoyoteAdapter的service方法

2 請求傳遞給Container

在CoyoteAdapter的service方法中,主要有2個任務:

•第一個是org.apache.coyote.Request和org.apache.coyote.Response到繼承自HttpServletRequest的org.apache.catalina.connector.Request和org.apache.catalina.connector.Response轉換,和Context,Wrapper定位。

•第二個是將請求交給StandardEngineValve處理。

public void service(org.apache.coyote.Request req,org.apache.coyote.Response res) { …… postParseSuccess = postParseRequest(req, request, res, response); …… connector.getService().getContainer().getPipeline().getFirst().invoke(request, response); ……}

在postParseRequest方法中代碼片段:

connector.getMapper().map(serverName, decodedURI, version, request.getMappingData());request.setContext((Context) request.getMappingData().context);request.setWrapper((Wrapper) request.getMappingData().wrapper);

request通過URI的信息找到屬于自己的Context和Wrapper。而這個Mapper保存了所有的容器信息,不記得的同學可以回到Connector的startInternal方法中,最有一行代碼是mapperListener.start(); 在MapperListener的start()方法中,

public void startInternal() throws LifecycleException { setState(LifecycleState.STARTING); findDefaultHost(); Engine engine = (Engine) connector.getService().getContainer(); addListeners(engine); Container[] conHosts = engine.findChildren(); for (Container conHost : conHosts) {Host host = (Host) conHost;if (!LifecycleState.NEW.equals(host.getState())) { registerHost(host);} }}

MapperListener.startInternal()方法將所有Container容器信息保存到了mapper中。那么,現在初始化把所有容器都添加進去了,如果容器變化了將會怎么樣?這就是上面所說的監聽器的作用,容器變化了,MapperListener作為監聽者。他的生成圖示

通過Mapper找到了該請求對應的Context和Wrapper后,CoyoteAdapter將包裝好的請求交給Container處理。

3 Container處理請求流程

從下面的代碼片段,我們很容易追蹤整個Container的調用鏈: 用時序圖畫出來則是:

最終StandardWrapperValve將請求交給Servlet處理完成。至此一次http請求處理完畢。

到此這篇關于Tomcat處理http請求之源碼分析的文章就介紹到這了,更多相關Tomcat請求處理內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Tomcat
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
成人自拍av| 蜜臀av在线播放一区二区三区| 久久久国产亚洲精品| 国产亚洲一卡2卡3卡4卡新区| 国产福利片在线观看| 亚洲视频国产| 日韩精品久久久久久久电影99爱| 国产精品红桃| 在线精品国产亚洲| 午夜国产精品视频| 啪啪国产精品| 精品三级久久| 国产成人精品一区二区三区视频| 日本免费一区二区视频| 香蕉成人久久| 亚洲午夜久久久久久尤物 | 欧美一区二区三区久久| 亚洲一区二区毛片| 91精品一区二区三区综合在线爱| 精品一区二区三区亚洲| 国产欧美欧美| 国产午夜久久av| 国产日韩欧美在线播放不卡| 欧美亚洲网站| 国产精品夜夜夜| 久久国产婷婷国产香蕉| 日本少妇一区二区| 欧美日韩一区二区三区四区在线观看| 日韩美女国产精品| 久久国产欧美日韩精品| 国产探花在线精品一区二区| 国产精品日本一区二区三区在线 | 国产精品v日韩精品v欧美精品网站| 鲁大师影院一区二区三区| 天堂av在线一区| 久久aⅴ国产紧身牛仔裤| 美女精品网站| 日本亚洲不卡| 日韩免费精品| 国产欧美一区二区三区精品观看| 国产亚洲一区二区三区不卡| 国产精品亲子伦av一区二区三区| 久久不见久久见中文字幕免费 | 欧美高清一区| 久久不射网站| 日韩欧美高清一区二区三区| 亚洲免费影院| 国产一区日韩欧美| 国产精品婷婷| 91精品国产自产在线丝袜啪| 国产欧美自拍| 加勒比视频一区| 欧美羞羞视频| 亚洲激情黄色| 日韩一区网站| 久久av免费| 91精品婷婷色在线观看| 亚洲成人一区| 蜜桃久久av| 午夜电影一区| 国产欧美自拍一区| 亚洲女同av| 欧美日韩国产综合网| 综合激情五月婷婷| 里番精品3d一二三区| 日韩免费一区| 美女国产一区| 国产精品nxnn| 亚洲国产专区校园欧美| 亚洲精品成人一区| 欧美激情麻豆| 亚洲国产综合在线看不卡| 亚洲免费婷婷| 久久国产精品色av免费看| 在线天堂资源www在线污| 国产精品婷婷| 国产一卡不卡| 久久久久久久久99精品大| 免费一区二区视频| 精品三级av| 午夜一级在线看亚洲| 麻豆精品av| 欧美专区在线| 91精品麻豆| 日韩在线观看一区| 少妇精品久久久一区二区三区| 久久久久久久久成人| 久久精品青草| 日本成人在线一区| 黄毛片在线观看| 热久久久久久久| 国产成人黄色| 日本欧洲一区二区| 日韩影院二区| 欧美在线观看天堂一区二区三区| 黄在线观看免费网站ktv| 日韩在线一二三区| 麻豆久久一区| 亚洲欧美日本日韩| 国产不卡av一区二区| 亚洲精品乱码久久久久久蜜桃麻豆| 不卡福利视频| 日韩高清在线不卡| 亚洲精品小说| 久久中文字幕导航| 蜜臀va亚洲va欧美va天堂| av综合电影网站| 国产亚洲字幕| 首页欧美精品中文字幕| 日韩一区二区中文| 国产精品久久亚洲不卡| 亚洲欧美日本日韩| 蜜桃成人精品| 久久99精品久久久野外观看| 爽好多水快深点欧美视频| 神马午夜在线视频| 国产精品玖玖玖在线资源| 老色鬼久久亚洲一区二区| аⅴ资源天堂资源库在线| 日韩精品免费视频人成| 亚洲韩日在线| 日韩精品专区| 精品深夜福利视频| 国产精品视频一区二区三区四蜜臂| 视频在线观看91| 激情久久五月| 国产成人调教视频在线观看| 一本色道久久精品| 欧美日中文字幕| 福利在线一区| 国产福利一区二区精品秒拍 | 亚洲www啪成人一区二区| 国产乱码精品一区二区亚洲| 免费av一区二区三区四区| 三上亚洲一区二区| 国产日韩欧美三区| 日本午夜精品一区二区三区电影| 男女精品网站| 国产毛片一区| 亚洲综合日韩| 亚洲激情精品| 午夜久久黄色| 午夜欧美视频| 免费欧美一区| 欧美日韩精品在线一区| 精品久久不卡| 国产精品成人a在线观看| 国产视频一区二| 日韩成人av影视| 婷婷综合国产| 日韩一区免费| 九九综合九九| 蜜桃一区二区三区在线观看| 一区福利视频| 欧美精品第一区| 久久人人88| 国产精品玖玖玖在线资源| 日韩av在线播放网址| 精品三级在线观看视频| 国产不卡人人| 欧美另类综合| 国产极品嫩模在线观看91精品| 亚洲视频www| 亚洲啊v在线| 中文字幕在线视频久| 国产成人精品999在线观看| 国产一区久久| 国产欧美亚洲精品a| 日韩欧美精品综合| 欧美日韩免费观看一区=区三区 | 亚洲精品一二| 欧美日韩网址| 亚洲视频www| 日韩av一区二区三区四区| 国产日韩亚洲欧美精品| 精品香蕉视频| 欧美+日本+国产+在线a∨观看| 成人在线免费观看91| 久久最新视频| 日韩在线视频一区二区三区| 国产精品7m凸凹视频分类| 精品国产一区二区三区性色av| 91久久精品无嫩草影院| 精品捆绑调教一区二区三区| 老鸭窝一区二区久久精品| 亚洲精品四区| 蜜桃久久av| 国产精品日韩久久久| 亚洲精品看片| 精品一区亚洲| 亚洲视频国产精品| 国产极品模特精品一二| 激情欧美国产欧美| 最近高清中文在线字幕在线观看1| 91伊人久久| 亚洲免费毛片| 国产精品亚洲四区在线观看| 久久gogo国模啪啪裸体| 肉色欧美久久久久久久免费看 | 免费一级片91|