Tomcat詳解

Michael_DD發表於2014-12-11
Tomcat詳解


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
一、Tomcat簡介
 
1、Tomcat
   
Tomcat在嚴格意義上並不是一個真正的應用伺服器,它只是一個可以支援執行Serlvet/JSP的Web容器,
不過Tomcat也擴充套件了一些應用伺服器的功能,如JNDI,資料庫連線池,使用者事務處理等等。

Tomcat是Apache組織下Jakarta專案下的一個子專案,目前Tomcat被非常廣泛的應用在中小規模的Java Web應用中。

Tomcat 是一種具有JSP環境的Servlet容器。Servlet容器是代替使用者管理和呼叫 Servlet的執行時外殼。
作為一個開放原始碼的軟體, Jakarta -Tomcat有著自己獨特的優勢:

首先,它容易得到。事實上,任何人都可以從網際網路上自由地下載這個軟體。
無論從還是從其他網站(Jakarta Tomcat是Apache軟體基金會開發的一個開放原始碼的應用伺服器)。

其次,對於開發人員,特別是Java開發人員,Tomcat提供了全部的原始碼,包括Servlet引擎、JSP引擎、HTTP伺服器。
無論是對哪一方面感興趣的程式設計師,都可以從這些由世界頂尖的程式設計師書寫的程式碼中獲得收益。

最後,由於原始碼的開放及世界上許多程式設計師的卓有成效的工作, Tomcat已經可以和大部分的主流伺服器一起工作,
而且是以相當高的效率一起工作。如:以模組的形式被載入Apache,以ISAPI形式被載入IIS或PWS,
以NSAPI的形式被載入Netscape Enterprise Server。

由於Java的跨平臺特性,基於Java的Tomcat也具有跨平臺性。
 
 


2、Tomcat5.0包含三個主要的部分
 
包括:
* Catalina - 一個符合Servlet API規範2.3的Servlet Container
* Jasper - 一個符合JSP規範1.2的JSP編譯器和執行環境
* Webapps - Tomcat中包含的一些例子和用於測試的web例程,以及相關文件。
 


 
3、應用伺服器(如WebLogic)與Tomcat有何區別。
 
       應用伺服器提供更多的J2EE特徵,如EJB,JMS,JAAS等,同時也支援Jsp和Servlet。
       而Tomcat則功能沒有那麼強大,它不提供EJB等支援。但如果與JBoss(一個開源的應用伺服器)整合到一塊,則可以實現J2EE的全部功能。
 
 
4、Tomcat 目錄的結構
 
(1)Tomcat的安裝
 
    其實對於完全由Java寫成的Tomcat,Win32版本和Linux版本沒有多大區別,比如Linux版本,在Solaris下也沒有問題。這裡,主要以Win32版本作為示例。
注意:在安裝使用Tomcat之前,先安裝JDK,最好是Sun的JDK 1 .2 以上版。
 
(2)Tomcat的目錄結構
 
首先,下載jakarta-tomcat.zip包,解壓縮到一個目錄下,如:“c:/tomcat”。這時,會得到如下的Tomcat的目錄結構:
- - - jakarta - tomcat
| - - - bin             Tomcat執行指令碼目錄
| - - - Common          放置一些通用類(如JDBC的驅動程式等)
| - - - conf               Tomcat配置檔案
| - - - doc                 Tomcat文件
| - - - lib                 Tomcat執行需要的庫檔案(JARS)
| - - - logs               Tomcat執行時的LOG檔案
| - - - src            Tomcat的原始碼
| - - - webapps             Tomcat的主要Web釋出目錄(存放我們自己的JSP,SERVLET,類)
| - - - work            Tomcat的工作目錄,Tomcat將翻譯JSP檔案到的Java檔案和class檔案放在這裡。

目 錄 名
該目錄內的檔案的一般功能描述
bin
包含有Startup.bat(啟動伺服器)與shutdown.bat(關閉伺服器)檔案
conf
包含設定部署在Tomcat上的Web應用的變數的初始值的設定檔案,包括 server.xml (Tomcat的全域性配置檔案)
和 web.xml (為不同的Tomcat配置的web應用設定預設值的檔案)
doc
包含關於Tomcat的各種各樣的文件。
common
在其lib目錄下,主要存放如JDBC的驅動程式等
lib
包含被Tomcat使用的各種各樣的jar檔案。在UNIX上,任何這個目錄中的檔案將被附加到Tomcat的classpath中。
logs
Tomcat的log檔案。
src
servlet API的原始檔。
webapps
包含Web應用的程式 (JSP、Servlet和JavaBean等)
work
由Tomcat自動生成,這是Tomcat放置它執行期間的中間(intermediate)檔案(諸如編譯的JSP檔案)地方。
如果當Tomcat執行時,你刪除了這個目錄那麼將不能夠執行包含JSP的頁面。
 


(3)、各個目錄下所應該存放的檔案:按照Tomcat的規範,Tomcat的Web應用程式應該由如下目錄組成

         頁面內容等檔案的存放位置:*.html, *.jsp等可以有許多目錄層次,由使用者的網站結構而定,
實現的功能應該是網站的介面,也就是使用者主要的可見部分。除了HTML檔案、JSP檔案外,
還有js(JavaScript)檔案和css(樣式表)檔案以及其他多媒體檔案等。
 
        Web-INF/web.xml這是一個Web應用程式的描述檔案。這個檔案是一個XML檔案,
描述了Servlet和這個Web應用程式的其他元件資訊,此外還包括一些初始化資訊和安全約束等等。
 
Web-INF/classes/這個目錄及其下的子目錄應該包括這個Web應用程式的所有JavaBean及Servlet等編譯好的Java類檔案
(*.class)檔案,以及沒有被壓縮打入JAR包的其他class檔案和相關資源。注意,在這個目錄下的Java類
應該按照其所屬的包層次組織目錄(即如果該*.class檔案具有包的定義,
則該*.class檔案應該放在./WEB-INF/classes/包名下)。
 
 
 
 
通常Web-INF/classes/這個目錄下的類檔案也可以打包成JAR檔案,並可以放到WEB-INF下的lib目錄下。
如將 classes目錄下的各個*.class檔案打包成WebMis.jar檔案(jar cvf WebMis.jar *.*)
 
注意:
(1)WEB-INF目錄中包含應用軟體所使用的資源,但是WEB-INF卻不在公共文件根目錄之中。在這個目錄中所包含的檔案都不能被客戶機所訪問。
(2)類目錄中(在WEB-INF下)包含執行Web應用程式時所需的Servlets,Beans等類。
(3)lib目錄(在WEB-INF下)包含有Java archive files (JARs),例如標籤庫或者Servlets,Beans等類的*.jar檔案。
(4)如果一個類出現在JAR檔案中同時也出現在類的目錄中,類載入器會載入位於類目錄中的那一個。
 
