最近通過孫衛琴的《tomcat與java web開發技術詳解(第二版)》學習了tomcat6,并對部分內容做了點筆記,現在分享給大家,難免殘缺和粗糙,望見諒。
一.訪問tomcat的控制平臺和管理平臺
首先
下載tomcat6:進入
http://www.apache.org/ 點擊 tomcat項目進入
http://tomcat.apache.org/ 點擊download下的tomcat6.x進入
http://tomcat.apache.org/download-60.cgi 選擇 Binary Distributions 下的core下的 zip,下載后為 apache-tomcat-6.0.18.zip 文件,解壓后為 apache-tomcat-6.0.18,可以直接啟動,不需要安裝,訪問
http://localhost:8080 可以測試是否成功
1.訪問控制平臺: tomcat自帶了manager項目來管理平臺,但是在tomcat-users.xml中沒有定義角色和用戶,所以只需要修改該文件就可以了
修改前:
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
</tomcat-users>
修改后:
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="manager"/>
<user username="tomcat" password="tomcat" roles="manager"/>
</tomcat-users>
啟動tomcat后訪問
http://localhost:8080 成功,訪問
http://localhost:8080/manager/html 成功
2.訪問控制平臺:實際就是tomcat的server.xml配置文件配置的可視化操作,tomcat6已經不帶該項目了,需要先到apache官網下載,下載過程和下載tomcat6類似,先找到tomcat,然后找到5.5版本,最后選擇 Administration Web Application 下的zip,下載文件是
apache-tomcat-5.5.27-admin.zip ,解壓后為
apache-tomcat-5.5.27,將apache-tomcat-5.5.27\server\webapps下的admin文件夾復制粘貼到tomcat的webapps目錄下,將apache-tomcat-5.5.27\conf下的Catalina目錄復制粘貼到tomcat的conf目錄下,最后是修改tomcat-user.xml文件來添加用戶和角色,原因和過程同上,修改后文件內容如下
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="manager"/>
<role rolename="admin"/>
<user username="tomcat" password="tomcat" roles="manager,admin"/>
</tomcat-users>
修改文件apache-tomcat-6.0.18\webapps\admin下的admin.xml,將
<Context docBase="${catalina.home}/
server/webapps/admin" privileged="true"
antiResourceLocking="false" antiJARLocking="false">
改成
<Context docBase="${catalina.home}/webapps/admin" privileged="true"
antiResourceLocking="false" antiJARLocking="false">
相同方式修改apache-tomcat-6.0.18\conf\Catalina\localhost下的admin.xml文件
項目運行需要兩個jar文件:commons-logging.jar 和 commons-modeler.jar ,需要到apache網站下載
下載commons-logging的過程是:登錄
http://www.apache.org/ ,找到commons項目后點擊進入
http://commons.apache.org/ 頁面,找到Components下的logging點擊后進入
http://commons.apache.org/logging/,點擊 Commons logging 下的download進入
http://commons.apache.org/downloads/download_logging.cgi 下載頁面。然后下載 Binary下的1.1.1.zip,下載后解壓,將其中的 commons-logging-1.1.1.jar 復制粘貼到tomcat下的lib目錄下
下載 commons-modeler-2.0.1.jar的過程大致相同,訪問 http://commons.apache.org/downloads/download_modeler.cgi
啟動tomcat后訪問
http://localhost:8080 成功,訪問
http://localhost:8080/admin 成功
二.將tomcat集成到apache2服務器上
首先安裝apache2:登錄 http://www.apache.org/ 點擊 HTTP Server 項目,進入 http://httpd.apache.org/ ,選擇download下的froma mirror后進入 http://httpd.apache.org/download.cgi 頁面,選擇 Apache HTTP Server 2.2.11 is the best available version 下的 Win32 Binary without crypto (no mod_ssl) (MSI Installer): apache_2.2.11-win32-x86-no_ssl.msi ,文件名稱是apache_2.2.11-win32-x86-no_ssl.msi,下載后為apache_2.2.11-win32-x86-no_ssl.msi。雙擊安裝,一切默認安裝就行了
安裝后訪問 http://localhost,如果出現提示頁面告訴你apache已經開始工作就說明成功了
首先下載mod_jk.so:進入 http://www.apache.org/ 點擊 tomcat項目進入 http://tomcat.apache.org/ 點擊download下的Tomcat Connectors 進入 http://tomcat.apache.org/download-connectors.cgi 選擇Tomcat Connectors JK 1.2下的Binary Releases 進入 http://labs.xiaonei.com/apache-mirror/tomcat/tomcat-connectors/jk/binaries/頁面,點擊win32進入 http://labs.xiaonei.com/apache-mirror/tomcat/tomcat-connectors/jk/binaries/win32/頁面,點擊版本jk-1.2.28/ 進入http://labs.xiaonei.com/apache-mirror/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.28/頁面,點擊mod_jk-1.2.28-httpd-2.0.52.so ,下載文件為mod_jk-1.2.28-httpd-2.0.52.so 下載后為 mod_jk-1.2.28-httpd-2.0.52.so文件,可以改名為mod-jk.so。
1.拷貝mod_jk.so插件到apache2的modules目錄
2.在apache2的conf目錄下新建worker.properties文件,內容如下
worker.list=worker1
worker.worker1.port=8009 #工作端口,若沒占用則不用修改
worker.worker1.host=localhost #Tomcat服務器的地址
worker.worker1.type=ajp13 #類型
worker.worker1.lbfactor=1 #負載平衡因數
3.在apache2的conf目錄下修改httpd.conf文件,在后面追加內容如下
# Using mod_jk.so to redirect dynamic calls to Tomcat
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel debug
JkMount /*.jsp worker1
JkMount /manager/* worker1
4.測試時輸入http://localhost/manager/html成功運行
三.使用一個apache2和兩個tomcat6配置tomcat集群
1.拷貝mod_jk.so插件到apache2的modules目錄
2.在apache2的conf目錄下新建worker.properties文件,內容如下
worker.list=worker1,worker2,loadbalancer
worker.worker1.port=8009 #工作端口,若沒占用則不用修改
worker.worker1.host=localhost #Tomcat服務器的地址
worker.worker1.type=ajp13 #類型
worker.worker1.lbfactor=100 #負載平衡因數
worker.worker2.port=8109 #工作端口,若沒占用則不用修改
worker.worker2.host=localhost #Tomcat服務器的地址
worker.worker2.type=ajp13 #類型
worker.worker2.lbfactor=100 #負載平衡因數
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=worker1, worker2
worker.loadbalancer.sticky_session=false
worker.loadbalancer.sticky_session_force=false
3.在apache2的conf目錄下修改httpd.conf文件,在后面追加內容如下
# Using mod_jk.so to redirect dynamic calls to Tomcat
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel debug
JkMount /*.jsp loadbalancer
JkMount /manager/* loadbalancer
4.復制兩個免安裝的tomcat,把其中一個的server.xml文件修改成
Server port="8105"
Connector port="8180"
<Connector port="8109" protocol="AJP/1.3" redirectPort="8443" />
兩個文件的engine元素都要添加jmvRoute屬性,分別是worker1和worker2
比如 <Engine name="Catalina" defaultHost="localhost" jmvRoute="worker2">
5.新建文件test.jsp,內容如下
<html>
<head>
<title>helloapp</title>
</head>
<body>
<%
System.out.println("call test.jsp");
%>
SessionID: <%=session.getId() %>
</body>
</html>
在兩個tomcat的webapps目錄下的manager項目文件夾下分別復制粘貼一個文件test.jsp
6.測試時輸入http://localhost/manager/test.jsp成功運行,問題在于session不唯一
====================================
下面解決session的唯一問題
7.在每個tomcat的server.xml文件中的engine元素下都添加如下內容
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
bind="127.0.0.1"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
8.在每個tomcat的webapps下的web應用的web.xml文件中添加如下內容
<distributeable/>
9.重新測試session唯一
四.配置tomcat的Server Side include (SSI)
1.因為tomcat6的lib文件夾中沒有servlet-ssi.jar,所以從tomcat5.5的lib文件夾中復制servlet-ssi.renametojar粘貼到tomcat6的lib中并改名為servlet-ssi.jar
2.將tomcat6的web.xml文件中的兩處注釋掉的內容取消注釋,打開tomcat服務器的ssi功能
第一處
<servlet>
<servlet-name>ssi</servlet-name>
<servlet-class>
org.apache.catalina.ssi.SSIServlet
</servlet-class>
<init-param>
<param-name>buffered</param-name>
<param-value>1</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>expires</param-name>
<param-value>666</param-value>
</init-param>
<init-param>
<param-name>isVirtualWebappRelative</param-name>
<param-value>0</param-value>
</init-param>
<load-on-startup>4</load-on-startup>
</servlet>
第二處
<servlet-mapping>
<servlet-name>ssi</servlet-name>
<url-pattern>*.shtml</url-pattern>
</servlet-mapping>
3.新建文件sample.shtml,并將文件復制粘貼到tomcat的webapps目錄的manager項目文件夾下,
sample.shtml文件內容如下
<html>
<head><title>my first SSI page</title></head>
<body>
歡迎您于(<!--#echo var="DATE_LOCAL" -->)訪問本網站。
</body>
</html>
4.修改manager項目的META-INF文件夾下的context.xml文件
把
<Context relodable="true" />
改成
<Context relodable="true" privileged="true" />
5.訪問
http://localhost:8080/manager/sample.shtml
五.配置tomcat的Server Socket Layer(SSL)
1.使用sun公司的tookey工具制作個人證書,在jdk的bin文件夾中有
證書制作
cmd進入ms-dos窗口
Microsoft Windows XP [版本 5.1.2600]
(C) 版權所有 1985-2001 Microsoft Corp.
C:\Documents and Settings\100554>cd\
C:\>cd C:\Program Files\Java\jdk1.6.0_07\bin
C:\Program Files\Java\jdk1.6.0_07\bin>keytool -genkey -alias tomcat -keyalg RSA
-keypass changeit -storepass changeit -keystore d:\server.keystore -validity 3000
您的名字與姓氏是什么?
[Unknown]: ellen
您的組織單位名稱是什么?
[Unknown]: xinxihua
您的組織名稱是什么?
[Unknown]: jianlong
您所在的城市或區域名稱是什么?
[Unknown]: fengtai
您所在的州或省份名稱是什么?
[Unknown]: beijing
該單位的兩字母國家代碼是什么
[Unknown]: cn
CN=ellen, OU=xinxihua, O=jianlong, L=fengtai, ST=beijing, C=cn 正確嗎?
[否]: y
C:\Program Files\Java\jdk1.6.0_07\bin>
2.配置tomcat的server.xml文件
<Connector className="org.apache.coyote.tomcat6.CoyoteConnector"
port="8443" minProcessors="5"
maxProcessors="75" enableLookups="true"
acceptCount="100"
protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="D:/server.keystore"
keystorePass="changeit" />
3啟動ie瀏覽器(不同的瀏覽器有區別),訪問 https://localhost:8433 (注意是https,不是http;是8433,不是8080)
六.將tomcat嵌入到應用程序中
原書的demo運行繁瑣,這里改變的主要是編譯環境,并部署了一個web項目做進一步的實驗
1.下載一個免安裝的tomcat服務器,改名tomcat并放在f盤根目錄
2.啟動MyEclipse,已經集成了tomcat,新建一個名為hellodemo的javaWeb應用,運行無誤后導出為名為hellodemo的war包。
并將hellodemo.war復制粘貼到f:\tomcat\webapps目錄下
3.將MyEclipse的tomcat禁用掉,新建一個java項目,注意不是web項目,名稱是tomcatdemo,在src下的pkg包中新建一個java類,代碼如下
package pkg;
import java.net.InetAddress;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Host;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.startup.Embedded;
public class EmbeddedTomcat {
private String path = null;
private Embedded embedded = null;
private Host host = null;
public EmbeddedTomcat() { }
/** 設置Tomcat的根路徑 */
public void setPath(String path) {
this.path = path;
}
/** 返回Tomcat的根路徑 */
public String getPath() {
return path;
}
/** 啟動Tomcat服務器 */
public void startTomcat() throws Exception {
Engine engine = null;
//設置catalina.home系統屬性
System.setProperty("catalina.home", getPath());
//創建嵌入式Tomcat服務器
embedded = new Embedded();
//創建Engine實例
engine = embedded.createEngine();
engine.setDefaultHost("localhost");
//創建默認的Host實例
host = embedded.createHost("localhost", getPath() + "/webapps");
engine.addChild(host);
//創建ROOT context
Context context = embedded.createContext("", getPath() + "webapps/ROOT");
host.addChild(context);
//創建examples context
Context examplesContext = embedded.createContext("/examples",
getPath() + "webapps/examples");
host.addChild(examplesContext);
/****************************************************/
//創建hellodemo context
Context hellodemo= embedded.createContext("/hellodemo",
getPath() + "webapps/hellodemo");
host.addChild(hellodemo);
/****************************************************/
//把Engine實例加入到嵌入式Tomcat服務器
embedded.addEngine(engine);
//創建和安裝默認的HTTP connector
InetAddress addr=null;
Connector connector = embedded.createConnector(addr, 8080, false);
embedded.addConnector(connector);
//啟動嵌入式Tomcat服務器
embedded.start();
}
/** 終止嵌入式Tomcat服務器 */
public void stopTomcat() throws Exception {
embedded.stop();
}
public static void main(String args[]) {
try {
EmbeddedTomcat tomcat = new EmbeddedTomcat();
String rootpath="f:/tomcat/";
tomcat.setPath(rootpath);
tomcat.startTomcat();
Thread.sleep(1000*60*5); //睡眠5分鐘
tomcat.stopTomcat();
System.exit(0);
}
catch( Exception e ) {
e.printStackTrace();
}
}
}
4.將f:\tomcat的lib目錄和bin目錄下的jar包都導入到項目中
5.運行有main方法的EmbeddedTomcat類。
6.測試訪問,成功
http://localhost:8080
http://localhost:8080/hellodemo/index.jsp
七.tomcat閥
1.客戶訪問日志閥
只修改manager應用的context.xml文件,添加內容如下
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="ellen_log." suffix=".txt" pattern="%h %l %u %t %r %s %b" resolveHosts="true" />
保存后啟動tomcat后訪問 http://localhost:8080/manager/html
tomcat的logs文件夾新建文件ellen_log.txt,文件內容如下
127.0.0.1 - tomcat [06/May/2009:16:37:10 +0800] GET /manager/html HTTP/1.1 200 13030
2.遠程地址過濾器
只修改tomcat的server.xml文件,在host元素內添加如下內容
<!--Remote Address Filter-->
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
deny="127.* , 222.*"/>
保存后啟動tomcat訪問 http://localhost:8080 http://127.0.0.1:8080 顯示網站拒絕
修改如下
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127.* , 222.*"/>
保存后啟動tomcat訪問 http://localhost:8080 http://127.0.0.1:8080頁正常顯示
如果想實現本機的tomct服務器只允許本機的瀏覽器訪問就可以如此設置
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127.0.0.1*, localhost*"/>
3.遠程主機過濾器
只修改tomcat的server.xml文件,在host元素內添加如下內容
<!--Remote Host Filter-->
<Valve className="org.apache.catalina.valves.RemoteHostValve"
deny="monster*" />
保存后啟動tomcat訪問 http://localhost:8080 http://127.0.0.1:8080 顯示網站拒絕
4.客戶請求記錄器
只修改tomcat的server.xml文件,在host元素內添加如下內容
<!--Request Dumper-->
<Valve className="org.apache.catalina.valves.RequestDumperValve" />
保存后啟動tomcat訪問 http://localhost:8080 每次訪問一次就到logs下查看文件 localhost.2009-05-06.log(日期為當日日期),
僅僅啟動tomcat后產生的文件內容如下
2009-5-6 17:18:02 org.apache.catalina.core.ApplicationContext log
信息: ContextListener: contextInitialized()
2009-5-6 17:18:02 org.apache.catalina.core.ApplicationContext log
信息: SessionListener: contextInitialized()
第一次訪問后追加了如下內容(略)
八.tomcat安全域
分類:內存域MemoryRealm;JDBC域JDBCRealm;數據源域DataSourceRealm;JNDI域JNDIRealm;JAAS域JAASRealm
三種登錄方式
<!-- BASIC authentication -->
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>ellen realm</realm-name>
</login-config>
<!-- DIGEST authentication -->
<login-config>
<auth-method>DIGEST</auth-method>
<realm-name>ellen realm</realm-name>
</login-config>
<!-- FORM authentication -->
<login-config>
<auth-method>FORM</auth-method>
<realm-name>ellen realm</realm-name>
<form-login-config>
<form-login-page>/usercheck.jsp</form-login-page>
<form-error-page>/error.jsp</form-error-page>
</form-login-config>
</login-config>
使用表單方式必須新建兩個文件 usercheck.jsp(有嚴格的要求) 和 error.jsp(沒有嚴格要求)
usercheck.jsp
<html>
<head>
<title>Login Page for helloapp</title>
<body bgcolor="white">
<form method="POST" action=j_security_check>
<table border="0" cellspacing="5">
<tr>
<th align="right">Username:</th>
<td align="left"><input type="text" name="j_username"></td>
</tr>
<tr>
<th align="right">Password:</th>
<td align="left"><input type="password" name="j_password"></td>
</tr>
<tr>
<td align="right"><input type="submit" value="LogIn"></td>
<td align="left"><input type="reset" value="reset"></td>
</tr>
</table>
</form>
</body>
</html>
內存域
1.在web應用的WEB-INF目錄下的web.xml文件中配置安全約束
web.xml文件內容
<!--指定受保護的資源及訪問的方式和可以訪問的角色-->
<security-constraint>
<display-name>
ellen Configuration Security Constraint
</display-name>
<web-resource-collection>
<web-resource-name>Protected Area</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>guest</role-name>
</auth-constraint>
</security-constraint>
<!--登錄對話框的類型-->
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>ellen realm</realm-name>
</login-config>
<!--這里的角色和步驟2的角色相同-->
<security-role>
<description>
The role that is required to login to the ellen Application
</description>
<role-name>guest</role-name>
</security-role>
2.在web應用的METE-INF目錄下的context.xml文件中配置Realm
context.xml文件內容
<Context reloadable="true">
<Realm className="org.apache.catalina.realm.MemoryRealm" />
</Context>
3.在tomcat的conf目錄下的tomcat-users.xml文件中定義角色和用戶
MemoryRealm類從一個xml文件中讀取用戶信息,默認是tomcat的conf目錄下的tomcat-users.xml文件
tomcat-users.xml文件內容
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="guest"/>
<user username="ellen" password="123" roles="guest"/>
</tomcat-users>
JDBC域
1.和內存域相同
2.運行數據庫腳本
數據庫腳本
create database ellen;
use ellen;
create table users(
user_name varchar(15) not null primary key,
user_pass varchar(15) not null
);
create table user_roles(
user_name varchar(15) not null,
role_name varchar(15) not null,
primary key(user_name,role_name)
);
insert into users values("ellen","123");
insert into user_roles values("ellen","guest");
3.將數據庫驅動類復制粘貼到tomcat的lib目錄
4.在web應用的METE-INF目錄下的context.xml文件中配置Realm
context.xml文件內容
<Context reloadable="true">
<Realm className="org.apache.catalina.realm.JDBCRealm"
driverName="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost/ellen" connectionName="root"
connectionPassword="root" userTable="users" userNameCol="user_name"
userCredCol="user_pass" userRoleTable="user_roles"
roleNameCol="role_name" />
</Context>
DataSource域
1.2.3步和JDBC域相同
4.在web應用的METE-INF目錄下的context.xml文件中配置Realm
context.xml文件內容
<Context reloadable="true">
<Realm className="org.apache.catalina.realm.JDBCRealm"
driverName="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost/ellen" connectionName="root"
connectionPassword="root" userTable="users" userNameCol="user_name"
userCredCol="user_pass" userRoleTable="user_roles"
roleNameCol="role_name" />
</Context>
JNDI域
1.2.3步和JDBC域相同
4.在web應用的METE-INF目錄下的context.xml文件中配置Realm
context.xml文件內容
<Context reloadable="true">
<Realm className="org.apache.catalina.realm.DataSourceRealm"
dataSourceName="jdbc/ellen" userTable="users" userNameCol="user_name"
userCredCol="user_pass" userRoleTable="user_roles"
roleNameCol="role_name" />
</Context>
5.在tomcat的conf目錄下的server.xml文件中GlobalNamingResources元素下添加Resource元素
<Resource name="jdbc/ellen" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="root" password="root"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/ellen?autoReconnect=true"/>
柳德才
13691193654
18942949207
QQ:422157370
liudecai_zan@126.com湖北-武漢-江夏-廟山