一.访问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"/>
<script type="text/javascript"><!-- google_ad_client = "pub-1076724771190722"; /* JE个人博客468x60 */ google_ad_slot = "5506163105"; google_ad_width = 468; google_ad_height = 60; //--> </script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script><script src="http://pagead2.googlesyndication.com/pagead/expansion_embed.js"></script><script src="http://googleads.g.doubleclick.net/pagead/test_domain.js"></script><script src="http://pagead2.googlesyndication.com/pagead/render_ads.js"></script><script></script>