common/lib/ 這個目錄下包含了所有壓縮到JAR檔案中的類檔案和相關檔案。比如:第三方提供的Java庫檔案、JDBC驅動程式等。
         其中msbase.jar、mssqlserver.jar、msutil.jar檔案為SqlServer2000的JDBC驅動程式
         其中servlet-api.jar和jsp-api.jar為Servlet和JSP的API所在的包





+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
二、Tomcat的環境配置
 
 
1、啟動Tomcat
 
在Bin目錄下,有一個名為startup.bat的指令碼檔案,執行這個指令碼檔案,就可以啟動Tomcat伺服器,不過,在啟動伺服器之前,還需要進行一些設定。
         首先,設定系統的環境變數。
         TOMCAT_HOME(或者:CATALINA_HOME)值:
d:/jakarta-tomcat-5.0.16 (用TOMCAT_HOME指示Tomcat根目錄,下面以Tomcat 5.0.16版為例)。
         JAVA_HOME值:
c:/j2sdk1.4.0(用JAVA_HOME指示jdk1.4的安裝目錄)。

注意:對於設定Windows的系統環境變數,可以開啟控制皮膚中的“系統”程式;
在“系統環境變數”中增加兩個環境變數專案JAVA_HOME(最好為大寫)指向JDK的目錄和TOMCAT_HOME(最好為大寫)指向所安裝的tomcat的目錄。
 
 
 
2、啟動和關閉Tomcat伺服器
 
(1)啟動Tomcat伺服器:執行在Bin目錄下的名為startup.bat的指令碼檔案可以啟動Tomcat伺服器
 
現在可以執行TOMCAT並作為一個獨立的Servlet容器。
 
 
(2)測試Tomcat的伺服器啟動與否:
可以在瀏覽器中輸入,是否出現如下內容。
 
 
(3)啟動本站點的JSP頁面:在Tomcat中的JSP檔案和JavaBean程式的存放位置
         JSP檔案放在“Webapps/站點名稱”的目錄下
         自定義的JavaBean程式*.java檔案(可以不需要它)及*.class類檔案存放在“Webapps/站點名稱/ WEB-INF/classes/”目錄下
因此,將*.jsp檔案複製到“TOMCAT_HOME/Webapps/站點名稱”目錄下,然後輸入其URL地址
 
(4)關閉Tomcat伺服器:執行在Bin目錄下的名為shutdown.bat的指令碼檔案可以終止Tomcat伺服器。


 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
三、配置Tomcat伺服器
 
1、概述
   
Tomcat為使用者提供了一系列的配置檔案來幫助使用者配置自己的Tomcat,Tomcat的配置檔案主要是基於XML的;如server.xml、web.xml等,
下面將詳細討論Tomcat的主要配置檔案以及如何利用這些配置檔案解決常見問題。
 




2、server.xml 主配置檔案
 
server.xml是Tomcat的主配置檔案,主要完成如下兩個目標:
          提供Tomcat元件的初始配置;
          說明Tomcat的結構,含義,使得Tomcat透過例項化元件完成起動及構建自身。
觀察server.xml,可以發現其中有如下的一些元素。
 
(1)Server元素:
 
Server元素是server.xml檔案的最高階別的元素, Server元素描述一個Tomcat伺服器,一般來說使用者不用關心這個元素。
一個Server元素一般會包括Logger和ContextManager兩個元素

Logger:Logger元素定義了一個日誌物件,一個日誌物件包含有如下屬性:
1) name:表示這個日誌物件的名稱。
2) path:表示這個日誌物件包含的日誌內容要輸出到哪一個日誌檔案。
3) verbosityLevel:表示這個日誌檔案記錄的日誌的級別。
一般來說,Logger物件是對Java Servlet、JSP和Tomcat執行期事件的記錄

        ContextManager:ContextManager定義了一組ContextInterceptors(ContextManager的事件監聽器) ,
    RequestInterceptors(的事件監聽器)、Contexts(Web應用程式的上下文目錄)和它們的Connectors(聯結器)的結構和配置。
    ContextManager包含如下一些屬性:

1) debug:記錄日誌記錄除錯資訊的等級。
2) home:webapps /、conf /、logs /和所有Context的根目錄資訊。這個屬性的作用是從一個不同於TOMCAT _ HOME的目錄啟動Tomcat。
3) workDir:Tomcat工作目錄。

ContextInterceptor 和RequestInterceptors兩者都是監聽ContextManager的特定事件的攔截器。ContextInterceptor監聽Tomcat的啟動和結束事件資訊。
而RequestInterceptors監聽使用者對伺服器發出的請求資訊。一般使用者無需關心這些攔截器,對於開發人員需要了解這就是全域性性的操作得以實現的方法
 

(2)Connector元素:
 
Connector(聯結器)元素描述了一個到使用者的連線,不管是直接由Tomcat到使用者的瀏覽器還是透過一個Web伺服器。
Tomcat的工作程式和由不同的使用者建立的連線傳來的讀/寫資訊和請求/答覆資訊都是由聯結器物件管理的。
對聯結器物件的配置中應當包含管理類、TCP/IP埠等內容。
 
(3)Context元素:
 
每一個Context都描述了一個Tomcat的Web應用程式的目錄。這個物件包含以下屬性:
1)docBase。這是Context的目錄。可以是絕對目錄也可以是基於ContextManage的根目錄的相對目錄。
2)path。這是Context在Web服務時的虛擬目錄位置和目錄名。
3)debug。日誌記錄的除錯資訊記錄等級。
4)reloadable。這是為了方便Servlet的開發人員而設定的,當這個屬性開關開啟的時候,Tomcat將檢查Servlet是否被更新而決定是否自動重新載入它
 




3、配置例項:開啟Tomcat下的conf資料夾下的server.xml檔案
 
(1)改變Tomcat伺服器的埠號
需要使用Connector 元素,Connector表示一個到使用者的聯接,不管是透過web伺服器或直接到使用者瀏覽器(在一個獨立配置中)。
Connector負責管理Tomcat的工作執行緒和讀/寫連線到不同使用者的埠的請求/響應。
Connector的配置包含如下資訊:控制程式碼類、控制程式碼監聽的TCP/IP埠、控制程式碼伺服器埠的TCP/IP的backlog。
修改後,必須重新啟動Tomcat的伺服器。
 
 
注意:可以將埠號改變為80,單要保證80埠沒有被佔用;另外,也可以同時分配兩個埠號,只要產生兩個Connector的配置資訊。
    <!-- Define a non-SSL Coyote HTTP/1.1 Connector on port 8080 --&gt
        enableLookups="false" redirectPort="8443" acceptCount="100"  debug="0" connectionTimeout="20000"  disableUploadTimeout="true" />
              
    <!-- Define a non-SSL Coyote HTTP/1.1 Connector on port 8000 --&gt
    enableLookups="false" redirectPort="8443" acceptCount="100"  debug="0" connectionTimeout="20000"  disableUploadTimeout="true" />
 
(2)增加新的虛擬目錄並指向物理目錄
 
