Tomcat学习一--入门

一、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 &quot;%r&quot; %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会自动映射。                      

猜你喜欢

转载自blog.csdn.net/qq_39527230/article/details/83098441