1.JSP ä¸ä¼ ä¸è½½ä»£ç
2.Tomcat9.0ï¼
3.Tomcat处理http请求之源码分析 | 京东云技术团队
JSP ä¸ä¼ ä¸è½½ä»£ç
æç»ä½ æï¼
1.é¦å ä¸è¿ä¸¤ä¸ªå commons-fileupload-1.2.1.jarï¼commons-io-1.3.2.jar
2.ç¼ååå°é¡µé¢
<%@ page language="java" pageEncoding="gbk"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4. Transitional//EN">
<html>
<body>
<form action="<%=request.getContextPath()%>/UploadServlet" method="post" enctype="multipart/form-data">
username:<input type="text" name="username"><br>
password:<input type="password" name="password"><br>
file:<input type="file" name="file"><br>
<input type="submit" value="submit"><br>
</form>
</body>
</html>
3.ç¼åservlet
package cn.jci.upload.servlet;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet..jci.upload.servlet.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
5.åå¸
okäº
è¿æ¯æåå§çä¸ä¼ æ件çåæ³ï¼ç°å¨struts2ä¸ä¼ çè¯ï¼å°±è¦è½»æ¾å¥½å¤
Tomcat9.0ï¼
j2eeæå¡å¨æåªäº
ä¼æå¨ç¥ï¼J2EEåºç¨æå¡å¨ç¾è±é½æ¾ï¼ç§ç±»ä¼å¤ãé£ä¹J2EEåºç¨æå¡å¨æåªäº?源码åæåªäºåè½å¢?ä¸èµ·æ¥ççå§!
ä»åè½å®ç°ä¸ååï¼
æå®ç°å®æ´J2EEè§è(fullprofile)çWeblogic,WebSphere,GlassFish
æå®ç°webåºç¨è§è(webprofile)çTomEE,JBoss/WildFly
æåºæ¬çServletåJspè§èçWeb容å¨(WebContainer)Tomcat,Jetty,Resin
å顾è¿å»çå¹´ï¼ååºç¨æå¡å¨å¸åºå æçåæåç§ã
ä¸å¾ä¸ºå个åºç¨æå¡å¨ä½¿ç¨ç饼å¾
æ们çå°ï¼å¨ä¼å¤J2EEåºç¨æå¡å¨ä¸ï¼Tomcat使ç¨çè¾¾å°.%ï¼ç¨³å第ä¸ã
ç¸è¾å¹´ï¼Tomcat使ç¨çå¤§å¹ å¢é¿ï¼å¢é¿å°è¿%ã
æ´ä½èè¨ï¼Tomcatå为ServletåJspè§èçåèå®ç°(Referenceimplementationï¼ç®ç§°RI)ï¼ä¸è¬é½ä¼å¨ç¬¬ä¸æ¶é´å®ç°è§èçæ°ç¹æ§å¹¶éè¿OracleçCTSæµè¯è®¤è¯ãç®åææ°çTomcat9.0ï¼è½è¿æ¯alphaçï¼ä½å·²ç»å®ç°äºServlet4.0èæ¡ï¼æå ´è¶£çæåï¼å¯ä»¥ä¸è½½å°é²å¦!
Tomcatæ¯ä¸ä¸ªå®ç°äºJAVAEEæ åçæå°çWEBæå¡å¨ï¼æ¯Apache软件åºéä¼çJakarta项ç®ä¸çä¸ä¸ªæ ¸å¿é¡¹ç®ï¼ç±ApacheãSunåå ¶ä»ä¸äºå ¬å¸åä¸ªäººå ±åå¼åèæãå 为Tomcatææ¯å è¿ãæ§è½ç¨³å®ï¼èä¸å¼æºå è´¹ï¼å èæ·±åJavaç±å¥½è çåç±å¹¶å¾å°äºé¨å软件å¼ååç认å¯ï¼æ为ç®åæ¯è¾æµè¡çWebåºç¨æå¡å¨ãå¦ä¹ JavaWebå¼åä¸è¬é½ä½¿ç¨Tomcatæå¡å¨ï¼è¯¥æå¡å¨æ¯æå ¨é¨JSP以åServletè§èï¼å¯å¨çé¢å¦å¾ï¼
Tomcatæ¯ä¸æ¬¾é常ä¼ç§çJavaWebæå¡å¨,以è´äºå¾å¤å¼æºJavaåºç¨æå¡å¨(å¦JOnAS)ç´æ¥éæå®ä½ä¸ºservlet容å¨ã
Tomcatçæ»ä½ç»æ
Tomcatä¸ä¸»è¦æ¶åServer,Service,Engine,Connector,Host,Contextç»ä»¶ï¼ä¹åç¨è¿Tomcatç.ç«¥éæ¯ä¸æ¯è§å¾è¿äºç»ä»¶çå称æç¹ä¼¼æ¾ç¸è¯ç赶èï¼æ²¡èµ¶è?!æ¨åæ³æ³ã好å§ï¼ä¸ç¨ä½ æ³äºï¼ææ¥åè¯ä½ å§ãå ¶å®å¨Tomcatäºè¿å¶ååå 解åå,å¨confç®å½ä¸æä¸ä¸ªserver.xmlæ件ï¼ä½ æå¼å®ç两ç¼ççï¼æ¯ä¸æ¯åç°server.xmlæ件ä¸å·²ç»å å«äºä¸è¿°çå 个å称ã
Tomcaté群æºç çç±»å¾
ä»å¾ä¸æ们å¯ä»¥çåºTomcaté群å æ¬ä»¥ä¸å 个æ¹é¢çå 容:
Session:Sessionå为StandardSessionä¸ClusterSession两ç§,åè ç¨äºSessionå¤å¶ã
SessionManager:æç¨äºé群Session管ççClusterSession,ä¹æç¨äºå¯¹Sessionè¿è¡ä¸è¬æ¥å¸¸ç®¡çç,å¦PersistentManager,BackupManager,SimpleTcpReplicationManagerã
ç»éè¿ æ¡æ¶:SessionManagerè°ç¨ç»é讯æ¡æ¶è¿è¡Sessionçä¼ è¾,Tomcatéç¨çç»é
讯æ¡æ¶æ¯tribe,ç®åtribe已被ç¬ç«ä¸ºå¼æ¾çapacheå·¥ç¨ã
Cluster:æ¹ä¾¿é群管çèæ´¾çåºçé»è¾æ¦å¿µ,å¯å°å®é ç©çæºåå为ä¸ä¸ªCluster,ä¹å¯å°ä¸å°ç©çæºä¸ä¸å端å£çå®ä¾åå为ä¸ä¸ªCluster,å®æä¸ä¸ªç®åçå®ç°ç±»SimpleTcpClusterã
1.1Session
æå¡å¨é群é常æ纵两ç§session:
1.Stickysessions:å°½é让åä¸ä¸ªå®¢æ·è¯·æ±ç±åä¸å°æå¡å¨æ¥å¤ç,è¿æ ·stickysessionså°±æ¯åå¨äºåæºæå¡å¨ä¸æ¥å客æ·ç«¯è¯·æ±çsession,å®ä¸éè¦è¿è¡Sessionå¤å¶,å¦æè¿ä¸ªåæºå¤±è´¥çè¯,ç¨æ·å¿ é¡»éæ°ç»å½ç½ç«ã
2.Replicatedsessions:å¨ä¸å°æå¡å¨ä¸çsessionç¶æ被å¤å¶å°é群çå ¶ä»æå¡å¨ä¸,æ 论ä½æ¶,åªè¦sessionæ¹åäº,sessionæ°æ®é½è¦éæ°å ¨é¨æé¨å(ä¾æ®å¤å¶çç¥)被å¤å¶å°å ¶ä»æå¡å¨ä¸ã
Tomcatæ¯æ以ä¸ä¸ç§sessionæä¹ æ§ç±»å:
1.å åå¤å¶:å¨JVMå åä¸å¤å¶sessionç¶æ,使ç¨Tomcatèªå¸¦çSimpleTcpClusteråSimpleTcpClusterManagerç±»ã
2.æ°æ®åºæä¹ æ§:å¨è¿ç§ç±»åä¸,sessionç¶æä¿åå¨ä¸ä¸ªå ³ç³»æ°æ®åºä¸,æå¡å¨ä½¿ç¨org.apache.catalina.session.JDBCManagerç±»ä»æ°æ®åºä¸è·åSessionä¿¡æ¯ã
3.åºäºæ件çæä¹ æ§:è¿é使ç¨ç±»org.apache.catalina.session.FileManageræsessionç¶æä¿åå°ä¸ä¸ªæ件系ç»ã
SessionManager
Tomcatéè¿org.apache.catalina.Manageræ¥ç®¡çSession,Manageræ¥å£æ»æ¯åContextContainerç¸å ³èãå®ä¸»è¦è´è´£sessionç建ç«ãæ´æ°åéæ¯ã该æ¥å£ä¸ä¸äºéè¦çæ¹æ³æ:
ç¨æ·å¨Servletä¸éè¿javax.servlet..ConnectException:Connectionrefused
atjava.net.PlainSocketImpl.socketConnect(NativeMethod)
atjava.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:)
atjava.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:)
atjava.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:)
atjava.net.SocksSocketImpl.connect(SocksSocketImpl.java:)
atjava.net.Socket.connect(Socket.java:)
atjava.net.Socket.connect(Socket.java:)
atjava.net.Socket.(Socket.java:)
atjava.net.Socket.(Socket.java:)
atorg.apache.catalina.startup.Catalina.stopServer(Catalina.java:)
atsun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod)
atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:)
atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:)
atjava.lang.reflect.Method.invoke(Method.java:)
atorg.apache.catalina.startup.Bootstrap.stopServer(Bootstrap.java:)
atorg.apache.catalina.startup.Bootstrap.main(Bootstrap.java:)
å°tomcat9å å ¥å°ç³»ç»æå¡å表ä¸ï¼
è¿å ¥å°/etc/init.dç®å½ä¸ï¼
cd/etc/init.d
å建tomcat9æå¡é ç½®æ件ï¼
vitomcat9
å°å¦ä¸ä»£ç å å ¥åå ¥å°tomcat9é ç½®æ件ä¸ï¼
#idea-tomcatconfigstart---
#!/bin/bash
#description:TomcatStartStopRestart
#processname:tomcat
#chkconfig:
JAVA_HOME=/usr/local/tomcat/apache-tomcat-9.0.0.M4/
exportJAVA_HOME
PATH=$JAVA_HOME/bin:$PATH
exportPATH
CATALINA_HOME=/usr/local/tomcat/apache-tomcat-9.0.0.M4/
case$1in
start)
sh$CATALINA_HOME/bin/startup.sh
;;
stop)
sh$CATALINA_HOME/bin/shutdown.sh
;;
restart)
sh$CATALINA_HOME/bin/shutdown.sh
sh$CATALINA_HOME/bin/startup.sh
;;
esac
exit0
#chmodtomcat
#chkconfig--addtomcat
#chkconfig--leveltomcaton
#chkconfig--listtomcat
#idea-tomcatconfigend---
é®å ¥Esc并è¾å ¥â:wq!âä¿æ并éåº;
å ¶ä¸ç注æç¹æ¯å°JAVA_HOMEåCATALINA_HOMEåé设置æä¸æ们å½åé ç½®ç¸ä¸è´çè·¯å¾;
为tomcat9åé å¯æ§è¡æéï¼
chmod+xtomcat9
å°tomcat9çº³å ¥å°ç³»ç»çæå¡å表ä¸ï¼å³æ·»å tomcat9为系ç»æå¡ï¼
chkconfig--addtomcat9
æ¥çå½åç³»ç»æå¡é½æåªäºï¼
chkconfig--list
ä¹å¯ä»¥æ¥çæå®çç³»ç»æå¡ï¼å¦è¿éæ们æå®tomcat9è¿ä¸ªæå¡ï¼
chkconfig--listtomcat9
æå°å¦ä¸ä¿¡æ¯ï¼
tomcat:off1:off2:on3:on4:on5:on6:off
å表æå·²å°tomcat9设置为系ç»æå¡ï¼2ã3ã4ã5é½ä¸ºon表示å¯éç³»ç»èªå¨å¯å¨;
æ们å¯ä»¥å¨ä»»æç®å½ä¸æ§è¡å ³éãå¯å¨ãéå¯Tomcat9æå¡å¦ï¼
.1å ³étomcat9æå¡ï¼
servicetomcat9stop
.2å¯å¨tomcat9æå¡ï¼
servicetomcat9start
.3éå¯tomcat9æå¡ï¼
servicetomcat9restart
åè®°ï¼
linuxç³»ç»ä¸ç/etcç®å½è¡¨ç¤ºâ设å¤âï¼æ为ä¸ç¡¬ä»¶è®¾å¤ç¸å ³çä¿¡æ¯;
/etc/init.dç®å½ä¸çæ件表示å½å设å¤çåå§åé 置信æ¯;
å½ä»¤chkconfig表示添å (--add)ãå é¤(--del)ãæ¥ç(--list)ç³»ç»æå¡;
çäºâå¨CentOS7ä¸å®è£ Tomcat9çæ¹æ³æç¨âè¿æ³çï¼
1.CentOS7å®è£ é ç½®å¾ææç¨
2.å¨CentOS7ä¸é ç½®NICç»å®æç¨
3.CentOS7设置ç½ç»èªå¨å¯å¨æç¨
4.Tomcat7.0çå®è£ ä¸é ç½®
5.centos7å¿«éå¯å¨åºç¨ç¨åºæç¨
å¦ä½å¨CentOS7ä¸å®è£ Tomcat91éè¿SecureCRTè¿æ¥å°é¿éäºCentOS7æå¡å¨;
2è¿å ¥å°ç®å½/usr/local/ä¸ï¼
cd/usr/local/
3å建ç®å½/usr/local/toolsï¼å¦ææå忽ç¥ï¼
mkdir-ptools
4å建/usr/local/tomcatç®å½ï¼å¦æå·²åå¨å忽ç¥ï¼
mkdir-ptomcat
5è¿å ¥å°ç®å½/usr/local/toolsä¸ï¼
cdtools/
6ä¸è½½apache-tomcat-9.0.0.M4.tar.gzæ件ï¼
wget
7解å缩apache-tomcat-9.0.0.M4.tar.gzï¼
tar-zxvfapache-tomcat-9.0.0.M4.tar.gz
8å°éè¿è§£åå¾å°çapache-tomcat-9.0.0.M4æ件å¤å¶å°/usr/local/tomcatç®å½ä¸ï¼
mvapache-tomcat-9.0.0.M4../tomcat/
9æå¼æ件/etcç®å½ä¸çprofileæ件ï¼
vim/etc/profile
å°å¦ä¸ä»£ç 追å å°profileæ件æ«å°¾ï¼
#idea-tomcat9configstart---
CATALINA_HOME=/usr/local/tomcat/apache-tomcat-9.0.0.M4
CATALINA_BASE=/usr/local/tomcat/apache-tomcat-9.0.0.M4
PATH=$PATH:$CATALINA_BASE/bin
exportPATHCATALINA_BASE
#idea-tomcat9configend---
ä¿æ并æ¨åº:wq!
ä¿®æ¹tomcatç端å£å·åå符ç¼ç ï¼
è¿å ¥å°/usr/local/tomcat/apache-tomcat-9.0.0.M4/confç®å½ä¸ï¼
cd../tomcat/apache-tomcat-9.0.0.M4/conf
æå¼tomcatæå¡çé ç½®æ件server.xmlï¼
viserver.xml
æ¾å°å¦ä¸ä»£ç ï¼
å°å ¶ä¸çæ¹æHTTPåè®®çé»è®¤ç«¯å£ï¼æ¹åç代ç å¦ä¸ï¼
å¢å manager-guiå¾å½¢å管ççé¢ç访é®æé(ä¸éè¦çè¯ï¼æ¤æ¥éª¤å¯å¿½ç¥)ï¼
æå¼tomcatçç¨æ·é ç½®æ件tomcat-users.xmlï¼
vitomcat-users.xml
å¨æ ç¾åå å ¥å¦ä¸ä»£ç ï¼
è¿é设置çusernameåpasswordé½æ¯passwordï¼è§è²ä¸ºmanager-gui;
é®å ¥Esc并è¾å ¥â:wq!âä¿æ并éåº;
è¿å ¥å°/usr/local/tomcat/apache-tomcat-9.0.0.M4/binç®å½ä¸ï¼
cd../bin/
æå¼vicatalina.shæ件ï¼
å¨#OSspecificsupport.åé¢å å ¥å¦ä¸ä»£ç ï¼
Tomcat处理http请求之源码分析 | 京东云技术团队
本文将从请求获取与包装处理、请求传递给 Container、下载Container 处理请求流程,源码这 3 部分来讲述一次 http 穿梭之旅。下载抓包浏览器源码
在 tomcat 组件 Connector 启动时,源码会监听端口。下载以 JIoEndpoint 为例,源码在 Acceptor 类中,下载socket = serverSocketFactory.acceptSocket (serverSocket); 与客户端建立连接,源码将连接的下载 socket 交给 processSocket (socket) 来处理。在 processSocket 中,源码财经模板源码对 socket 进行包装,下载交给线程池处理。源码
线程池中的下载 SocketProcessor 任务,将 socket 交给 handler 处理,源码此 handler 为 HttpConnectionHandler 的ai吸管源码实例。在 HttpConnectionHandler 的父类 process 方法中,根据请求的状态,创建 HttpProcessor 进行相应的处理,然后切到 HttpProcessor 的父类 AbstractHttpProccessor 中。
在 SocketProcessor 中,unity下载源码从 socket 获取请求数据,进行 keep-alive 处理,数据包装等操作,最终将处理后的请求信息交给了 CoyoteAdapter 的 service 方法。
CoyoteAdapter 的免费前端源码 service 方法中有两个主要任务:一是将 org.apache.coyote.Request 和 org.apache.coyote.Response 转换为继承自 HttpServletRequest 的 org.apache.catalina.connector.Request 和 org.apache.catalina.connector.Response,同时定位到 Context 和 Wrapper。二是将请求交给 StandardEngineValve 处理。
在 postParseRequest 方法中,request 通过 URI 的信息找到属于自己的 Context 和 Wrapper。Mapper 保存了所有的容器信息,初始化时将所有容器添加到了 mapper 中。容器信息的变化由 MapperListener 监听,一旦容器发生变化,MapperListener 将其作为监听者进行处理。
找到请求对应的 Context 和 Wrapper 后,CoyoteAdapter 将包装好的请求交给 Container 处理。从下面的代码片段,我们很容易追踪整个 Container 的调用链,形成时间线图。
最终,StandardWrapperValve 将请求交给 Servlet 处理完成,至此一次 http 请求处理完毕。