設立一個虛擬工作目錄是比較簡單的,只需要在server.xml檔案中新增一個Context物件就可以了。
如,要在webapps/下增加一個WebMis資料夾以存放jsp頁面檔案,並且讓使用者可以使用虛擬目錄訪問,
則:需要使用Context 元素,每個Context提供一個指向你放置你Web專案的Tomcat的下屬目錄。每個Context包含如下配置:  
         Context放置的路徑,可以是與ContextManager主目錄相關的路徑;
         紀錄除錯資訊的除錯級別;
        可過載的標誌,開發Servlet時,過載更改後的Servlet。

這是一個非常便利的特性,你可以除錯或用Tomcat測試新程式碼而不用停止或重新啟動Tomcat。要開啟過載,把reloadable設為true即可。
 
其中:path="/WebMis"說明其相對web URL的路徑,是一個虛擬的路徑,如:,docBase="WebMis"
說明其相對webapps的位置,是物理存在的目錄,同時需要在webapps/下增加一個WebMis物理資料夾。
 
 
 
 
(3)  加入自己的日誌檔案
 
新增Logger物件就可以加入自己的日誌檔案,新增工作相當簡單,只需要將作為示例的Logger物件複製一份,
然後修改一下前面介紹的幾個屬性就可以了。在設定了Logger以後,
就可以在自己的Servlet中使用ServletContext.log()方法來建立自己的日誌檔案。
 



4、配置例項:開啟conf資料夾下的web.xml檔案
 
(1)web.xml檔案:它包含了描述整個Web應用程式(Web應用程式由一整套Web檔案jsp、servlet、html、jpg、gif、class等組成)的資訊。
下面以一個web.xml檔案為例,講解裡面的各個物件。
 
br /> "">

My Web Application
在這裡加入Web應用程式的描述資訊
下面定義了Web應用程式的初始化引數,在JSP或Servlet檔案中使用下面的語句
來得到初始化引數
String value =
getServletContext().getInitParameter("name");
這裡可以定義任意多的初始化引數
--&gt

webmaster
myaddress@mycompany.com
這裡包含了初始化引數的描述

下面的定義描述了組成這個Web應用程式的Servlet,還包含初始化引數。在Tomcat中,也可以將放在Web-INF/classes中的Servlet直接以servlet/Servlet名訪問,
但是一般來說,不推薦這樣使用。而且這樣的使用方法還會導致Servlet的相關資源組織的複雜性。所以一般來說推薦將所有的Servlet在這裡定義出來。
初始化引數可以在Servlet中使用如下語句來獲得:
String value =getServletConfig().getInitParameter("name");
--&gt

controller
這裡加入這個Servlet的描述
com.mycompany.mypackage.ControllerServlet

listOrders
com.mycompany.myactions.ListOrdersAction


saveCustomer
com.mycompany.myactions.SaveCustomerAction

伺服器啟動後這個Servlet載入的時間
--&gt
5


graph
這個Servlet的描述

Servlet對映對應了一個特殊的URI請求到一個特殊的Servlet的關係
--&gt

controller
*.do


graph
/graph

設定預設的Session過期時間(單位為分)
--&gt

30


(2)配置例項:會話(session)超時修改,修改conf/web.xml中的如下資料值(單位為分)
 
5、在Tomcat中實現利用JDBC驅動程式訪問SQLServer2000資料庫
 
只需要將SQLServer2000的JDBC驅動程式的三個*.jar(msbase.jar、mssqlserver.jar和msutil.jar)檔案放在/common/lib目錄下,然後在*.java程式中訪問它。
 





+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
四、在Tomcat5中配置連線池和資料來源
 
1、DataSource介面介紹
 
(1)DataSource 概述
JDBC1.0原來是用DriverManager類來產生一個對資料來源的連線。JDBC2.0用一種替代的方法,使用DataSource的實現,程式碼變的更小巧精緻,也更容易控制。
一個DataSource物件代表了一個真正的資料來源。根據DataSource的實現方法,資料來源既可以是從關聯式資料庫,也電子表格,還可以是一個表格形式的檔案。
當一個DataSource物件註冊到名字服務中(JNDI),應用程式就可以透過名字服務獲得DataSource物件,並用它來產生一個與DataSource代表的資料來源之間的連線。
javax.sql包中的DataSource介面,可以採用三種實現形式:簡單的實現(只提供Connection物件)、連線池形式的實現和分散式事務形式的實現。
javax.sql包中的ConnectionPoolDataSource提供對連線池實現的介面。

(2)使用DataSource的優點
DataSource與DriverManager的不同
關於資料來源的資訊和如何來定位資料來源,例如資料庫伺服器的名字,在哪臺機器上,埠號等等,都包含在DataSource物件的屬性裡面去了。
這樣,對應用程式的設計來說是更方便了,因為並不需要硬性的把驅動的名字寫死到程式裡面去。通常驅動名字中都包含了驅動提供商的名字,
而在DriverManager類中通常是這麼做的。

可移植性
如果資料來源要移植到另一個資料庫驅動中,程式碼也很容易做修改。所需要做的修改只是更改DataSource的相關的屬性。而使用DataSource物件的程式碼不需要做任何改動。


(3)配置DataSource
主要包括設定DataSource的屬性,然後將它註冊到JNDI名字服務中去。在註冊DataSource物件的的過程中,系統管理員需要把DataSource物件和一個邏輯名字關聯起來。
名字可以是任意的,通常取成能代表資料來源並且容易記住的名字。
在下面的例子中,名字起為:WebMisDB,按照慣例,邏輯名字通常都在jdbc的子上下文中。這樣,邏輯名字的全名就是:jdbc/WebMisDB。

(4)產生一個與資料來源的連線
一旦配置好了資料來源物件,應用程式設計者就可以用它來產生一個與資料來源的連線。下面的程式碼片段示例瞭如何用JNDI上下文獲得一個資料來源物件,
然後如何用資料來源物件產生一個與資料來源的連線。開始的兩行用的是JNDI API,第三行用的才是JDBC的API:
  Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("jdbc/WebMisDB");
Connection con = ds.getConnection("myPassword", "myUserName");
  在一個基本的DataSource實現中,DataSource.getConnection方法返回的Connection物件和用DriverManager.getConnection方法返回的Connection物件是一樣的。
因為DataSource提供的方便性,我們推薦使用DataSource物件來得到一個Connection物件。

(5)DataSource的應用場合
對於普通的應用程式設計者,是否使用DataSource物件只是一個選擇問題。但是,對於那些需要用的連線池或者分散式的事務的應用程式設計者來說,
就必須使用DataSource物件來獲得Connection。需要注意的是對Tomcat而言,在JNDI的名稱前面應該加上"java:comp/env/"

(6)資料來源(DataSource)的作用
它相當於客戶端程式和連線池的中介,想要獲得連線池中的連線物件,必須建立一個與該連線池相應的資料來源,然後透過該資料來源獲得連線。


2、JNDI(JAVA NAMING AND DIRECTORY INTERFACE---Java 命名和目錄介面)

