Tomcat的配置與在IDEA上使用Tomcat


 


1、Tomcat簡介

    講到Tomcat的使用,我就想起了我剛剛學習JavaWeb時的場景:

    老師:這節課我們來講一下JavaWeb中的服務器昂,它的名字叫Tomcat……..(然后我就發呆去了006DDA0B006DDA0B006DDA0B)

    我:沒辦法呀!下課只能去問大佬嘍。

    我:大佬大佬,剛剛老師上課講的服務器Tomcat是什么呀?怎么用呀?

    大佬:Tomcat是一個服務器,它可以用來處理客戶端的請求,並且將請求處理返回給客戶端,巴拉巴拉。

    我:006APoFYly1gch3jsbovnj305i052dgr

 

              沒辦法呀!只能去問度娘了嘍。

 

       所以Tomcat就是一個服務器,而且是本地的服務器,可以將我們的Java程序放在Tomcat服務器中,就可以用它來完成不同客戶端的請求和響應。當Tomcat啟動后,客戶端發送請求過來,通過在Tomcat上的Java程序完成請求,然后將處理的結果返回給客戶端。

image

 

      官方一點的介紹(百度百科里面的):

      Tomcat是Apache 軟件基金會(Apache Software Foundation)的Jakarta 項目中的一個核心項目,由Apache、Sun 和其他一些公司及個人共同開發而成。

      Tomcat 服務器是一個免費的開放源代碼的Web應用服務器(也是Servlet容器),屬於輕量級應用服務器,在中小型系統和並發訪問用戶不是很多的場合下被普遍使用,是開發和調試JSP 程序的首選。對於一個初學者來說,可以這樣認為,當在一台機器上配置好Apache 服務器,可利用它響應HTML(標准通用標記語言下的一個應用)頁面的訪問請求。實際上Tomcat是Apache 服務器的擴展,但運行時它是獨立運行的,所以當你運行tomcat 時,它實際上作為一個與Apache 獨立的進程單獨運行的。

 

2、Tomcat下載

      Tomcat的下載地址:http://tomcat.apache.org/

image

 

    可以發現Tomcat已經升級到Tomcat10的內測版本了,但是我們不需要那么新的,可以選擇Tomcat8或者Tomcat9的版本就行。那我這里就選擇Tomcat8版本吧,直接點擊進去。

image

   

      然后根據自己的電腦下載多少位的文件,相信大家應該都是64位的系統吧。

      下載之后解壓即可使用了。解壓后的目錄如下:

image

    下面我們來詳細的介紹各個文件夾的作用。

  1. bin目錄:主要是用來存放tomcat的可執行命令,比如啟動和停止。命令主要有兩大類:以.bat結尾的是windows命令、以.sh結尾的是linux命令。很多環境變量的設置都在此處,例如可以設置JDK路徑、TOMCAT路徑,startup 用來啟動tomcat,shutdown 用來關閉tomcat,修改catalina可以設置tomcat的內存。
  2. conf目錄:主要是用來存放tomcat的一些配置文件。例如端口設置,用戶信息配置等。
  3. lib目錄:主要用來存放tomcat運行需要加載的jar包。
  4. logs目錄:用來存放tomcat在運行過程中產生的日志文件,非常重要的是在控制台輸出的日志。(清空不會對tomcat運行帶來影響)
  5. temp目錄:用來讓用戶存放tomcat在運行過程中產生的臨時文件。(清空不會對tomcat運行帶來影響)
  6. webapps目錄:用來存放客戶端可以訪問的資源,比如Java程序,當tomcat啟動時會去加載webapps目錄下的應用程序。可以以文件夾、war包、jar包的形式發布應用。【核心目錄】
  7. work目錄:用來存放tomcat在運行時的編譯后文件,例如JSP編譯后的文件。清空work目錄,然后重啟tomcat,可以達到清除緩存的作用。

 

    在介紹一下conf目錄中一些關鍵文件:

  1. server.xml文件:該文件用於配置和server相關的信息,比如tomcat啟動的端口號、配置host主機、配置Context。【核心文件】
  2. web.xml文件:部署描述文件,這個web.xml中描述了一些默認的servlet,部署每個webapp時,都會調用這個文件,配置該web應用的默認servlet。
  3. tomcat-users.xml文件:配置tomcat的用戶密碼與權限。
  4. context.xml:定義web應用的默認行為。

 

   到此為止對Tomcat的基本介紹都已經講完了。那它的使用也是非常簡單,所以接下來就來啟動Tomcat吧。

   注意:在啟動tomcat之前,你需要安裝好JDK,並且配置好環境變量(這個不會去百度)。然后雙擊bin目錄下的startup.bat(如果一閃而過那就是你存放的路徑有問題,多半是因為中文路徑導致的)。

   啟動動之后如下圖:

