一、Tomcat体系图
Tomcat服务器的启动是基于一个Server.xml文件的,Tomcat启动的时候首先会启动一个Server,Server里面就会启动service,Service里面就会启动多个连接器Connector,每个连接器都处于等待连接,当浏览器访问服务器上面的wen资源时,首先连接到Connector,Connector将请求交给一个Engine去处理,Engine接收到请求后就会解析用户访问的Host,然后将请求交给相应的Host,Host收到请求后就会解析出用户想要访问这个Host下面的哪一个web应用,一个web应用对应一个Context.
<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<ListencleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JasperListener" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
二、互联网加密
Tomcat服务器启动时候会启动多个Connector,而Tomcat服务器的连接器又分为加密连接器和非加密连接器,比如
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
这个就是没有加密的连接器。
2.1 对称加密
采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。加密和解密使用相同的密钥的加密算法,速度快,对称加密通常需要在消息发送方需要加密大量数据使用,对称加密也称为密钥加密。所谓对称,就是使用同样的算法进行加密和解密。常用的对称加密有:DES、IDEA、RC2、RC4、SKIPJACK、RC5、AES算法等
3.2 非对称加密
非对称加密算法需要两个密钥,公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有对应得公开密钥才能解密。因为加密和解密使用两个不同得密钥,所以这种算法叫做非对称加密算法。实现信息交换过程是:甲方生成一队密钥并将其中得一把作为公密向其它方公开,得到该公用密钥得乙方使用该密钥对信息加密后发送给甲方,甲方再用自己保存得另外一把专用密钥对信息进行解密。另外,甲方可以使用乙方得公钥对机密信息进行签名后再发送给乙方,乙方再用自己的私钥对数据进行验签。
非对称性加密依然没有解决数据传输的安全性问题,比如A想向B发数据,B首先生成一对密钥(公钥和私钥),然后将公钥发给A,A拿到B发给他的公钥有就可以使用公钥加密数据后发给B,然而在B公钥发送给A的这个过程中,很有可能会被第三方C截获,C截获到B的公钥后,也使用B的公钥加密数据,然后发给B,B接收到数据后就晕了,因为搞不清楚接收到的数据到底是A发的还是C发的,这是其中一个问题,另一个问题就是,C截获到B发的公钥后,C可以自己生成一对密钥(公钥和私钥),然后发给A,A拿到公钥后就以为是B发给他的,然后就使用公钥加密数据发给B,发送给B的过程中被C截获下来,由于A是用C发给他的公钥加密数据的,而C有私钥,因此就可以解密A加密过后的内容了,而B接收到A发给他的数据后反而解不开了,因为数据是用C的公钥加密的,B没有C的私钥,所以就无法解密。所以,非对称性加密存在一个问题:A想向B发数据,A如何确定拿到的公钥一定是B发的呢?那么如何解决这个问题呢?只能靠一个第三方机构(CA机构,即证书授权中心(Certificate Authority ),或称证书授权机构)来担保。A想向B发数据,B首先将公钥发给CA机构,CA机构拿到B的公钥后跑到B的家里问:这是你发的公钥吗?B确认过后说是:没错,是我发的!那么此时CA机构就会为B的公钥做担保,生成一份数字证书给B,数字证书包含了CA的担保认证签名和B的公钥,B拿到CA的这份数字证书后,就发给A,A拿到数字证书后,看到上面有CA的签名,就可以确定当前拿到的公钥是B发的,那么就可以放心大胆地使用公钥加密数据,然后发给B了。
三、https连接器
自签名的证书,使用JDK自带工具 keytool制作。https连接器配置如下:
<Connector port="8443" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="false" protocol="org.apache.coyote.http11.Http11NioProtocol"
SSLEnabled="true" SSLProtocol="TLSv1,TLSv1.1,TLSv1.2"
keystoreFile="F:\ssl\easyView.keystore"
keystorePass="123456" URIEncoding="utf-8" useBodyEncodingForURI="true"
ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA"
/>
由于密钥库里面的证书是我们手工生成的,没有经过CA的认证,所以使用"https://localhost:8443/"访问8443的加密连接器,浏览器会出现"证书错误,导航已阻止",浏览器认为当前要访问的这个主机是不安全的,不推荐继续访问,点击就可以继续访问了。
四、Tomcat虚拟目录的映射方式
4.1虚拟目录的映射方式一:在server.xml文件的Host元素中配置(用的少)
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="/JavaWebApp" docBase="F:\JavaWebDemoProject" />
</Host>
其中Context表示上下文,代表一个web应用,包含2个属性:
a.path:/开头
b.docBase:配置虚拟目录对应磁盘上的Web应用所在的位置。
4.2 虚拟目录的映射方式二:自动映射
将web应用直接copy到tomcat的webapps目录中,tomcat会自动映射。