(1)JNDI簡介
分散式計算環境通常使用命名和目錄服務來獲取共享的元件和資源。命名和目錄服務將名稱與位置、服務、資訊和資源關聯起來。
它是一個為JAVA應用程式提供命名服務的應用程式程式設計介面(API)。
命名服務提供了一種為物件命名的機制,這樣你就可以在無需知道物件位置的情況下獲取和使用物件。
只要該物件在命名伺服器上註冊過,且你必須知道命名伺服器的地址和該物件在命名伺服器上註冊的JNDI名。
就可以找到該物件,獲得其引用,從而運用它提供的服務。
命名服務提供名稱—物件的對映。目錄服務提供有關物件的資訊,並提供定位這些物件所需的搜尋工具。

Java 命名和目錄介面或 JNDI 提供了一個用於訪問不同的命名和目錄服務的公共介面(JAVA API)。
運用一個命名服務來查詢與一個特定名字相關的一個物件,JDBC可以用JNDI來訪問一個關聯式資料庫。

(2)獲得JNDI的初始環境
在JNDI中,在目錄結構中的每一個結點稱為Context 。每一個JNDI名字都是相對於Context 的。
這裡沒有絕對名字的概念存在。對一個應用來說,它可以透過使用InitialContext 類來得到其第一個Context:
Context  ctx = new InitialContext ();
應用可以透過這個初始化的Context經由這個目錄樹來定位它所需要的資源或物件。
InitialContext在網頁應用程式初始化時被設定,用來支援網頁應用程式元件。
所有的入口和資源都放在JNDI名稱空間裡的java:comp/env段裡。

(3)查詢已繫結的物件
用ctx..lookup(String name); 根據name找物件
例:
import javax.naming.*;
public class TestJNDI
{    
public static void main(String[] args)
{
        try
{
        Context ctx=new InitialContext();
        Object object=ctx.lookup(“JNDIName”);       //根據JNDI名查詢繫結的物件
        String str=(String) object;                                 //強制轉換
        }
catch(NamingException e)
{    e.printStackTrace();
        }
catch(ClassCastException e)
{    e.printStackTrace();
        }
   }
}
 
3、資料庫連線池技術
 
(1)傳統的Web資料庫程式設計模式
 
在主程式(如Servlet、Beans)中建立資料庫連線。
進行SQL操作,取出資料。
斷開資料庫連線。

使用這種模式開發,存在很多問題。

首先,我們要為每一次WEB請求(例如察看某一篇文章的內容)建立一次資料庫連線,對於一次或幾次操作來講,或許你覺察不到系統的開銷,
但是,對於WEB程式來講,即使在某一較短的時間段內,其操作請求數也遠遠不是一兩次,而是數十上百次
(想想全世界的網友都有可能在您的網頁上查詢資料),在這種情況下,系統開銷是相當大的。
事實上,在一個基於資料庫的WEB系統中,建立資料庫連線的操作將是系統中代價最大的操作之一。
很多時候,可能您的網站速度瓶頸就在於此。

其次,使用傳統的模式,你必須去管理每一個連線,確保他們能被正確關閉,如果出現程式異常而導致某些連線未能關閉,
將導致資料庫系統中的記憶體洩露,最終我們將不得不重啟資料庫。

頻繁的建立、關閉連線,會極大的減低系統的效能,因為對於連線的使用成了系統效能的瓶頸。
 

(2)資料庫連線是一種關鍵的有限的昂貴的資源
 
這一點在多使用者的網頁應用程式中體現得尤為突出。對資料庫連線的管理能顯著影響到整個應用程式的伸縮性和健壯性,影響到程式的效能指標。
資料庫連線池正是針對這個問題提出來的。

連線池是這麼一種機制,當應用程式關閉一個Connection的時候,這個連線被回收,而不是被destroy,因為建立一個連線是一個很費資源的操作。
如果能把回收的連線重新利用,會減少新建立連線的數目,顯著的提高執行的效能。
該策略的核心思想是:連線複用。

透過採用連線池的方法,伺服器在啟動時先開啟一定數量的連線。當應用需要連線時,就可以從伺服器請求一個連線。
當應用結束該連線時,伺服器就把它釋放到連線池,以備其他客戶機使用。

客戶獲得連線並訪問資料庫以後結束
客戶獲得連線並訪問資料庫以後結束
客戶獲得連線並訪問資料庫以後結束
開始
停止服務嗎

產生新的連線
等待引入的連線
結束


伺服器監聽客戶的連線請求                    
客戶獲得連線
 
(3)連線池的主要作用
減少了建立和釋放資料庫連線的消耗
資料庫連線池負責分配、管理和釋放資料庫連線,它允許應用程式重複使用一個現有的資料庫連線,而再不是重新建立一個;
釋放空閒時間超過最大空閒時間的資料庫連線來避免因為沒有釋放資料庫連線而引起的資料庫連線遺漏。這項技術能明顯提高對資料庫操作的效能。
封裝使用者資訊  使用連線池可以封裝連線資料庫系統所用的使用者資訊(帳號和密碼),這樣客戶端程式在建立連線時不用考慮安全資訊。

(4)資料庫連線池的工作原理
當程式中需要建立資料庫連線時,只須從記憶體中取一個來用而不用新建。同樣,使用完畢後,只需放回記憶體即可。
而連線的建立、斷開都有連線池自身來管理。同時,我們還可以透過設定連線池的引數來控制連線池中的連線數、每個連線的最大使用次數等等
 
 
 
(5)資料庫連線池的最小連線數和最大連線數
資料庫連線池的最小連線數和最大連線數的設定要考慮到下列幾個因素:

最小連線數是連線池一直保持的資料庫連線,所以如果應用程式對資料庫連線的使用量不大,將會有大量的資料庫連線資源被浪費;
最大連線數是連線池能申請的最大連線數,如果資料庫連線請求超過此數,後面的資料庫連線請求將被加入到等待佇列中,這會影響之後的資料庫操作。

如果最小連線數與最大連線數相差太大,那麼最先的連線請求將會獲利,之後超過最小連線數量的連線請求等價於建立一個新的資料庫連線。
不過,這些大於最小連線數的資料庫連線在使用完不會馬上被釋放,它將被放到連線池中等待重複使用或是空閒超時後被釋放。

(6)使用連線池得到連線
  假設應用程式需要建立到一個名字為EmpolyeeDB的DataSource的連線。使用連線池得到連線的程式碼如下:
  Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("jdbc/EmployeeDB");
Connection con = ds.getConnection("myPassword", "myUserName");
或者:
  Context ctx = new InitialContext();
ConnectionPoolDataSource ds = (ConnectionPoolDataSource)ctx.lookup("jdbc/EmployeeDB");
PooledConnection con = ds.getConnection("myPassword", "myUserName");

是否使用連線池獲得一個連線,在應用程式的程式碼上是看不出不同的。在使用這個Connection連線上也沒有什麼不一樣的地方,
唯一的不同是在java的finally語句塊中來關閉一個連線。在finally中關閉連線是一個好的程式設計習慣。
這樣,即使方法丟擲異常,Connection也會被關閉並回收到連線池中去。程式碼應該如下所示:

  try
{…
  }