image

   發現有亂碼,此時我們修改tomcat的conf目錄下的logging.properties中的參數。

   將 java.util.logging.ConsoleHandler.encoding = UTF-8 中的UTF-8改到GBK就行了保存后重啟tomcat就正常了。

image

   注意別修改其它行的編碼。

   然后在網頁中輸入localhost:8080就可以出現頁面了。

image

    這只是運行了一個空的Tomcat,如果需要Java程序,我只需要將項目打成War包然后拷貝到webapps目錄下,然后啟動Tomcat即可。

image

    啟動Tomcat服務,注意這里的訪問地址有所改變,需要在后面加一個項目名:http://localhost:8080/HelloTomcat/

image

    而我們開發軟件經常會用到開發工具如Eclipse、IDEA等,所以接下來介紹一下如何在開發工具上使用Tomcat。

3、在IDEA上使用Tomcat

在Eclipse中的使用就不說了,因為現在Eclipse大家用的越來越少。直接上IDEA吧。

打開IDEA創建一個HelloTomcat項目。

image

Next之后,輸入項目名稱就創建完成了。

那接下配置Tomcat。

點擊IDEA中的Add Configuration,或者打開菜單Run --> 選擇Edit Configuration 都可以。

彈出窗口后點擊+,然后往下滑,然后選擇Tomcat Server的Local(如果沒有Tomcat Server則點擊 items more)。

image

 

  點擊Local之后會出現如下界面:

image

  注意:不同的IDEA版本界面可能不同,但是大致操作都是一樣的。(我的IDEA2018款,我覺得沒必要追求最新版本,適合自己的才是最好的)

  然后就是在Tomcat中部署並運行項目,當我們配置完Tomcat后,IDEA下面會彈出一個界面。

  右擊Tomcat選擇Artifacts,然后將項目添加進去,在右擊Run就可以了。

image

  或者在Edit Configurations中,在建立的Tomcat容器中選擇Deployment ,點擊右邊的“+”號然后,選擇選擇Artifact。

image

然后在下面右擊Tomcat運行,就可以在瀏覽器中查看運行結果了。

 

 

  IDEA中的Tomcat熱部署

  熱部署就是應用正在運行的狀態下,修改了它的一些源碼后,可以在不重啟服務器的情況自動把增量內容編譯並部署到服務器上,使得修改立即生效。熱部署為了解決的問題有兩個, 一是在開發的時候,修改代碼后不需要重啟應用就能看到效果,大大提升開發效率;二是生產上運行的程序,可以在不停止運行的情況下進行升級,不影響用戶使用。

  要在IDEA中配置Tomcat熱部署非常的簡單,前提是有項目在Tomcat中。(否則會報404錯誤)

  在配置Tomcat中Server的配置里,有個on update action和on frame deactivation,我給他設置為update classes and resources。

image

     配置完后點擊Apply即可啟動你的tomcat,然后改一下jsp、java文件實驗熱部署配置是否成功。

     注意:IDEA熱部署並非絕對實時, 還是會有延時的,假如你手速快的話可能會出現改了並沒有馬上生效。所以此時不要懷疑熱部署沒有配置成功,稍微等一會你會看到開發工具左下角會有一個class reload的提示,出現這個提示才說明已經熱部。而且如果XML文件有改動的話是不會自動部署的

4、Tomcat的Server結構

在Tomcat中比較核心的一個文件就是conf目錄下的server.xml文件,它主要包含Tomcat一些核心配置文件,如:啟動端口,用戶配置,Context等,Tomcat的啟動首先就是加載這個文件。

我們打開server.xml看上去很復雜。其實大部分都是注釋。下面是一個簡圖說明了各組件之間的關系!

image

Tomcat包含的主要組件:服務器Server,服務Service,連接器Connector、引擎Engine、主機Host、上下文Context等。

Server.xml源文件:

<?xml version="1.0" encoding="UTF-8"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<!-- Note:  A "Server" is not itself a "Container", so you may not
     define subcomponents such as "Valves" at this level.
     Documentation at /docs/config/server.html
 -->
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <!-- Security listener. Documentation at /docs/config/listeners.html
  <Listener className="org.apache.catalina.security.SecurityListener" />
  -->
  <!--APR library loader. Documentation at /docs/apr.html -->
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <!-- Prevent memory leaks due to use of particular java/javax APIs-->
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <!-- Global JNDI resources
       Documentation at /docs/jndi-resources-howto.html
  -->
  <GlobalNamingResources>
    <!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
    -->
    <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>

  <!-- A "Service" is a collection of one or more "Connectors" that share
       a single "Container" Note:  A "Service" is not itself a "Container",
       so you may not define subcomponents such as "Valves" at this level.
       Documentation at /docs/config/service.html
   -->
  <Service name="Catalina">

    <!--The connectors can use a shared executor, you can define one or more named thread pools-->
    <!--
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="150" minSpareThreads="4"/>
    -->


    <!-- A "Connector" represents an endpoint by which requests are received
         and responses are returned. Documentation at :
         Java HTTP Connector: /docs/config/http.html
         Java AJP  Connector: /docs/config/ajp.html
         APR (HTTP/AJP) Connector: /docs/apr.html
         Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
    -->
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <!-- A "Connector" using the shared thread pool-->
    <!--
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    -->
    <!-- Define an SSL/TLS HTTP/1.1 Connector on port 8443
         This connector uses the NIO implementation. The default
         SSLImplementation will depend on the presence of the APR/native
         library and the useOpenSSL attribute of the
         AprLifecycleListener.
         Either JSSE or OpenSSL style configuration may be used regardless of
         the SSLImplementation selected. JSSE style configuration is used below.
    -->
    <!--
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true">
        <SSLHostConfig>
            <Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
                         type="RSA" />
        </SSLHostConfig>
    </Connector>
    -->
    <!-- Define an SSL/TLS HTTP/1.1 Connector on port 8443 with HTTP/2
         This connector uses the APR/native implementation which always uses
         OpenSSL for TLS.
         Either JSSE or OpenSSL style configuration may be used. OpenSSL style
         configuration is used below.
    -->
    <!--
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
               maxThreads="150" SSLEnabled="true" >
        <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
        <SSLHostConfig>
            <Certificate certificateKeyFile="conf/localhost-rsa-key.pem"
                         certificateFile="conf/localhost-rsa-cert.pem"
                         certificateChainFile="conf/localhost-rsa-chain.pem"
                         type="RSA" />
        </SSLHostConfig>
    </Connector>
    -->

    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <!--
    <Connector protocol="AJP/1.3"
               address="::1"
               port="8009"
               redirectPort="8443" />
    -->

    <!-- An Engine represents the entry point (within Catalina) that processes
         every request.  The Engine implementation for Tomcat stand alone
         analyzes the HTTP headers included with the request, and passes them
         on to the appropriate Host (virtual host).
         Documentation at /docs/config/engine.html -->

    <!-- You should set jvmRoute to support load-balancing via AJP ie :
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
    -->
    <Engine name="Catalina" defaultHost="localhost">

      <!--For clustering, please take a look at documentation at:
          /docs/cluster-howto.html  (simple how to)
          /docs/config/cluster.html (reference documentation) -->
      <!--
      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
      -->

      <!-- Use the LockOutRealm to prevent attempts to guess user passwords
           via a brute-force attack -->
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <!-- This Realm uses the UserDatabase configured in the global JNDI
             resources under the key "UserDatabase".  Any edits
             that are performed against this UserDatabase are immediately
             available for use by the Realm.  -->
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

        <!-- SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->

        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <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>
Server.xml

 

下面簡單介紹幾個常用組件:

(1)、Server組件:

   如上面示例文件中定義的:

01
< Server port=”8005” shutdown=”SHUTDOWN”>

    這會讓Tomcat啟動一個server實例(即一個JVM),它監聽在8005端口以接收shutdown命令。各Server的定義不能使用同一個端口,這意味着如果在同一個物理機上啟動了多個Server實例,必須配置它們使用不同的端口。這個端口的定義用於為管理員提供一個關閉此實例的便捷途徑,因此,管理員可以直接telnet至此端口使用SHUTDOWN命令關閉此實例。不過,基於安全角度的考慮,這通常不允許遠程進行。

   Server的相關屬性:

  • className: 用於實現此Server容器的完全限定類的名稱,默認為org.apache.catalina.core.StandardServer;

  • port: 接收shutdown指令的端口,默認僅允許通過本機訪問,默認為8005;

  • shutdown:發往此Server用於實現關閉tomcat實例的命令字符串,默認為SHUTDOWN;

 