catch()
{…
  }
finally
{
if(con!=null)
con.close();
}
 


4、在Tomcat中配置資料庫的連線池
 
(1)連線池配置(Database Connection Pool (DBCP) Configurations)
DBCP使用的是Jakarta-Commons Database Connection Pool 要使用連線池需要如下的元件即jar檔案。
Jakarta-Commons DBCP 1.1 對應commons-dbcp-1.1.jar。
Jakarta-Commons Collections 2.0 對應commons-collections.jar。
Jakarta-Commons Pool 1.1 對應commons-pool-1.1.jar。

這三個jar檔案要與你的JDBC驅動程式一起放到【TOMCAT_HOME】/common/lib目錄下以便讓tomcat和你的web應用都能夠找到。
注:
這三個jar檔案是預設存在與【TOMCAT_HOME】/common/lib下的。
需要注意的地方:第三方的驅動程式或者其他類只能以*.jar的形式放到Tomcat的common/lib目錄中,因為Tomcat只把*.jar檔案加到CLASSPATH中。
不要把上訴三個檔案放到WEB-INF/lib或者其他地方因為這樣會引起混淆。
 
(2)透過配置阻止連線池漏洞
資料庫連線池建立和管理連線池中建立好的資料庫連線,迴圈使用這些連線以得到更好的效率。
這樣比始終為一個使用者保持一個連線和為使用者的請求頻繁的建立和銷燬資料庫連線要高效的多。

這樣就有一個問題出現了,一個Web應用程式必須顯示的釋放ResultSet,Statement和Connection。
如果在關閉這些資源的過程中失敗將導致這些資源永遠不在可用,這就是所謂的連線池漏洞。這個漏洞最終會導致連線池中所有的連線不可用。

透過配置Jakarta Common DBCP可以跟蹤和恢復那些被遺棄的資料庫連線。
以下是一系列相關配置:

透過配置DBCP資料來源中的引數removeAbandoned來保證刪除被遺棄的連線使其可以被重新利用。
為ResourceParams(見下文的資料來源配置)標籤新增引數removeAbandoned

removeAbandoned
true

透過這樣配置的以後當連線池中的有效連線接近用完時DBCP將試圖恢復和重用被遺棄的連線。這個引數的值預設是false。

透過設定removeAbandonedTimeout來設定被遺棄的連線的超時的時間,即當一個連線連線被遺棄的時間超過設定的時間時那麼它會自動轉換成可利用的連線。
   
     removeAbandonedTimeout
     60
    

    預設的超時時間是300秒。

設定logAbandoned引數,以將被遺棄的資料庫連線的回收記入日誌中

logAbandoned
true

這個引數預設為false。



(3)修改server.xml檔案
      
                    
                    
                         
                                              
                                        
                                                factory
                                        
        
                                         org.apache.commons.dbcp.BasicDataSourceFactory
                                        
        
                             

                                           
                                      
                                              driverClassName
                                      
        
                                         com.microsoft.jdbc.sqlserver.SQLServerDriver
                                        
        
                                 

                                       
                                        
                                                url
                                        
        
                               jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=DataBase
                             

                                
            
                                
                                           
                                                   username
                                            
             
                                        
                                              sa
                                        

                               
            
                                
                                           
                                                   password
                                           

                                           
maxActive 連線池的最大資料庫連線數。設為0表示無限制。
                                           

                                
            
                                
 
                                           
                                                   maxActive
                                           

                                           
                                                   20
回收被遺棄的(一般是忘了釋放的)資料庫連線到連線池中,設為-1表示無限制。
maxIdle  資料庫連線的最大空閒時間。超過此空閒時間,資料庫連線將被標記為不可用,然後被釋放。設為0表示無限制。
                                           

                                

                                              
                                       
                                                 maxIdle
                                         

maxWait 最大建立連線等待時間。如果超過此時間將接到異常。設為-1表示無限制。
                                        10
                               

                               
                                            maxWait
                                            -1
                             


  removeAbandoned
  <!-- Abandoned DB connections are removed and recycled --&gt
  true
 

 
  removeAbandonedTimeout
  <!-- Use the removeAbandonedTimeout parameter to set the number of seconds a DB connection has been idle before it is considered abandoned.  --&gt
  60
 

 
  logAbandoned
  <!-- Log a stack trace of the code which abandoned --&gt
  false
 
    
資料庫連線過多長時間不用將被視為被遺棄而收回連線池中
將被遺棄的資料庫連線的回收記入日誌
                  

             

注意:
所有的入口和資源都放在JNDI名稱空間裡的java:comp/env段裡
設定JNDI資源要在$CATALINA_HOME/conf/server.xml檔案裡使用下列標誌符:

1) --設定應用程式可用的資源的名字和型別(同上面說的等價)。
2) --設定Java資源類工廠的名稱或將用的JavaBean屬性。
上述這些標誌符必須放在之間
 
(2)、複製SQLServer的JDBC驅動程式到Tomcat的/common/lib目錄下
 
(3)、在程式中利用資料來源來訪問資料庫
              try
              {
                     Context initCtx = new InitialContext();
                   Context envCtx = (Context) initCtx.lookup("java:comp/env");
                DataSource ds = (DataSource)envCtx.lookup("jdbc/webmis");
                 Connection con=ds.getConnection();
          }
        catch (NamingException e)
           {
                   e.printStackTrace();
            }
            catch (SQLException e)
           {
                   e.printStackTrace();
             }
 
5、在server.xml檔案中與資料來源的描述相關的標籤含義

maxActive 連線池的最大資料庫連線數。設為0表示無限制。
maxIdle  資料庫連線的最大空閒時間。超過此空閒時間,資料庫連線將被標記為不可用,然後被釋放。設為0表示無限制。
maxWait 最大建立連線等待時間。如果超過此時間將接到異常。設為-1表示無限制。
removeAbandoned 回收被遺棄的(一般是忘了釋放的)資料庫連線到連線池中。
removeAbandonedTimeout 資料庫連線過多長時間不用將被視為被遺棄而收回連線池中。
logAbandoned 將被遺棄的資料庫連線的回收記入日誌。
driverClassName JDBC驅動程式。
url   資料庫DSN連線字串


6、在Web應用的web.xml檔案中引用該資源
 
將下面的標籤放在放在中間
<!-- Database Config start --&gt

connectDB test
jdbc/webmis
javax.sql.DataSource
Container

<!-- Database Config end --&gt
 


4,綜合配置例項
 
首先在C:根目錄下建立資料夾mywebapp,作為一個虛擬目錄的位置。
 
建立一個Sql Server資料庫DataBonus
 
找到C:/jakarta-tomcat-5.0.19/conf/server.xml,開啟。
 
加入:
 
 
                    
        
     
                       
                 factory         
                 org.apache.commons.dbcp.BasicDataSourceFactory        
             

                       
                 driverClassName         
                 com.microsoft.jdbc.sqlserver.SQLServerDriver        
             

               
                  url             
                 
jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=DataBonus
                  

              
             
              
                 username            
                 sa
               
            
               
                   password
                    
               
            
               
maxActive
                    20
               

                             
                   maxIdle
                   10
               

                      
                   maxWait
                   -1
               
     

             removeAbandoned
             <!-- Abandoned DB connections are removed and recycled --&gt
             true
         

         
              removeAbandonedTimeout
  <!-- Use the removeAbandonedTimeout parameter to set the number of seconds a DB connection has been idle before it is considered abandoned.  --&gt
              60
          

          
              logAbandoned
            <!-- Log a stack trace of the code which abandoned --&gt
              false
          
   
        


 
   做一個JSP頁面index.jsp放到mywebapp下面,程式碼:
 


 
<!-- 這裡使用一個字串變數 ("PAGETITLE") 保持題目和主標題的一致性。--&gt


<br> <br>

 

 

 






 
<!-- 匯入必要的類和類庫 --&gt
 
    javax.naming.*,
    java.sql.*,
    javax.sql.DataSource
"%>
 
<!-- 宣告一個類方法 --&gt
 
//宣告變數
//標題
  String pagetitle = "這是JSP呼叫資料庫的例子";
 
%>
 
<!-- 下面這些程式碼將被插入到servlet中 --&gt
 
 
   java.sql.Connection conn= null;
   java.sql.Statement stmt =null;
   java.sql.ResultSet rs=null;
 
  try {
    // 透過JNDI獲取主介面
 
     Context initCtx = new InitialContext();
     Context envCtx = (Context) initCtx.lookup("java:comp/env");
     DataSource ds = (DataSource)envCtx.lookup("jdbc/mybonusds");
     conn=ds.getConnection();
 
      stmt = conn.createStatement();
 
   
           //執行SQL語句
      stmt.execute("select * from 獎金");
    //取得結果集
      rs = stmt.getResultSet();
     
    %>
 
 
  
     
     
     
     
     
  
   
  %>
   
     
     
     
     
     
  
    
 

 
 
 // Catch exceptions
  }
 
  catch (Exception e) {
  }
  finally {
 
 if (rs != null)
     {
      try{rs.close();}catch(Exception ignore){};
      }
 
     if (stmt != null)
     {
      try{stmt.close();}catch(Exception ignore){};
      }
     if (conn != null)
     {
      try{conn.close();}catch(Exception ignore){};
      }
 
 
 %>
 
 
  }
%>
 



 
啟動Tomcat。
 
瀏覽:
 
 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  
 
四、在Tomcat中實現系統和Web管理的配置
 
1、配置系統管理(Admin Web Application)
 
(1)概述
大多數商業化的J2EE伺服器都提供一個功能強大的管理介面(如Weblogic的管理控制檯),且大都採用易於理解的Web應用介面。
Tomcat按照自己的方式,同樣提供一個成熟的管理工具,並且絲毫不遜於那些商業化的競爭對手。

Tomcat的Admin Web Application最初在4.1版本時出現,當時的功能包括管理context、data source、user和group等。
當然也可以管理像初始化引數,user、group、role的多種資料庫管理等。
在後續的版本中,這些功能將得到很大的擴充套件,但現有的功能已經非常實用了。
 
(2)系統管理Web應用程式
Tomcat中的Admin Web Application被定義在自動部署檔案:C:/jakarta-tomcat-5.0.19/server/webapps/admin/ admin.xml 中(請見下圖所示)。
      
 
(3)編輯admin.xml檔案
 
透過編輯admin.xml檔案,以確定Context中的docBase引數設定為Admin Web Application所在的目錄路徑(應該是絕對路徑)。
作為另外一種選擇,你也可以刪除這個自動部署檔案,而在C:/jakarta-tomcat-5.0.19/conf/server.xml
檔案中建立一個Admin Web Application的context,效果是一樣的。
       
       你不能管理Admin Web Application這個應用,換而言之,除了刪除CATALINA_BASE/webapps/admin.xml ,你可能什麼都做不了。
 
注意:如果將其中的被註釋掉的     allow="127.0.0.1"/>開啟,將能夠限制訪問Admin Web Application的程式主機為本機(伺服器主機);
    當然也可以設定為其它的主機IP地址(如設定為 Web管理員所的工作主機)。
 

(4)在C:/jakarta-tomcat-5.0.19/conf/ tomcat-users.xml 檔案中新增系統管理員的角色和系統管理員
 
Tomcat中提供UserDatabaseRealm(預設),這樣我們可以根據管理的需要新增不同的使用者角色和與該角色相配置的使用者名稱稱和密碼
 
新增使用者角色

新增與該角色相配置的使用者名稱稱和密碼


當你完成這些步驟後,請重新啟動Tomcat,訪問,你將看到一個登入介面。
Admin Web Application程式採用基於容器管理的安全機制,並採用了Jakarta Struts框架。
下面是在原來的tomcat-users.xml 檔案中再新增了兩個角色admin和manager,同時也新增了與該兩個角色相配置的使用者admin和manager。



 
 
 
 
 
 
 
 
 


(5)登入Admin Web Application程式
輸入/進入系統管理員的登入頁,然後在頁中
輸入使用者名稱稱:admin
密碼: 12345678
將進入系統管理的介面,在該系統管理的程式中將可以配置各種資源如Data Sources、Mail Sessions、Environment Entries,
並且也可以管理Users 和Groups 以及Roles等功能。
 
 
2、配置應用管理(Manager Web Application)
 
(1)概述
 
Tomcat中所提供的Manager Web Application讓你透過一個比Admin Web Application更為簡單的使用者介面,執行一些與Web應用任務相關的一些管理功能。
 
(2)Manager Web Application程式
 
Manager Web Application被被定義在一個自動部署檔案中C:/jakarta-tomcat-5.0.19/server/webapps/manager/manager.xml 。
 
 
(3)編輯manager.xml檔案
 
透過編輯這個檔案,以確保其中的context中的docBase屬性引數是C:/jakarta-tomcat-5.0.19/server/webapps/manager的絕對路徑。
 
 
(4)在C:/jakarta-tomcat-5.0.19/conf/ tomcat-users.xml 檔案中新增Web管理員的角色和Web管理員
新增使用者角色

新增與該角色相配置的使用者名稱稱和密碼

 
(5)登入Web管理員的頁面
文字型管理介面
然後重新啟動Tomcat,輸入,將進入看到一個很樸素的文字型管理介面
 
如果輸入list,將進入一個登入管理介面,然後
輸入使用者名稱稱:manager(前面在tomcat-users.xml中設定的)
密碼:12345678
 
將顯示出
 
HTML 型管理介面
輸入html/list,將出現如下的頁面,然後再
輸入使用者名稱稱:manager
密碼:12345678
 
將出現Web方式的管理頁面
 
Manager application可以讓使用者在沒有系統管理特權的基礎上,部署安裝新的Web應用,以用於測試。
同時也可以對所部署的Web應用程式的工作狀態進行控制(Start 或者 Stop),
以免重新啟動伺服器(這在對web.xml等配置的內容發生改變的情況下,
特別有效)。當有使用者嘗試訪問這個被停止的應用時,
將看到一個503的錯誤——
“503 - This application is not currently available”。
 
 
3、配置各種使用者角色、使用者組和使用者
 