(2)、Service組件:

Service主要用於關聯一個引擎和與此引擎相關的連接器,每個連接器通過一個特定的端口和協議接收入站請求交將其轉發至關聯的引擎進行處理。因此,Service要包含一個引擎、一個或多個連接器。

如上面示例中的定義:

01
< Service name=”Catalina”>

這定義了一個名為Catalina的Service,此名字也會在產生相關的日志信息時記錄在日志文件當中。

Service相關的屬性:

  • className: 用於實現service的類名,一般都是org.apache.catalina.core.StandardService。

  • name:此服務的名稱,默認為Catalina;

 

(3)、Connector組件

進入Tomcat的請求可以根據Tomcat的工作模式分為如下兩類:

  • Tomcat作為應用程序服務器:請求來自於前端的web服務器,這可能是Apache, IIS, Nginx等;

  • Tomcat作為獨立服務器:請求來自於web瀏覽器;

Tomcat應該考慮工作情形並為相應情形下的請求分別定義好需要的連接器才能正確接收來自於客戶端的請求。一個引擎可以有一個或多個連接器,以適應多種請求方式。

定義連接器可以使用多種屬性,有些屬性也只適用於某特定的連接器類型。一般說來,常見於server.xml中的連接器類型通常有4種:

  • HTTP連接器

  • SSL連接器

  • AJP 1.3連接器

  • proxy連接器

如上面示例server.xml中定義的HTTP連接器:

01
02
03
< Connector port="8080" protocol="HTTP/1.1"
   maxThreads="150" connectionTimeout="20000"
   redirectPort="8443"/>

定義連接器時可以配置的屬性非常多,但通常定義HTTP連接器時必須定義的屬性只有“port”,定義AJP連接器時必須定義的屬性只有"protocol",因為默認的協議為HTTP。以下為常用屬性的說明:

  • address:指定連接器監聽的地址,默認為所有地址,即0.0.0.0;

  • maxThreads:支持的最大並發連接數,默認為200;

  • port:監聽的端口,默認為0;

  • protocol:連接器使用的協議,默認為HTTP/1.1,定義AJP協議時通常為AJP/1.3;

  • redirectPort:如果某連接器支持的協議是HTTP,當接收客戶端發來的HTTPS請求時,則轉發至此屬性定義的端口;

  • connectionTimeout:等待客戶端發送請求的超時時間,單位為毫秒,默認為60000,即1分鍾;

  • enableLookups:是否通過request.getRemoteHost()進行DNS查詢以獲取客戶端的主機名;默認為true;

  • acceptCount:設置等待隊列的最大長度;通常在tomcat所有處理線程均處於繁忙狀態時,新發來的請求將被放置於等待隊列中;

下面是一個定義了多個屬性的SSL連接器:

01
02
03
04
< Connector port="8443"
  maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
  enableLookups="false" acceptCount="100" debug="0" scheme="https" secure="true"
  clientAuth="false" sslProtocol="TLS" />

 

(4)、Engine組件

Engine是Servlet處理器的一個實例,即servlet引擎,默認為定義在server.xml中的Catalina。Engine需要defaultHost屬性來為其定義一個接收所有發往非明確定義虛擬主機的請求的host組件。如前面示例中定義的:

01
< Engine name="Catalina" defaultHost="localhost">

常用的屬性定義:

  • defaultHost:Tomcat支持基於FQDN的虛擬主機,這些虛擬主機可以通過在Engine容器中定義多個不同的Host組件來實現;但如果此引擎的連接器收到一個發往非非明確定義虛擬主機的請求時則需要將此請求發往一個默認的虛擬主機進行處理,因此,在Engine中定義的多個虛擬主機的主機名稱中至少要有一個跟defaultHost定義的主機名稱同名;

  • name:Engine組件的名稱,用於日志和錯誤信息記錄時區別不同的引擎;

注,Engine容器中可以包含Realm、Host、Listener和Valve子容器。

 

(5)、Host組件

位於Engine容器中用於接收請求並進行相應處理的主機或虛擬主機,如前面默認配置文件中定義:

01
02
03
04
< Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
</ Host >

常用屬性說明:

  • appBase:此Host的webapps目錄,即存放非歸檔的web應用程序的目錄或歸檔后的WAR文件的目錄路徑;可以使用基於$CATALINA_HOME的相對路徑;

  • autoDeploy:在Tomcat處於運行狀態時放置於appBase目錄中的應用程序文件是否自動進行deploy;默認為true;

  • unpackWars:在啟用此webapps時是否對WAR格式的歸檔文件先進行展開;默認為true;

下面是虛擬主機定義示例:

01
02
03
04
05
06
07
08
09
10
< Engine name="Catalina" defaultHost="localhost">
  < Host name="localhost" appBase="webapps">
  < Context path="" docBase="ROOT"/>
  < Context path="/bbs" docBase="/web/bss"
   reloadable="true" crossContext="true"/>
  </ Host >
  < Host name="mail.test.com" appBase="/web/mail">
  < Context path="" docBase="ROOT"/>
  </ Host >
</ Engine >

主機別名定義:

如果一個主機有兩個或兩個以上的主機名,額外的名稱均可以以別名的形式進行定義,如下:

01
02
03
< Host name="www.test.com" appBase="webapps" unpackWARs="true">
  < Alias >test.com</ Alias >
</ Host >

 

(6)、Context組件

Context組件是最內層次的組件,它表示Web應用程序本身。配置一個Context最主要的是指定Web應用程序的根目錄,以便Servlet容器能夠將用戶請求發往正確的位置。Context組件也可包含自定義的錯誤頁,以實現在用戶訪問發生錯誤時提供友好的提示信息。Context在某些意義上類似於apache中的路徑別名,一個Context定義用於標識tomcat實例中的一個Web應用程序;如下面的定義:

01
02
03
04
05
06
07
08
09
10
11
<!-- Tomcat Root Context -->
< Context path="" docBase="/web/webapps"/>
<!-- buzzin webapp -->
< Context path="/bbs"
  docBase="/web/threads/bbs"
  reloadable="true">
</ Context >
<!-- chat server -->
  < Context path="/chat" docBase="/web/chat"/>
<!-- darian web -->
< Context path="/darian" docBase="darian"/>

在Tomcat中,每一個context定義也可以使用一個單獨的XML文件進行,其文件的目錄為$CATALINA_HOME/conf/<engine name>/<host name>。可以用於Context中的XML元素有Loader,Manager,Realm,Resources和WatchedResource。

常用的屬性定義有:

  • docBase:相應的Web應用程序的存放位置;也可以使用相對路徑,起始路徑為此Context所屬Host中appBase定義的路徑;切記,docBase的路徑名不能與相應的Host中appBase中定義的路徑名有包含關系,比如,如果appBase為deploy,而docBase絕不能為deploy-bbs類的名字;

  • path:相對於Web服務器根路徑而言的URI;如果為空“”,則表示為此webapp的根路徑;如果context定義在一個單獨的xml文件中,此屬性不需要定義;

  • reloadable:是否允許重新加載此context相關的Web應用程序的類;默認為false;

 

(7)、Realm組件
一個Realm表示一個安全上下文,它是一個授權訪問某個給定Context的用戶列表和某用戶所允許切換的角色相關定義的列表。因此,Realm就像是一個用戶和組相關的數據庫。定義Realm時惟一必須要提供的屬性是classname,它是Realm的多個不同實現,用於表示此Realm認證的用戶及角色等認證信息的存放位置。

  • JAASRealm:基於Java Authintication and Authorization Service實現用戶認證;

  • JDBCRealm:通過JDBC訪問某關系型數據庫表實現用戶認證;

  • JNDIRealm:基於JNDI使用目錄服務實現認證信息的獲取;

  • MemoryRealm:查找tomcat-user.xml文件實現用戶信息的獲取;

  • UserDatabaseRealm:基於UserDatabase文件(通常是tomcat-user.xml)實現用戶認證,它實現是一個完全可更新和持久有效的MemoryRealm,因此能夠跟標准的MemoryRealm兼容;它通過JNDI實現;

下面是一個常見的使用UserDatabase的配置:

01
02
03
04
05
06
07
08
09
10
< Realm className=”org.apache.catalina.realm.UserDatabaseRealm”
  resourceName=”UserDatabase”/>