(1)新增使用者角色:在 admin的介面中點選左面的Roles節點,然後在右面的下拉選單框中選擇Create New Role專案。
 
然後輸入角色的名稱和描述
 
       最後點選“儲存”,將儲存在C:/jakarta-tomcat-5.0.19/conf/tomcat-users.xml檔案中並且在管理介面中顯示出。
 
 
(2)新增使用者組:在 admin的介面中點選左面的Groups節點,然後在右面的下拉選單框中選擇Create New Group專案。
然後輸入組的名稱和描述,並且設定該組的角色。所應該注意的是,給組分配角色,則意味著該組中的各個成員(使用者)將具有該角色所分配的各種許可權。
最後點選“Save”以儲存它(仍然放在C:/jakarta-tomcat-5.0.19/conf/tomcat-users.xml檔案中)
 
 
(3)新增屬於某一使用者組內的使用者
在 admin的介面中點選左面的Users節點,然後在右面的下拉選單框中選擇Create New User專案。
 
然後該使用者的名稱同時包括全名稱、密謀,並且設定該使用者所屬的使用者組;同時也可以為該使用者再設定其它的角色以使該使用者除了
具有使用者組的通用的權利以外,還具有其他方面的權利。


下面對“teacherZhang”這個使用者進行設定,同時他也是系統管理員,因此將下面的admin的角色也選中。
 
最後點選儲存(仍然放在C:/jakarta-tomcat-5.0.19/conf/tomcat-users.xml檔案中)
 
 
 
4、新增其它的系統資源
 
(1)DataSource
       在 admin的介面中點選左面的DataSourcs節點,然後在右面的下拉選單框中選擇Create New DataSource專案。
       在各個輸入的專案中根據資料庫的特性進行輸入。最後點選“Save”以儲存。
 
 
(2)新增環境變數
 
       在 admin的介面中點選左面的Environment Entries節點,然後在右面的下拉選單框中選擇Create New Env Entry專案。
       在各個輸入的專案中根據資料庫的特性進行輸入。最後點選“Save”以儲存。
 
 
 
5、對Web應用程式進行管理
 
(1)輸入html/list,將出現登入頁並且進行登入,然後再進入Tomcat Web Application Manager
(2)檢視在Web服務中所釋出的各個Web應用
 
 
(3)啟動或者終止、移除某一Web應用:
 
點選該 Web應用右面的Stop連結,也可以點選Start再次啟動它。Undeploy(移除)一個Web應用,只是指從Tomcat的執行複製中刪除了該應用,
如果你重新啟動Tomcat,被刪除的應用將再次出現(也就是說,移除並不是指從硬碟上刪除)。

 
(4)部署某一Web應用
 
有三種方式可以在Tomcat系統中部署Web應用。


直接複製你的WAR檔案或者你的Web應用資料夾(包括該Web應用的所有內容)到C:/jakarta-tomcat-5.0.19/webapps目錄下。
該檔案必須以“.war”作為副檔名。一旦Tomcat監聽到這個檔案,它將(預設的)解開該檔案包作為一個子目錄,並以WAR檔案的檔名作為子目錄的名字。
接下來,Tomcat將在記憶體中建立一個context,就好象你在server.xml檔案裡建立一樣。當然,其他必需的內容,將從server.xml中的DefaultContext獲得。
 


部署web應用的另一種方式是寫一個Context XML片斷檔案,然後把該檔案複製到C:/jakarta-tomcat-5.0.19/webapps目錄下。
一個Context片斷並非一個完整的XML檔案,而只是一個Context元素,以及對該應用的相應描述。這種片斷檔案就像是從server.xml中切取出來的context
元素一樣,所以這種片斷被命名為“context片斷”。這個web應用本身可以儲存在硬碟上的任何地方。
 

舉個例子,如果我們想部署一個名叫JspExamples的Web應用,該應用使用realm作為訪問控制方式,我們可以使用下面這個片斷:
<!--
 Context fragment for deploying JspExamples
--&gt



把該片斷命名為“JspExamples.xml”,然後複製到C:/jakarta-tomcat-5.0.19/webapps目錄下。這種Context片斷提供了一種便利的方法來部署web應用,
你不需要編輯server.xml,除非你想改變預設的部署特性,安裝一個新的Web應用時不需要重啟動Tomcat。
 
採用GUI管理介面進行釋出
如果提供了該Web應用的*.war檔案,直接瀏覽併發布它
 
如果Web應用是以目錄形式存在的,則可以:
 
 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
五、Tomcat伺服器的Web安全的解決方法
 
1、概述
 
在任何一種WEB應用開發中,不論大中小規模的,每個開發者都會遇到一些需要保護程式資料的問題,涉及到使用者的LOGIN ID和PASSWORD。
那麼如何執行驗證方式更好呢?實際上,有很多方式來實現。

下面將討論在Tomcat中實現基本的(BASIC)和基於表單的(FORM-BASED)驗證方式。它透過server.xml和web.xml檔案提供基本的和基於表單的驗證。

對於採用基於表單的(FORM-BASED)驗證方式,只是要求在登入的JSP頁面中的j_security_check 表單(for FORM-based) 需要兩個引數:j_username和j_password。
對於使用者的登入的名稱和密碼在Tomcat中可以以兩種形式來存放,一是採用server.xml;另一種也可以採用使用者自己的資料庫表來儲存。
 
2、設計系統中的各種人員的角色
 
(1)設計思想
 
統一使用者管理,實現基於角色、粗粒度(基於URL)和細粒度(基於應用元件的方法呼叫)的訪問策略管理體系,
基於分級角色的許可權管理、統一證照管理和統一資源管理
 
 
 
(2)設計目標
 
一般採用資料庫表(對於複雜的也可以採用LDAP)記錄每個系統使用者的帳號資訊、功能許可權和資料許可權資訊,這樣能夠增加使用者管理和許可權設定的靈活性,
同時也避免多個使用者共用一個帳號的情況。

(3)優點
 
從使用者角度來看,登入所有應用系統都使用唯一的使用者名稱和口令(數字證照)同時在訪問系統時,也只需要登入一次(單點登入全網漫遊---SSO(Single Sign-On))。
從管理者角度來看,提供了統一、集中、有效的使用者管理。




 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

七、在Tomcat中採用基於表單的安全驗證
 
1、概述
 
(1)基於表單的驗證
 
基於From的安全認證可以透過Tomcat Server對Form表單中所提供的資料進行驗證,基於表單的驗證使系統開發者可以自定義使用者的登陸頁面和報錯頁面。
這種驗證方法與基本HTTP的驗證方法的唯一區別就在於它可以根據使用者的要求制定登陸和出錯頁面。

透過攔截並檢查使用者的請求,檢查使用者是否在應用系統中已經建立好login session。如果沒有,則將使用者轉向到認證服務的登入頁面。
但在Tomcat中的基於表單的驗證憑證不被保護並以純文字傳送。
 

(2)在Tomcat 中的實現
 
在Tomcat中,使用者、使用者組和角色都是在XML配置檔案(C:/jakarta-tomcat-5.0.19/conf/tomcat-users.xml)中指定的,
我們只需要提供一個登陸頁面,包含一個名為j_security_check的Form表單,
一個名為j_username的TextBox和一個名為j_password的PasswordBox,
然後在/WEB-INF/web.xml中配置即可使用Tomcat預設的JAAS身份驗證。

使用JAAS驗證的好處是,驗證邏輯從頁面中分離,對頁面的限制訪問是透過/WEB-INF/web.xml中的配置指定的,無需自定義過濾器。
 
(3)為了實現Web應用程式的安全,Tomcat Web容器執行下面的步驟:
在受保護的Web資源被訪問時,判斷使用者是否被認證。
如果使用者沒有得到認證,則透過重定向到部署描述符中定義的註冊頁面,要求使用者提供安全信任狀。
根據為該容器配置的安全領域,確認使用者的信任狀有效。
判斷得到認證的使用者是否被授權訪問部署描述符(web.xml)中定義的Web資源。
 
 
2、設計步驟
 
 
(1)編寫登入頁面和錯誤處理頁面:請見FormSafeWebApp 程式中的頁面
 
 
(2)登入的頁面檔案的內容如下
 
基於FORM的使用者認證要求你返回一個包括使用者名稱和密碼的HTML表單,這個表單相對應與使用者名稱和密碼的元素必須是j_username和j_password,
並且表單的action描述必須為j_security_check(其實是一個Servlet)。該表單的具體操作以及j_username和j_password名字在Servlet中定義。
當這個表單到達伺服器的時候,由內部的Tomcat Server安全區對它進行確認。

包括這個表單的資源可以是一個HTML頁面、一個JSP頁面或者一個Servlet。你可以在元素中定義。
基於表單的認證能夠使開發人員定製認證的使用者介面。在web.xml的login-config標籤專案定義了認證機制的型別、登入的URI和錯誤頁面。

下面為該頁面的內容:


注意:action應該為j_security_check
在Tomcat 中採用Form 驗證方式實現的安全Web應用程式的登入頁



注意:使用者名稱稱和密碼的輸入應該為j_username 和j_password
   
 
   
 

 
 
 
在Tomcat中採用基於表單的安全驗證的登入表單
使用者名稱稱:
密碼:

   

 
(3)修改web.xml檔案
 

定義本Web應用的預設啟始頁面


      
           index.jsp
       

 <!-- Security is active on entire directory --&gt
 
    Tomcat Server Form Security Constraint
   
     Protected Area
      A Page of Login Success
       /ProtectedDirOne/index.jsp
     

   
指定Form驗證的使用者的角色名稱
      <!-- Anyone with one of the listed roles may access this area --&gt
      admin
   

指定驗證的方式為Form
 

  <!-- Login configuration uses form-based authentication --&gt
 
    FORM
    Tomcat Server Configuration Form-Based Authentication Area
   
             /login.jsp
              /Error.htm
 
   

 

  <!-- Security roles referenced by this web application --&gt
 
關聯Tomcat中的admin的角色
   
      The role is Administration
   

    admin
 


 

(4)在C:/jakarta-tomcat-5.0.19/conf/tomcat-users.xml檔案中配置admin的角色以及與該 admin角色相匹配的使用者名稱稱和密碼
 

(5)執行該頁面
在瀏覽器中直接輸入受保護的頁面的URL地址:
,將出現要求登入的頁面。
 
 
在表單中輸入使用者名稱稱為admin(前面在tomcat-users.xml檔案中所設定的某一使用者名稱稱),密碼為12345678。然後點選“提交”,將出現如下頁面
 
如果使用者名稱稱或者密碼輸入不正確,將出現如下的頁面也就是錯誤頁面
 
(6)在頁面中獲得當前登入成功後的使用者名稱稱和實體名稱
       利用request物件中的getRemoteUser()方法獲得當前登入成功後的使用者名稱稱和利用getUserPrincipal()方法獲得當前登入成功後的實體名稱。
 
 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
八、在Tomcat中配置單點登入(Single Sign-On)
 
1、概述
 
一旦你設定了realm和驗證的方法,你就需要進行實際的使用者登入處理。一般說來,對使用者而言登入系統是一件很麻煩的事情,
你必須儘量減少使用者登入驗證的次數。作為預設的情況,當使用者第一次請求受保護的資源時,每一個Web應用都會要求使用者登入。

如果你執行了多個Web應用,並且每個應用都需要進行單獨的使用者驗證,那這看起來就有點像你在與你的使用者搏鬥。
使用者們不知道怎樣才能把多個分離的應用整合成一個單獨的系統,所有他們也就不知道他們需要訪
問多少個不同的應用,只是很迷惑,為什麼總要不停的登入。
 

2、Tomcat 中的“Single Sign-On”特性及配置
 
其主要的特性是能夠允許使用者在訪問同一虛擬主機下所有Web應用時,只需登入一次。為了使用這個功能,
你只需要在C:/jakarta-tomcat-5.0.19/conf /server.xml檔案中的Host標籤上新增一個SingleSignOn Valve元素即可,如下所示:



在Tomcat初始安裝後,server.xml的註釋裡面包括SingleSignOn Valve配置的例子,
你只需要去掉註釋(在339行左右),即可使用。那麼,任何使用者只要登入過一個應用,則對於同一虛擬主機下的所有應用同樣有效。
 
 
3、測試單點登入
 
(1)直接進入前面的Form驗證所產生的Web應用
()將出現要求登入的頁面
 
 
在表單中輸入使用者名稱稱為admin(前面在tomcat-users.xml檔案中所設定的某一使用者名稱稱),
密碼為12345678。然後點選“提交”,將以使用者名稱admin進行成功登入該Web應用。

(2)再在該瀏覽器視窗內(不能在新視窗,否則會成為另一使用者)直接輸入,
此時將以admin的使用者瀏覽另一Web應用。觀察能否直接進入Tomcat的系統管理的頁面,此時應該可以並且出現下面的頁面。
如果新開一瀏覽器視窗並直接輸入,
看能否直接進入Tomcat的系統管理的頁面,此時將會出現要求登入的頁面。
 
 
 
4、使用single sign-on valve所應該注意的問題
value必須被配置和巢狀在相同的Host元素裡,並且所有需要進行單點驗證的web應用(必須透過context元素定義)都位於該Host下。
包括共享使用者資訊的realm必須被設定在同一級Host中或者巢狀之外。
不能被context中的realm覆蓋。
使用單點登入的web應用最好使用一個Tomcat的內建的驗證方式(Basic或者Form)(被定義在web.xml中的中),這比自定義的驗證方式強。
單點登入需要使用cookies。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29500582/viewspace-1364572/,如需轉載,請註明出處,否則將追究法律責任。

相關文章