下面是一個使用JDBC方式獲取用戶認證信息的配置:
  < Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"
  driverName="org.gjt.mm.mysql.Driver"
  connectionURL="jdbc:mysql://localhost/authority"
  connectionName="test" connectionPassword="test"
  userTable="users" userNameCol="user_name"
  userCredCol="user_pass"
  userRoleTable="user_roles" roleNameCol="role_name" />

 

(8)、Valve組件

Valve類似於過濾器,它可以工作於Engine和Host/Context之間、Host和Context之間以及Context和Web應用程序的某資源之間。一個容器內可以建立多個Valve,而且Valve定義的次序也決定了它們生效的次序。Tomcat中實現了多種不同的Valve:

  • AccessLogValve:訪問日志Valve

  • ExtendedAccessValve:擴展功能的訪問日志Valve

  • JDBCAccessLogValve:通過JDBC將訪問日志信息發送到數據庫中;

  • RequestDumperValve:請求轉儲Valve;

  • RemoteAddrValve:基於遠程地址的訪問控制;

  • RemoteHostValve:基於遠程主機名稱的訪問控制;

  • SemaphoreValve:用於控制Tomcat主機上任何容器上的並發訪問數量;

  • JvmRouteBinderValve:在配置多個Tomcat為以Apache通過mod_proxy或mod_jk作為前端的集群架構中,當期望停止某節點時,可以通過此Valve將用記請求定向至備用節點;使用此Valve,必須使用JvmRouteSessionIDBinderListener;

  • ReplicationValve:專用於Tomcat集群架構中,可以在某個請求的session信息發生更改時觸發session數據在各節點間進行復制;

  • SingleSignOn:將兩個或多個需要對用戶進行認證webapp在認證用戶時連接在一起,即一次認證即可訪問所有連接在一起的webapp;

  • ClusterSingleSingOn:對SingleSignOn的擴展,專用於Tomcat集群當中,需要結合ClusterSingleSignOnListener進行工作;

RemoteHostValve和RemoteAddrValve可以分別用來實現基於主機名稱和基於IP地址的訪問控制,控制本身可以通過allow或deny來進行定義,這有點類似於Apache的訪問控制功能;如下面的Valve則實現了僅允許本機訪問/probe:

01
02
03
04
< Context path="/probe" docBase="probe">
< Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.0\.0\.1"/>
</ Context >

其中相關屬性定義有:

  • className:相關的java實現的類名,相應於分別應該為org.apache.catalina.valves.RemoteHostValve或org.apache.catalina.valves.RemoteAddrValve;

  • allow:以逗號分開的允許訪問的IP地址列表,支持正則表達式,因此,點號“.”用於IP地址時需要轉義;僅定義allow項時,非明確allow的地址均被deny;

  • deny: 以逗號分開的禁止訪問的IP地址列表,支持正則表達式;使用方式同allow;

 

   Tomcat Server處理一個HTTP請求的過程:

  1. 用戶點擊網頁內容,請求被發送到本機端口8080,被在那里監聽的Coyote HTTP/1.1 Connector獲得。
  2. Connector把該請求交給它所在的Service的Engine來處理,並等待Engine的回應。
  3. Engine獲得請求localhost/test/index.jsp,匹配所有的虛擬主機Host。
  4. Engine匹配到名為localhost的Host(即使匹配不到也把請求交給該Host處理,因為該Host被定義為該Engine的默認主機),名為localhost的Host獲得請求/test/index.jsp,匹配它所擁有的所有的Context。Host匹配到路徑為/test的Context(如果匹配不到就把該請求交給路徑名為“ ”的Context去處理)。
  5. path=“/test”的Context獲得請求/index.jsp,在它的mapping table中尋找出對應的Servlet。Context匹配到URL PATTERN為*.jsp的Servlet,對應於JspServlet類。
  6. 構造HttpServletRequest對象和HttpServletResponse對象,作為參數調用JspServlet的doGet()或doPost().執行業務邏輯、數據存儲等程序。
  7. Context把執行完之后的HttpServletResponse對象返回給Host。
  8. Host把HttpServletResponse對象返回給Engine。
  9. Engine把HttpServletResponse對象返回Connector。
  10. Connector把HttpServletResponse對象返回給客戶Browser。

 

參考資料:

https://blog.51cto.com/freeloda/1299644

https://blog.csdn.net/u014231646/article/details/79482195

 

出處:https://www.cnblogs.com/tanghaorong/p/12690687.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM