﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-&lt;font size="5"&gt;Web技术学习园地&lt;/font&gt;-文章分类-Tomcat</title><link>http://www.blogjava.net/CrazyJava/category/27513.html</link><description>&lt;marquee behavior="alternate" scrolldelay=3 scrollamount=3&gt;
&lt;font face="楷体_GB2312" color="#FFFF00" size="4"&gt;网络无所不在,信息无所不在,应用无所不在!&lt;/font&gt;
&lt;/marquee&gt;</description><language>zh-cn</language><lastBuildDate>Wed, 16 Apr 2008 07:51:51 GMT</lastBuildDate><pubDate>Wed, 16 Apr 2008 07:51:51 GMT</pubDate><ttl>60</ttl><item><title>使用 CAS 在 Tomcat 中实现单点登录</title><link>http://www.blogjava.net/CrazyJava/articles/193250.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Tue, 15 Apr 2008 16:38:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/193250.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/193250.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/193250.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/193250.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/193250.html</trackback:ping><description><![CDATA[<p>级别： 初级</p>
<p><a href="http://www-128.ibm.com/developerworks/cn/opensource/os-cn-cas/?S_TACT=105AGX52&amp;S_CMP=techcsdn#author" cmimpressionsent="1">张 涛</a> (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#122;&#122;&#104;&#97;&#110;&#103;&#116;&#64;&#99;&#110;&#46;&#105;&#98;&#109;&#46;&#99;&#111;&#109;&#63;&#115;&#117;&#98;&#106;&#101;&#99;&#116;&#61;&#20351;&#29992;&#32;&#67;&#65;&#83;&#32;&#22312;&#32;&#84;&#111;&#109;&#99;&#97;&#116;&#32;&#20013;&#23454;&#29616;&#21333;&#28857;&#30331;&#24405;" cmimpressionsent="1">zzhangt@cn.ibm.com</a>), 软件工程师, IBM<br />
<a href="http://www-128.ibm.com/developerworks/cn/opensource/os-cn-cas/?S_TACT=105AGX52&amp;S_CMP=techcsdn#author" cmimpressionsent="1">王 秉坤</a> (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#119;&#97;&#110;&#103;&#98;&#107;&#64;&#99;&#110;&#46;&#105;&#98;&#109;&#46;&#99;&#111;&#109;&#63;&#115;&#117;&#98;&#106;&#101;&#99;&#116;&#61;&#20351;&#29992;&#32;&#67;&#65;&#83;&#32;&#22312;&#32;&#84;&#111;&#109;&#99;&#97;&#116;&#32;&#20013;&#23454;&#29616;&#21333;&#28857;&#30331;&#24405;" cmimpressionsent="1">wangbk@cn.ibm.com</a>), 软件工程师, IBM<br />
</p>
<p>2008 年 4 月 10 日</p>
<blockquote>单点登录（Single Sign On , 简称 SSO ）是目前比较流行的服务于企业业务整合的解决方案之一， SSO 使得在多个应用系统中，用户只需要登录一次就可以访问所有相互信任的应用系统。CAS(Central Authentication Service)是一款不错的针对 Web 应用的单点登录框架，本文介绍了 CAS 的原理、协议、在 Tomcat 中的配置和使用，对于采用 CAS 实现轻量级单点登录解决方案的入门读者具有一定指导作用。</blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
<p><a name="2.CAS 介绍"><span class="atitle">CAS 介绍</span></a></p>
<p>CAS 是 Yale 大学发起的一个开源项目，旨在为 Web 应用系统提供一种可靠的单点登录方法，CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点：</p>
<ul>
    <li>开源的企业级单点登录解决方案。
    <li>CAS Server 为需要独立部署的 Web 应用。
    <li>CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用)，包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。 </li>
</ul>
<p><a name="N1008D"><span class="smalltitle">CAS 原理和协议</span></a></p>
<p>从结构上看，CAS 包含两个部分： CAS Server 和 CAS Client。CAS Server 需要独立部署，主要负责对用户的认证工作；CAS Client 负责处理对客户端受保护资源的访问请求，需要登录时，重定向到 CAS Server。图1 是 CAS 最基本的协议过程：</p>
<br />
<a name="N10098"><strong>图 1. CAS 基础协议</strong></a><br />
<img height="341" alt="CAS 基础协议" src="http://www-128.ibm.com/developerworks/cn/opensource/os-cn-cas/images/image001.jpg" width="467" /> <br />
<p>CAS Client 与受保护的客户端应用部署在一起，以 Filter 方式保护受保护的资源。对于访问受保护资源的每个 Web 请求，CAS Client 会分析该请求的 Http 请求中是否包含 Service Ticket，如果没有，则说明当前用户尚未登录，于是将请求重定向到指定好的 CAS Server 登录地址，并传递 Service （也就是要访问的目的资源地址），以便登录成功过后转回该地址。用户在第 3 步中输入认证信息，如果登录成功，CAS Server 随机产生一个相当长度、唯一、不可伪造的 Service Ticket，并缓存以待将来验证，之后系统自动重定向到 Service 所在地址，并为客户端浏览器设置一个 Ticket Granted Cookie（TGC），CAS Client 在拿到 Service 和新产生的 Ticket 过后，在第 5，6 步中与 CAS Server 进行身份合适，以确保 Service Ticket 的合法性。</p>
<p>在该协议中，所有与 CAS 的交互均采用 SSL 协议，确保，ST 和 TGC 的安全性。协议工作过程中会有 2 次重定向的过程，但是 CAS Client 与 CAS Server 之间进行 Ticket 验证的过程对于用户是透明的。</p>
<p>另外，CAS 协议中还提供了 Proxy （代理）模式，以适应更加高级、复杂的应用场景，具体介绍可以参考 CAS 官方网站上的相关文档。</p>
<p><a name="N100B0"><span class="smalltitle">准备工作</span></a></p>
<p>本文中的例子以 tomcat5.5 为例进行讲解，下载地址：</p>
<p><a href="http://tomcat.apache.org/download-55.cgi" cmimpressionsent="1">http://tomcat.apache.org/download-55.cgi</a> </p>
<p>到 CAS 官方网站下载 CAS Server 和 Client，地址分别为：</p>
<p><a href="http://www.ja-sig.org/downloads/cas/cas-server-3.1.1-release.zip" cmimpressionsent="1">http://www.ja-sig.org/downloads/cas/cas-server-3.1.1-release.zip</a> </p>
<p><a href="http://www.ja-sig.org/downloads/cas-clients/cas-client-java-2.1.1.zip" cmimpressionsent="1">http://www.ja-sig.org/downloads/cas-clients/cas-client-java-2.1.1.zip</a> </p>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www-128.ibm.com/developerworks/cn/opensource/os-cn-cas/?S_TACT=105AGX52&amp;S_CMP=techcsdn#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="3.部署 CAS Server"><span class="atitle">部署 CAS Server</span></a></p>
<p>CAS Server 是一套基于 Java 实现的服务，该服务以一个 Java Web Application 单独部署在与 servlet2.3 兼容的 Web 服务器上，另外，由于 Client 与 CAS Server 之间的交互采用 Https 协议，因此部署 CAS Server 的服务器还需要支持 SSL 协议。当 SSL 配置成功过后，像普通 Web 应用一样将 CAS Server 部署在服务器上就能正常运行了，不过，在真正使用之前，还需要扩展验证用户的接口。</p>
<p>在 Tomcat 上部署一个完整的 CAS Server 主要按照以下几个步骤：</p>
<p><a name="N100DD"><span class="smalltitle">配置 Tomcat 使用 Https 协议</span></a></p>
<p>如果希望 Tomcat 支持 Https，主要的工作是配置 SSL 协议，其配置过程和配置方法可以参考 Tomcat 的相关文档。不过在生成证书的过程中，会有需要用到主机名的地方，CAS 建议不要使用 IP 地址，而要使用机器名或域名。</p>
<p><a name="N100E6"><span class="smalltitle">部署 CAS Server</span></a></p>
<p>CAS Server 是一个 Web 应用包，将前面下载的 cas-server-3.1.1-release.zip 解开，把其中的 cas-server-webapp-3.1.1.war 拷贝到 tomcat的 webapps 目录，并更名为 cas.war。由于前面已配置好 tomcat 的 https 协议，可以重新启动 tomcat，然后访问：https://localhost:8443/cas ，如果能出现正常的 CAS 登录页面，则说明 CAS Server 已经部署成功。</p>
<p>虽然 CAS Server 已经部署成功，但这只是一个缺省的实现，在实际使用的时候，还需要根据实际概况做扩展和定制，最主要的是扩展认证 (Authentication) 接口和 CAS Server 的界面。</p>
<p><a name="N100F2"><span class="smalltitle">扩展认证接口</span></a></p>
<p>CAS Server 负责完成对用户的认证工作，它会处理登录时的用户凭证 (Credentials) 信息，用户名/密码对是最常见的凭证信息。CAS Server 可能需要到数据库检索一条用户帐号信息，也可能在 XML 文件中检索用户名/密码，还可能通过 LDAP Server 获取等，在这种情况下，CAS 提供了一种灵活但统一的接口和实现分离的方式，实际使用中 CAS 采用哪种方式认证是与 CAS 的基本协议分离开的，用户可以根据认证的接口去定制和扩展。</p>
<p><strong>扩展 AuthenticationHandler</strong> </p>
<p>CAS 提供扩展认证的核心是 AuthenticationHandler 接口，该接口定义如清单 1 下：</p>
<br />
<a name="N10107"><strong>清单 1. AuthenticationHandler定义</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            public interface AuthenticationHandler {
            /**
            * Method to determine if the credentials supplied are valid.
            * @param credentials The credentials to validate.
            * @return true if valid, return false otherwise.
            * @throws AuthenticationException An AuthenticationException can contain
            * details about why a particular authentication request failed.
            */
            boolean authenticate(Credentials credentials) throws AuthenticationException;
            /**
            * Method to check if the handler knows how to handle the credentials
            * provided. It may be a simple check of the Credentials class or something
            * more complicated such as scanning the information contained in the
            * Credentials object.
            * @param credentials The credentials to check.
            * @return true if the handler supports the Credentials, false othewrise.
            */
            boolean supports(Credentials credentials);
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>该接口定义了 2 个需要实现的方法，supports ()方法用于检查所给的包含认证信息的Credentials 是否受当前 AuthenticationHandler 支持；而 authenticate() 方法则担当验证认证信息的任务，这也是需要扩展的主要方法，根据情况与存储合法认证信息的介质进行交互，返回 boolean 类型的值，true 表示验证通过，false 表示验证失败。</p>
<p>CAS3中还提供了对AuthenticationHandler 接口的一些抽象实现，比如，可能需要在执行authenticate() 方法前后执行某些其他操作，那么可以让自己的认证类扩展自清单 2 中的抽象类：</p>
<br />
<a name="N10117"><strong>清单 2. AbstractPreAndPostProcessingAuthenticationHandler定义</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            public abstract class AbstractPreAndPostProcessingAuthenticationHandler
            implements AuthenticateHandler{
            protected Log log = LogFactory.getLog(this.getClass());
            protected boolean preAuthenticate(final Credentials credentials) {
            return true;
            }
            protected boolean postAuthenticate(final Credentials credentials,
            final boolean authenticated) {
            return authenticated;
            }
            public final boolean authenticate(final Credentials credentials)
            throws AuthenticationException {
            if (!preAuthenticate(credentials)) {
            return false;
            }
            final boolean authenticated = doAuthentication(credentials);
            return postAuthenticate(credentials, authenticated);
            }
            protected abstract boolean doAuthentication(final Credentials credentials)
            throws AuthenticationException;
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>AbstractPreAndPostProcessingAuthenticationHandler 类新定义了 preAuthenticate() 方法和 postAuthenticate() 方法，而实际的认证工作交由 doAuthentication() 方法来执行。因此，如果需要在认证前后执行一些额外的操作，可以分别扩展 preAuthenticate()和 ppstAuthenticate() 方法，而 doAuthentication() 取代 authenticate() 成为了子类必须要实现的方法。</p>
<p>由于实际运用中，最常用的是用户名和密码方式的认证，CAS3 提供了针对该方式的实现，如清单 3 所示：</p>
<br />
<a name="N10127"><strong>清单 3. AbstractUsernamePasswordAuthenticationHandler 定义</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            public abstract class AbstractUsernamePasswordAuthenticationHandler extends
            AbstractPreAndPostProcessingAuthenticationHandler{
            ...
            protected final boolean doAuthentication(final Credentials credentials)
            throws AuthenticationException {
            return authenticateUsernamePasswordInternal((UsernamePasswordCredentials) credentials);
            }
            protected abstract boolean authenticateUsernamePasswordInternal(
            final UsernamePasswordCredentials credentials) throws AuthenticationException;
            protected final PasswordEncoder getPasswordEncoder() {
            return this.passwordEncoder;
            }
            public final void setPasswordEncoder(final PasswordEncoder passwordEncoder) {
            this.passwordEncoder = passwordEncoder;
            }
            ...
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>基于用户名密码的认证方式可直接扩展自 AbstractUsernamePasswordAuthenticationHandler，验证用户名密码的具体操作通过实现 authenticateUsernamePasswordInternal() 方法达到，另外，通常情况下密码会是加密过的，setPasswordEncoder() 方法就是用于指定适当的加密器。</p>
<p>从以上清单中可以看到，doAuthentication() 方法的参数是 Credentials 类型，这是包含用户认证信息的一个接口，对于用户名密码类型的认证信息，可以直接使用 UsernamePasswordCredentials，如果需要扩展其他类型的认证信息，需要实现Credentials接口，并且实现相应的 CredentialsToPrincipalResolver 接口，其具体方法可以借鉴 UsernamePasswordCredentials 和 UsernamePasswordCredentialsToPrincipalResolver。</p>
<p><strong>JDBC 认证方法</strong> </p>
<p>用户的认证信息通常保存在数据库中，因此本文就选用这种情况来介绍。将前面下载的 cas-server-3.1.1-release.zip 包解开后，在 modules 目录下可以找到包 cas-server-support-jdbc-3.1.1.jar，其提供了通过 JDBC 连接数据库进行验证的缺省实现，基于该包的支持，我们只需要做一些配置工作即可实现 JDBC 认证。</p>
<p>JDBC 认证方法支持多种数据库，DB2, Oracle, MySql, Microsoft SQL Server 等均可，这里以 DB2 作为例子介绍。并且假设DB2数据库名： CASTest，数据库登录用户名： db2user，数据库登录密码： db2password，用户信息表为： userTable，该表包含用户名和密码的两个数据项分别为 userName 和 password。</p>
<p><strong>1. </strong><strong>配置</strong> <strong>DataStore</strong> </p>
<p>打开文件 %CATALINA_HOME%/webapps/cas/WEB-INF/deployerConfigContext.xml，添加一个新的 bean 标签，对于 DB2，内容如清单 4 所示：</p>
<br />
<a name="N10152"><strong>清单 4. 配置 DataStore</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            &lt;bean id="casDataSource" class="org.apache.commons.dbcp.BasicDataSource"&gt;
            &lt;property name="driverClassName"&gt;
            &lt;value&gt;com.ibm.db2.jcc.DB2Driver&lt;/value&gt;
            &lt;/property&gt;
            &lt;property name="url"&gt;
            &lt;value&gt;jdbc:db2://9.125.65.134:50000/CASTest&lt;/value&gt;
            &lt;/property&gt;
            &lt;property name="username"&gt;
            &lt;value&gt;db2user&lt;/value&gt;
            &lt;/property&gt;
            &lt;property name="password"&gt;
            &lt;value&gt;db2password&lt;/value&gt;
            &lt;/property&gt;
            &lt;/bean&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>其中 id 属性为该 DataStore 的标识，在后面配置 AuthenticationHandler 会被引用，另外，需要提供 DataStore 所必需的数据库驱动程序、连接地址、数据库登录用户名以及登录密码。</p>
<p><strong>2. 配置 AuthenticationHandler</strong> </p>
<p>在 cas-server-support-jdbc-3.1.1.jar 包中，提供了 3 个基于 JDBC 的 AuthenticationHandler，分别为 BindModeSearchDatabaseAuthenticationHandler, QueryDatabaseAuthenticationHandler, SearchModeSearchDatabaseAuthenticationHandler。其中 BindModeSearchDatabaseAuthenticationHandler 是用所给的用户名和密码去建立数据库连接，根据连接建立是否成功来判断验证成功与否；QueryDatabaseAuthenticationHandler 通过配置一个 SQL 语句查出密码，与所给密码匹配；SearchModeSearchDatabaseAuthenticationHandler 通过配置存放用户验证信息的表、用户名字段和密码字段，构造查询语句来验证。</p>
<p>使用哪个 AuthenticationHandler，需要在 deployerConfigContext.xml 中设置，默认情况下，CAS 使用一个简单的 username=password 的 AuthenticationHandler，在文件中可以找到如下一行：&lt;bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePassword<br />
AuthenticationHandler" /&gt;，我们可以将其注释掉，换成我们希望的一个 AuthenticationHandler，比如，使用QueryDatabaseAuthenticationHandler 或 SearchModeSearchDatabaseAuthenticationHandler 可以分别选取清单 5 或清单 6 的配置。</p>
<br />
<a name="N1016D"><strong>清单 5. 使用 QueryDatabaseAuthenticationHandler</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            &lt;bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"&gt;
            &lt;property name="dataSource" ref=" casDataSource " /&gt;
            &lt;property name="sql"
            value="select password from userTable where lower(userName) = lower(?)" /&gt;
            &lt;/bean&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<a name="N10177"><strong>清单 6. 使用 SearchModeSearchDatabaseAuthenticationHandler</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            &lt;bean id="SearchModeSearchDatabaseAuthenticationHandler"
            class="org.jasig.cas.adaptors.jdbc.SearchModeSearchDatabaseAuthenticationHandler"
            abstract="false" singleton="true" lazy-init="default"
            autowire="default" dependency-check="default"&gt;
            &lt;property  name="tableUsers"&gt;
            &lt;value&gt;userTable&lt;/value&gt;
            &lt;/property&gt;
            &lt;property name="fieldUser"&gt;
            &lt;value&gt;userName&lt;/value&gt;
            &lt;/property&gt;
            &lt;property name="fieldPassword"&gt;
            &lt;value&gt;password&lt;/value&gt;
            &lt;/property&gt;
            &lt;property name="dataSource" ref=" casDataSource " /&gt;
            &lt;/bean&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>另外，由于存放在数据库中的密码通常是加密过的，所以 AuthenticationHandler 在匹配时需要知道使用的加密方法，在 deployerConfigContext.xml 文件中我们可以为具体的 AuthenticationHandler 类配置一个 property，指定加密器类，比如对于 QueryDatabaseAuthenticationHandler，可以修改如清单7所示：</p>
<br />
<a name="N10184"><strong>清单 7. 添加 passwordEncoder</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            &lt;bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"&gt;
            &lt;property name="dataSource" ref=" casDataSource " /&gt;
            &lt;property name="sql"
            value="select password from userTable where lower(userName) = lower(?)" /&gt;
            &lt;property  name="passwordEncoder"  ref="myPasswordEncoder"/&gt;
            &lt;/bean&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>其中 myPasswordEncoder 是对清单 8 中设置的实际加密器类的引用：</p>
<br />
<a name="N10191"><strong>清单 8. 指定具体加密器类</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            &lt;bean id="passwordEncoder"
            class="org.jasig.cas.authentication.handler.MyPasswordEncoder"/&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>这里 MyPasswordEncoder 是根据实际情况自己定义的加密器，实现 PasswordEncoder 接口及其 encode() 方法。</p>
<p><strong>3. 部署依赖包</strong> </p>
<p>在以上配置完成以后，需要拷贝几个依赖的包到 cas 应用下，包括：</p>
<ul>
    <li>将 cas-server-support-jdbc-3.1.1.jar 拷贝到 %CATALINA_HOME%/webapps/cas/ WEB-INF/lib 目录。
    <li>数据库驱动，由于这里使用 DB2，将 %DB2_HOME%/java 目录下的 db2java.zip （更名为 db2java.jar）, db2jcc.jar, db2jcc_license_cu.jar 拷贝到 %CATALINA_HOME%/webapps/cas/WEB-INF/lib 目录。对于其他数据库，同样将相应数据库驱动程序拷贝到该目录。
    <li>DataStore 依赖于 commons-collections-3.2.jar, commons-dbcp-1.2.1.jar, commons-pool-1.3.jar，需要到 apache 网站的 Commons 项目下载以上 3 个包放进 %CATALINA_HOME%/webapps/cas/WEB-INF/lib 目录。 </li>
</ul>
<p><a name="N101B0"><span class="smalltitle">扩展 CAS Server 界面</span></a></p>
<p>CAS 提供了 2 套默认的页面，分别为&#8220; default &#8221;和&#8220; simple &#8221;，分别在目录&#8220; cas/WEB-INF/view/jsp/default &#8221;和&#8220; cas/WEB-INF/view/jsp/simple &#8221;下。其中 default 是一个稍微复杂一些的页面，使用 CSS，而 simple 则是能让 CAS 正常工作的最简化的页面。</p>
<p>在部署 CAS 之前，我们可能需要定制一套新的 CAS Server 页面，添加一些个性化的内容。最简单的方法就是拷贝一份 default 或 simple 文件到&#8220; cas/WEB-INF/view/jsp &#8221;目录下，比如命名为 newUI，接下来是实现和修改必要的页面，有 4 个页面是必须的：</p>
<ul>
    <li>casConfirmView.jsp: 当用户选择了&#8220; warn &#8221;时会看到的确认界面
    <li>casGenericSuccess.jsp: 在用户成功通过认证而没有目的Service时会看到的界面
    <li>casLoginView.jsp: 当需要用户提供认证信息时会出现的界面
    <li>casLogoutView.jsp: 当用户结束 CAS 单点登录系统会话时出现的界面 </li>
</ul>
<p>CAS 的页面采用 Spring 框架编写，对于不熟悉 Spring 的使用者，在修改之前需要熟悉该框架。</p>
<p>页面定制完过后，还需要做一些配置从而让 CAS 找到新的页面，拷贝&#8220; cas/WEB-INF/classes/default_views.properties &#8221;，重命名为&#8220; cas/WEB-INF/classes/ newUI_views.properties &#8221;，并修改其中所有的值到相应新页面。最后是更新&#8220; cas/WEB-INF/cas-servlet.xml &#8221;文件中的 viewResolver，将其修改为如清单 9 中的内容。</p>
<br />
<a name="N101D4"><strong>清单 9. 指定 CAS 页面</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            &lt;bean id="viewResolver"
            class="org.springframework.web.servlet.view.ResourceBundleViewResolver" p:order="0"&gt;
            &lt;property name="basenames"&gt;
            &lt;list&gt;
            &lt;value&gt;${cas.viewResolver.basename}&lt;/value&gt;
            &lt;value&gt; newUI_views&lt;/value&gt;
            &lt;/list&gt;
            &lt;/property&gt;
            &lt;/bean&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www-128.ibm.com/developerworks/cn/opensource/os-cn-cas/?S_TACT=105AGX52&amp;S_CMP=techcsdn#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="4.部署客户端应用"><span class="atitle">部署客户端应用</span></a></p>
<p>单点登录的目的是为了让多个相关联的应用使用相同的登录过程，本文在讲解过程中构造 2个简单的应用，分别以 casTest1 和 casTest2 来作为示例，它们均只有一个页面，显示欢迎信息和当前登录用户名。这 2 个应用使用同一套登录信息，并且只有登录过的用户才能访问，通过本文的配置，实现单点登录，即只需登录一次就可以访问这两个应用。</p>
<p><a name="N101E4"><span class="smalltitle">与 CAS Server 建立信任关系</span></a></p>
<p>假设 CAS Server 单独部署在一台机器 A，而客户端应用部署在机器 B 上，由于客户端应用与 CAS Server 的通信采用 SSL，因此，需要在 A 与 B 的 JRE 之间建立信任关系。</p>
<p>首先与 A 机器一样，要生成 B 机器上的证书，配置 Tomcat 的 SSL 协议。其次，下载<a href="http://blogs.sun.com/andreas/entry/no_more_unable_to_find" cmimpressionsent="1">http://blogs.sun.com/andreas/entry/no_more_unable_to_find</a> 的 InstallCert.java，运行&#8220; java InstallCert compA:8443 &#8221;命令，并且在接下来出现的询问中输入 1。这样，就将 A 添加到了 B 的 trust store 中。如果多个客户端应用分别部署在不同机器上，那么每个机器都需要与 CAS Server 所在机器建立信任关系。</p>
<p><a name="N101F4"><span class="smalltitle">配置 CAS Filter</span></a></p>
<p>准备好应用 casTest1 和 casTest2 过后，分别部署在 B 和 C 机器上，由于 casTest1 和casTest2，B 和 C 完全等同，我们以 casTest1 在 B 机器上的配置做介绍，假设 A 和 B 的域名分别为 domainA 和 domainB。</p>
<p>将 cas-client-java-2.1.1.zip 改名为 cas-client-java-2.1.1.jar 并拷贝到 casTest1/WEB-INF/lib目录下，修改 web.xml 文件，添加 CAS Filter，如清单 10 所示：</p>
<br />
<a name="N10203"><strong>清单 10. 添加 CAS Filter</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            &lt;web-app&gt;
            ...
            &lt;filter&gt;
            &lt;filter-name&gt;CAS Filter&lt;/filter-name&gt;
            &lt;filter-class&gt;edu.yale.its.tp.cas.client.filter.CASFilter&lt;/filter-class&gt;
            &lt;init-param&gt;
            &lt;param-name&gt;edu.yale.its.tp.cas.client.filter.loginUrl&lt;/param-name&gt;
            &lt;param-value&gt;https://domainA:8443/cas/login&lt;/param-value&gt;
            &lt;/init-param&gt;
            &lt;init-param&gt;
            &lt;param-name&gt;edu.yale.its.tp.cas.client.filter.validateUrl&lt;/param-name&gt;
            &lt;param-value&gt;https://domainA:8443/cas/serviceValidate&lt;/param-value&gt;
            &lt;/init-param&gt;
            &lt;init-param&gt;
            &lt;param-name&gt;edu.yale.its.tp.cas.client.filter.serverName&lt;/param-name&gt;
            &lt;param-value&gt;domainB:8080&lt;/param-value&gt;
            &lt;/init-param&gt;
            &lt;/filter&gt;
            &lt;filter-mapping&gt;
            &lt;filter-name&gt;CAS Filter&lt;/filter-name&gt;
            &lt;url-pattern&gt;/protected-pattern/*&lt;/url-pattern&gt;
            &lt;/filter-mapping&gt;
            ...
            &lt;/web-app&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>对于所有访问满足 casTest1/protected-pattern/ 路径的资源时，都要求到 CAS Server 登录，如果需要整个 casTest1 均受保护，可以将 url-pattern 指定为&#8220;/*&#8221;。</p>
<p>从清单 10 可以看到，我们可以为 CASFilter 指定一些参数，并且有些是必须的，<a href="http://www-128.ibm.com/developerworks/cn/opensource/os-cn-cas/?S_TACT=105AGX52&amp;S_CMP=techcsdn#_Ref188033615" cmimpressionsent="1">表格 1</a> 和<a href="http://www-128.ibm.com/developerworks/cn/opensource/os-cn-cas/?S_TACT=105AGX52&amp;S_CMP=techcsdn#_Ref188033632" cmimpressionsent="1">表格 2</a> 中分别是必需和可选的参数：</p>
<br />
<a name="表格1|table"><strong>表格 1. CASFilter 必需的参数</strong></a><br />
<table class="data-table-1" cellspacing="0" cellpadding="0" border="0">
    <tbody>
        <tr>
            <td style="vertical-align: top; text-align: left"><strong>参数名</strong> </td>
            <td style="vertical-align: top; text-align: left"><strong>作用</strong> </td>
        </tr>
        <tr>
            <td style="vertical-align: top; text-align: left">edu.yale.its.tp.cas.client.filter.loginUrl </td>
            <td style="vertical-align: top; text-align: left">指定 CAS 提供登录页面的 URL </td>
        </tr>
        <tr>
            <td style="vertical-align: top; text-align: left">edu.yale.its.tp.cas.client.filter.validateUrl </td>
            <td style="vertical-align: top; text-align: left">指定 CAS 提供 service ticket 或 proxy ticket 验证服务的 URL </td>
        </tr>
        <tr>
            <td style="vertical-align: top; text-align: left">edu.yale.its.tp.cas.client.filter.serverName </td>
            <td style="vertical-align: top; text-align: left">指定客户端的域名和端口，是指客户端应用所在机器而不是 CAS Server 所在机器，该参数或 serviceUrl 至少有一个必须指定 </td>
        </tr>
        <tr>
            <td style="vertical-align: top; text-align: left">edu.yale.its.tp.cas.client.filter.serviceUrl </td>
            <td style="vertical-align: top; text-align: left">该参数指定过后将覆盖 serverName 参数，成为登录成功过后重定向的目的地址 </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<a name="表格2|table"><strong>表格 2. CASFilter 可选参数</strong></a><br />
<table class="data-table-1" cellspacing="0" cellpadding="0" border="0">
    <tbody>
        <tr>
            <td style="vertical-align: top; text-align: left"><strong>参数名</strong> </td>
            <td style="vertical-align: top; text-align: left"><strong>作用</strong> </td>
        </tr>
        <tr>
            <td style="vertical-align: top; text-align: left">edu.yale.its.tp.cas.client.filter.proxyCallbackUrl </td>
            <td style="vertical-align: top; text-align: left">用于当前应用需要作为其他服务的代理(proxy)时获取 Proxy Granting Ticket 的地址 </td>
        </tr>
        <tr>
            <td style="vertical-align: top; text-align: left">edu.yale.its.tp.cas.client.filter.authorizedProxy </td>
            <td style="vertical-align: top; text-align: left">用于允许当前应用从代理处获取 proxy tickets，该参数接受以空格分隔开的多个 proxy URLs，但实际使用只需要一个成功即可。当指定该参数过后，需要修改 validateUrl 到 proxyValidate，而不再是 serviceValidate </td>
        </tr>
        <tr>
            <td style="vertical-align: top; text-align: left">edu.yale.its.tp.cas.client.filter.renew </td>
            <td style="vertical-align: top; text-align: left">如果指定为 true，那么受保护的资源每次被访问时均要求用户重新进行验证，而不管之前是否已经通过 </td>
        </tr>
        <tr>
            <td style="vertical-align: top; text-align: left">edu.yale.its.tp.cas.client.filter.wrapRequest </td>
            <td style="vertical-align: top; text-align: left">如果指定为 true，那么 CASFilter 将重新包装 HttpRequest,并且使 getRemoteUser() 方法返回当前登录用户的用户名 </td>
        </tr>
        <tr>
            <td style="vertical-align: top; text-align: left">edu.yale.its.tp.cas.client.filter.gateway </td>
            <td style="vertical-align: top; text-align: left">指定 gateway 属性 </td>
        </tr>
    </tbody>
</table>
<br />
<p><a name="N102BB"><span class="smalltitle">传递登录用户名</span></a></p>
<p>CAS 在登录成功过后，会给浏览器回传 Cookie，设置新的到的 Service Ticket。但客户端应用拥有各自的 Session，我们要怎么在各个应用中获取当前登录用户的用户名呢？CAS Client 的 Filter 已经做好了处理，在登录成功后，就可以直接从 Session 的属性中获取，如清单 11 所示：</p>
<br />
<a name="N102C7"><strong>清单 11. 在 Java 中通过 Session 获取登录用户名</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            // 以下两者都可以
            session.getAttribute(CASFilter.CAS_FILTER_USER);
            session.getAttribute("edu.yale.its.tp.cas.client.filter.user");
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>在 JSTL 中获取用户名的方法如清单 12 所示：</p>
<br />
<a name="N102D4"><strong>清单 12. 通过 JSTL 获取登录用户名</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            &lt;c:out value="${sessionScope[CAS:'edu.yale.its.tp.cas.client.filter.user']}"/&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>另外，CAS 提供了一个 CASFilterRequestWrapper 类，该类继承自HttpServletRequestWrapper，主要是重写了 getRemoteUser() 方法，只要在前面配置 CASFilter 的时候为其设置&#8220; edu.yale.its.tp.cas.client.filter.wrapRequest &#8221;参数为 true，就可以通过 getRemoteUser（） 方法来获取登录用户名，具体方法如清单 13 所示：</p>
<br />
<a name="N102E1"><strong>清单 13. 通过 CASFilterRequestWrapper 获取登录用户名</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            CASFilterRequestWrapper  reqWrapper=new CASFilterRequestWrapper(request);
            out.println("The logon user:" + reqWrapper.getRemoteUser());
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www-128.ibm.com/developerworks/cn/opensource/os-cn-cas/?S_TACT=105AGX52&amp;S_CMP=techcsdn#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="5.效果"><span class="atitle">效果</span></a></p>
<p>在 casTest1 和 casTest2 中，都有一个简单 Servlet 作为欢迎页面 WelcomPage，且该页面必须登录过后才能访问，页面代码如清单 14 所示：</p>
<br />
<a name="N102F4"><strong>清单 14. WelcomePage 页面代码</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            public class WelcomePage extends HttpServlet {
            public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException
            {
            response.setContentType("text/html");
            PrintWriter out = response.getWriter();
            out.println("&lt;html&gt;");
            out.println("&lt;head&gt;");
            out.println("&lt;title&gt;Welcome to casTest2 sample System!&lt;/title&gt;");
            out.println("&lt;/head&gt;");
            out.println("&lt;body&gt;");
            out.println("&lt;h1&gt;Welcome to casTest1 sample System!&lt;/h1&gt;");
            CASFilterRequestWrapper  reqWrapper=new CASFilterRequestWrapper(request);
            out.println("&lt;p&gt;The logon user:" + reqWrapper.getRemoteUser() + "&lt;/p&gt;");
            HttpSession session=request.getSession();
            out.println("&lt;p&gt;The logon user:" +
            session.getAttribute(CASFilter.CAS_FILTER_USER)  + "&lt;/p&gt;");
            out.println("&lt;p&gt;The logon user:" +
            session.getAttribute("edu.yale.its.tp.cas.client.filter.user") + "&lt;/p&gt;");
            out.println("&lt;/body&gt;");
            out.println("&lt;/html&gt;");
            }
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>在上面所有配置结束过后，分别在 A， B， C上启动 cas， casTest1 和 casTest2，按照下面步骤来访问 casTest1 和 casTest2：</p>
<ol type="1">
    <li>打开浏览器，访问 <a href="http://domainb:8080/casTest1/WelcomePage" cmimpressionsent="1">http://domainB:8080/casTest1/WelcomePage</a> ，浏览器会弹出安全提示，接受后即转到 CAS 的登录页面，如图 2 所示： </li>
</ol>
<br />
<a name="_Ref188554660"><strong>图 2. CAS 登录页面</strong></a><br />
<img height="351" alt="CAS 登录页面" src="http://www-128.ibm.com/developerworks/cn/opensource/os-cn-cas/images/image002.jpg" width="553" /> <br />
<ol type="1">
    <li>登录成功后，再重定向到 casTest1 的 WelcomePage 页面，如<a href="http://www-128.ibm.com/developerworks/cn/opensource/os-cn-cas/?S_TACT=105AGX52&amp;S_CMP=techcsdn#_Ref188552289" cmimpressionsent="1">图 </a>所示： </li>
</ol>
<br />
<a name="_Ref188552289"><strong>图 3. 登录后访问 casTest1 的效果</strong></a><br />
<img height="315" alt="登录后访问 casTest1 的效果" src="http://www-128.ibm.com/developerworks/cn/opensource/os-cn-cas/images/image003.jpg" width="554" /> <br />
<p>可以看到<a href="http://www-128.ibm.com/developerworks/cn/opensource/os-cn-cas/?S_TACT=105AGX52&amp;S_CMP=techcsdn#_Ref188552289" cmimpressionsent="1">图 </a>中地址栏里的地址多出了一个 ticket 参数，这就是 CAS 分配给当前应用的 ST(Service Ticket)。</p>
<ol type="1">
    <li>再在同一个浏览器的地址栏中输入 <a href="http://domainb:8080/casTest1/WelcomePage" cmimpressionsent="1">http://domainC:8080/casTest2/WelcomePage</a> ，系统不再提示用户登录，而直接出现如图 4 所示的页面，并且显示在 casTest1 中已经登录过的用户。 </li>
</ol>
<br />
<a name="N1034A"><strong>图 4. 在 casTest1 中登录过后访问 casTest2 的效果</strong></a><br />
<img height="307" alt="在 casTest1 中登录过后访问 casTest2 的效果" src="http://www-128.ibm.com/developerworks/cn/opensource/os-cn-cas/images/image004.jpg" width="553" /> <br />
<ol type="1">
    <li>重新打开一个浏览器窗口，先输入 <a href="http://domainb:8080/casTest1/WelcomePage" cmimpressionsent="1">http://domainC:8080/casTest2/WelcomePage</a> ，系统要求登录，在登录成功过后，正确显示 casTest2 的页面。之后再在地址栏重新输入 <a href="http://domainb:8080/casTest1/WelcomePage" cmimpressionsent="1">http://domainB:8080/casTest1/WelcomePage</a> ，会直接显示 casTest1 的页面而无需再次登录。 </li>
</ol>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www-128.ibm.com/developerworks/cn/opensource/os-cn-cas/?S_TACT=105AGX52&amp;S_CMP=techcsdn#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="6.结束语"><span class="atitle">结束语</span></a></p>
<p>本文介绍了 CAS 单点登录解决方案的原理，并结合实例讲解了在 Tomcat 中使用 CAS 的配置、部署方法以及效果。CAS 是作为开源单点登录解决方案的一个不错选择，更多的使用细节可以参考 CAS 官方网站。</p>
<br />
<br />
<p><a name="resources"><span class="atitle">参考资料 </span></a></p>
<ul>
    <li>有关 CAS 方面的信息， 请参考<a href="http://www.ja-sig.org/products/cas" cmimpressionsent="1">CAS 官方网站</a>。 <br />
    <br />
    <li>浏览<a href="http://www.ja-sig.org/facebook/" cmimpressionsent="1">JA-SIG 社区</a>，与社区分享 Java 技术。 </li>
</ul>
<br />
<br />
<p><a name="author"><span class="atitle">作者简介</span></a></p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td colspan="3"><img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /></td>
        </tr>
        <tr valign="top" align="left">
            <td>
            <p>&nbsp;</p>
            </td>
            <td><img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="4" /></td>
            <td width="100%">
            <p>张涛，IBM 中国软件开发实验室工程师，目前主要致力于基于 Rational 平台解决方案的开发。</p>
            </td>
        </tr>
    </tbody>
</table>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td colspan="3"><img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /></td>
        </tr>
        <tr valign="top" align="left">
            <td>
            <p>&nbsp;</p>
            </td>
            <td><img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="4" /></td>
            <td width="100%">
            <p>王秉坤，IBM 中国软件开发实验室工程师，目前主要致力于基于 Rational 平台解决方案的开发。</p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/CrazyJava/aggbug/193250.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2008-04-16 00:38 <a href="http://www.blogjava.net/CrazyJava/articles/193250.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat集群和负载均衡</title><link>http://www.blogjava.net/CrazyJava/articles/183077.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Sat, 01 Mar 2008 01:23:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/183077.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/183077.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/183077.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/183077.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/183077.html</trackback:ping><description><![CDATA[(一)环境说明<br />
(1)服务器有4台，一台安装apache,三台安装tomcat<br />
(2)apache2.0.55、tomcat5.5.15、jk2.0.4、jdk1.5.6或jdk1.4.2<br />
(3)ip配置,一台安装apache的ip为192.168.0.88,三台安装tomcat的服务器ip分别为192.168.0.1/2/4<br />
(二)安装过程<br />
(1)在三台要安装tomcat的服务器上先安装jdk<br />
(2)配置jdk的安装路径,在环境变量path中加入jdk的bin路径,新建环境变量JAVA_HOME指向jdk的安装路径<br />
(3)在三台要安装tomcat的服务器上分别安装tomcat,调试三个tomcat到能够正常启动<br />
(4)tomcat的默认WEB服务端口是8080,默认的模式是单独服务,我的三个tomcat的WEB服务端口修改为7080/8888/9999<br />
修改位置为tomcat的安装目录下的conf/server.xml<br />
修改前的配置为<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;Connector port="8080" maxHttpHeaderSize="8192"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableLookups="false" redirectPort="8443" acceptCount="100"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connectionTimeout="20000" disableUploadTimeout="true" /&gt;<br />
修改后的配置为<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;Connector port="7080" maxHttpHeaderSize="8192"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableLookups="false" redirectPort="8443" acceptCount="100"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connectionTimeout="20000" disableUploadTimeout="true" /&gt;<br />
依次修改每个tomcat的监听端口(7080/8888/9999)<br />
<br />
(5)分别测试每个tomcat的启动是否正常<br />
http://192.168.0.1:7080<br />
http://192.168.0.2:8888<br />
http://192.168.0.4:9999<br />
(三)负载均衡配置过程<br />
(1)在那台要安装apache的服务器上安装apache2.0.55,我的安装路径为默认C:\Program Files\Apache Group\Apache2<br />
(2)安装后测试apache能否正常启动，调试到能够正常启动http://192.168.0.88<br />
(3)下载jk2.0.4后解压缩文件<br />
(4)将解压缩后的目录中的modules目录中的mod_jk2.so文件复制到apache的安装目录下的modules目录中,我的为C:\Program Files\Apache Group\Apache2\modules<br />
(5)修改apache的安装目录中的conf目录的配置文件httpd.conf，在文件中加LoadModule模块配置信息的最后加上一句LoadModule jk2_module modules/mod_jk2.so<br />
(6)分别修改三个tomcat的配置文件conf/server.xml，修改内容如下<br />
修改前<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- An Engine represents the entry point (within Catalina) that processes<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; every request.&nbsp;&nbsp;The Engine implementation for Tomcat stand alone<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; analyzes the HTTP headers included with the request, and passes them<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; on to the appropriate Host (virtual host). --&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- You should set jvmRoute to support load-balancing via AJP ie :<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;Engine name="Standalone" defaultHost="localhost" jvmRoute="jvm1"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;--&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- Define the top level container in our container hierarchy --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;Engine name="Catalina" defaultHost="localhost"&gt;<br />
修改后<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- An Engine represents the entry point (within Catalina) that processes<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; every request.&nbsp;&nbsp;The Engine implementation for Tomcat stand alone<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; analyzes the HTTP headers included with the request, and passes them<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; on to the appropriate Host (virtual host). --&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- You should set jvmRoute to support load-balancing via AJP ie :--&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;Engine name="Standalone" defaultHost="localhost" jvmRoute="tomcat1"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- Define the top level container in our container hierarchy <br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;Engine name="Catalina" defaultHost="localhost"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;--&gt;<br />
将其中的jvmRoute="jvm1"分别修改为jvmRoute="tomcat1"和jvmRoute="tomcat2"和jvmRoute="tomcat3"<br />
<br />
(7)然后重启三个tomcat，调试能够正常启动。<br />
(8)在apache的安装目录中的conf目录下创建文件workers2.propertie，写入文件内容如下<br />
<br />
# fine the communication channel <br />
[channel.socket:192.168.0.1:8009] <br />
info=Ajp13 forwarding over socket<br />
#配置第一个服务器 <br />
tomcatId=tomcat1 #要和tomcat的配置文件server.xml中的jvmRoute="tomcat1"名称一致<br />
debug=0 <br />
lb_factor=1 #负载平衡因子，数字越大请求被分配的几率越高<br />
<br />
# Define the communication channel <br />
[channel.socket:192.168.0.2:8009] <br />
info=Ajp13 forwarding over socket<br />
tomcatId=tomcat2 <br />
debug=0 <br />
lb_factor=1 <br />
<br />
# Define the communication channel <br />
[channel.socket:192.168.0.4:8009] <br />
info=Ajp13 forwarding over socket<br />
tomcatId=tomcat3 <br />
debug=0 <br />
lb_factor=1 <br />
<br />
[status:] <br />
info=Status worker, displays runtime information.&nbsp;&nbsp;<br />
<br />
[uri:/jkstatus.jsp] <br />
info=Display status information and checks the config file for changes. <br />
group=status: <br />
<br />
[uri:/*] <br />
info=Map the whole webapp <br />
debug=0<br />
(9)在三个tomcat的安装目录中的webapps建立相同的应用,我和应用目录名为TomcatDemo,在三个应用目录中建立相同 WEB-INF目录和页面index.jsp,index.jsp的页面内容如下<br />
&lt;%@ page contentType="text/html; charset=GBK" %&gt;<br />
&lt;%@ page import="java.util.*" %&gt;<br />
&lt;html&gt;&lt;head&gt;&lt;title&gt;Cluster App Test&lt;/title&gt;&lt;/head&gt;<br />
&lt;body&gt;<br />
Server Info:<br />
&lt;%<br />
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"&lt;br&gt;");%&gt;<br />
&lt;%<br />
&nbsp;&nbsp;out.println("&lt;br&gt; ID " + session.getId()+"&lt;br&gt;");<br />
<br />
&nbsp;&nbsp;// 如果有新的 Session 属性设置<br />
&nbsp;&nbsp;String dataName = request.getParameter("dataName");<br />
&nbsp;&nbsp;if (dataName != null &amp;&amp; dataName.length() &gt; 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; String dataValue = request.getParameter("dataValue");<br />
&nbsp;&nbsp;&nbsp;&nbsp; session.setAttribute(dataName, dataValue);<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;out.print("&lt;b&gt;Session 列表&lt;/b&gt;");<br />
<br />
&nbsp;&nbsp;Enumeration e = session.getAttributeNames();<br />
&nbsp;&nbsp;while (e.hasMoreElements()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; String name = (String)e.nextElement();<br />
&nbsp;&nbsp;&nbsp;&nbsp; String value = session.getAttribute(name).toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp; out.println( name + " = " + value+"&lt;br&gt;");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println( name + " = " + value);<br />
&nbsp;&nbsp; }<br />
%&gt;<br />
&nbsp;&nbsp;&lt;form action="index.jsp" method="POST"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;名称:&lt;input type=text size=20 name="dataName"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;br&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;值:&lt;input type=text size=20 name="dataValue"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;br&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;input type=submit&gt;<br />
&nbsp;&nbsp; &lt;/form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
(10)重启apache服务器和三个tomcat服务器,到此负载 均衡已配置完成。测试负载均衡先测试apache,访问http://192.168.0.88/jkstatus.jsp<br />
能否正常访问，并查询其中的内容，有三个tomcat的相关配置信息和负载说明,访问http://192.168.0.88/TomcatDemo/index.jsp看能够运行,<br />
能运行，则已建立负载均衡。<br />
(四)tomcat集群配置<br />
(1)负载均衡配置的条件下配置tomcat集群<br />
(2)分别修改三个tomcat的配置文件conf/server.xml,修改内容如下<br />
修改前<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; managerClassName="org.apache.catalina.cluster.session.DeltaManager"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; expireSessionsOnShutdown="false"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; useDirtyFlag="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; notifyListenersOnReplication="true"&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Membership <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;className="org.apache.catalina.cluster.mcast.McastService"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mcastAddr="228.0.0.4"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mcastPort="45564"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mcastFrequency="500"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mcastDropTime="3000"/&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Receiver <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;className="org.apache.catalina.cluster.tcp.ReplicationListener"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tcpListenAddress="auto"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tcpListenPort="4001"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tcpSelectorTimeout="100"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tcpThreadCount="6"/&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Sender<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;replicationMode="pooled"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ackTimeout="5000"/&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempDir="/tmp/war-temp/"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deployDir="/tmp/war-deploy/"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;watchDir="/tmp/war-listen/"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;watchEnabled="false"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Cluster&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&gt;&nbsp;&nbsp; <br />
修改后<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- modify by whh --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; managerClassName="org.apache.catalina.cluster.session.DeltaManager"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; expireSessionsOnShutdown="false"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; useDirtyFlag="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; notifyListenersOnReplication="true"&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Membership <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;className="org.apache.catalina.cluster.mcast.McastService"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mcastAddr="228.0.0.4"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mcastPort="45564"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mcastFrequency="500"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mcastDropTime="3000"/&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Receiver <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;className="org.apache.catalina.cluster.tcp.ReplicationListener"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tcpListenAddress="auto"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tcpListenPort="4001"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tcpSelectorTimeout="100"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tcpThreadCount="6"/&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Sender<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;replicationMode="pooled"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ackTimeout="5000"/&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempDir="/tmp/war-temp/"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deployDir="/tmp/war-deploy/"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;watchDir="/tmp/war-listen/"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;watchEnabled="false"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Cluster&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- modify by whh --&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
将集群配置选项的注释放开即可，如上。<br />
(3)重启三个tomcat。到此tomcat的集群已配置完成。&nbsp;&nbsp;<br />
<br />
(五)应用配置<br />
对于要进行负载和集群的的tomcat目录下的webapps中的应用中的WEB-INF中的web.xml文件要添加如下一句配置<br />
&lt;distributable/&gt;<br />
配置前<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"&gt;<br />
&nbsp;&nbsp;&lt;display-name&gt;TomcatDemo&lt;/display-name&gt;<br />
&lt;/web-app&gt;<br />
配置后<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"&gt;<br />
&nbsp;&nbsp;&lt;display-name&gt;TomcatDemo&lt;/display-name&gt;<br />
&nbsp;&nbsp; &lt;distributable/&gt;<br />
&lt;/web-app&gt;<br />
<br />
<img src ="http://www.blogjava.net/CrazyJava/aggbug/183077.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2008-03-01 09:23 <a href="http://www.blogjava.net/CrazyJava/articles/183077.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat配置技巧Top 10</title><link>http://www.blogjava.net/CrazyJava/articles/183075.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Sat, 01 Mar 2008 01:13:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/183075.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/183075.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/183075.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/183075.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/183075.html</trackback:ping><description><![CDATA[编者按：现在开发Java Web应用，建立和部署Web内容是一件很简单的工作。使用Jakarta Tomcat作为Servlet和JSP容器的人已经遍及全世界。Tomcat具有免费、跨平台等诸多特性，并且更新得很快，现在非常的流行。<br />
<br />
你所需要做的就是：按照你的需求配置Tomcat，只要你正确配置，Tomcat一般都能适合你的要求。下面是一系列关于Tomcat的配置技巧，这些技巧源自于我的书：《Tomcat权威指南》，希望对你有所帮助。—— Jason Brittain<br />
<br />
1． 配置系统管理（Admin Web Application）<br />
大多数商业化的J2EE服务器都提供一个功能强大的管理界面，且大都采用易于理解的Web应用界面。Tomcat按照自己的方式，同样提供一个成熟的管理工具，并且丝毫不逊于那些商业化的竞争对手。Tomcat的Admin Web Application最初在4.1版本时出现，当时的功能包括管理context、data source、user和group等。当然也可以管理像初始化参数，user、group、role的多种数据库管理等。在后续的版本中，这些功能将得到很大的扩展，但现有的功能已经非常实用了。<br />
<br />
Admin Web Application被定义在自动部署文件：CATALINA_BASE/webapps/admin.xml 。<br />
（译者注：CATALINA_BASE即tomcat安装目录下的server目录）<br />
<br />
你必须编辑这个文件，以确定Context中的docBase参数是绝对路径。也就是说，CATALINA_BASE/webapps/admin.xml 的路径是绝对路径。作为另外一种选择，你也可以删除这个自动部署文件，而在server.xml文件中建立一个Admin Web Application的context，效果是一样的。你不能管理Admin Web Application这个应用，换而言之，除了删除CATALINA_BASE/webapps/admin.xml ，你可能什么都做不了。<br />
<br />
如果你使用UserDatabaseRealm（默认），你将需要添加一个user以及一个role到CATALINA_BASE/conf/tomcat-users.xml 文件中。你编辑这个文件，添加一个名叫&#8220;admin&#8221;的role 到该文件中，如下：<br />
<br />
&lt;role name="admin"/&gt;<br />
<br />
你同样需要有一个用户，并且这个用户的角色是&#8220;admin&#8221;。象存在的用户那样，添加一个用户（改变密码使其更加安全）：<br />
<br />
&lt;user name="admin" password="deep_dark_secret" roles="admin"/&gt;<br />
<br />
当你完成这些步骤后，请重新启动Tomcat，访问http://localhost:8080/admin，你将看到一个登录界面。Admin Web Application采用基于容器管理的安全机制，并采用了Jakarta Struts框架。一旦你作为&#8220;admin&#8221;角色的用户登录管理界面，你将能够使用这个管理界面配置Tomcat。<br />
<br />
2．配置应用管理（Manager Web Application）<br />
Manager Web Application让你通过一个比Admin Web Application更为简单的用户界面，执行一些简单的Web应用任务。<br />
<br />
Manager Web Application被被定义在一个自动部署文件中：<br />
<br />
CATALINA_BASE/webapps/manager.xml 。<br />
<br />
你必须编辑这个文件，以确保context的docBase参数是绝对路径，也就是说CATALINA_HOME/server/webapps/manager的绝对路径。<br />
（译者注：CATALINA_HOME即tomcat安装目录）<br />
<br />
如果你使用的是UserDatabaseRealm，那么你需要添加一个角色和一个用户到CATALINA_BASE/conf/tomcat-users.xml文件中。接下来，编辑这个文件，添加一个名为&#8220;manager&#8221;的角色到该文件中：<br />
<br />
&lt;role name=&#8221;manager&#8221;&gt;<br />
<br />
你同样需要有一个角色为&#8220;manager&#8221;的用户。像已经存在的用户那样，添加一个新用户（改变密码使其更加安全）：<br />
<br />
&lt;user name="manager" password="deep_dark_secret" roles="manager"/&gt;<br />
<br />
然后重新启动Tomcat，访问http://localhost/manager/list，将看到一个很朴素的文本型管理界面，或者访问http://localhost/manager/html/list，将看到一个HMTL的管理界面。不管是哪种方式都说明你的Manager Web Application现在已经启动了。<br />
<br />
Manager application让你可以在没有系统管理特权的基础上，安装新的Web应用，以用于测试。如果我们有一个新的web应用位于/home/user/hello下在，并且想把它安装到 /hello下，为了测试这个应用，我们可以这么做，在第一个文件框中输入&#8220;/hello&#8221;（作为访问时的path），在第二个文本框中输入&#8220;file:/home/user/hello&#8221;（作为Config URL）。<br />
<br />
Manager application还允许你停止、重新启动、移除以及重新部署一个web应用。停止一个应用使其无法被访问，当有用户尝试访问这个被停止的应用时，将看到一个503的错误——&#8220;503 - This application is not currently available&#8221;。<br />
<br />
移除一个web应用，只是指从Tomcat的运行拷贝中删除了该应用，如果你重新启动Tomcat，被删除的应用将再次出现（也就是说，移除并不是指从硬盘上删除）。<br />
<br />
3．部署一个web应用<br />
有两个办法可以在系统中部署web服务。<br />
1&gt; 拷贝你的WAR文件或者你的web应用文件夹（包括该web的所有内容）到$CATALINA_BASE/webapps目录下。<br />
2&gt; 为你的web服务建立一个只包括context内容的XML片断文件，并把该文件放到$CATALINA_BASE/webapps目录下。这个web应用本身可以存储在硬盘上的任何地方。<br />
<br />
如果你有一个WAR文件，你若想部署它，则只需要把该文件简单的拷贝到CATALINA_BASE/webapps目录下即可，文件必须以&#8220;.war&#8221;作为扩展名。一旦Tomcat监听到这个文件，它将（缺省的）解开该文件包作为一个子目录，并以WAR文件的文件名作为子目录的名字。接下来，Tomcat将在内存中建立一个context，就好象你在server.xml文件里建立一样。当然，其他必需的内容，将从server.xml中的DefaultContext获得。<br />
<br />
部署web应用的另一种方式是写一个Context XML片断文件，然后把该文件拷贝到CATALINA_BASE/webapps目录下。一个Context片断并非一个完整的XML文件，而只是一个context元素，以及对该应用的相应描述。这种片断文件就像是从server.xml中切取出来的context元素一样，所以这种片断被命名为&#8220;context片断&#8221;。<br />
<br />
举个例子，如果我们想部署一个名叫MyWebApp.war的应用，该应用使用realm作为访问控制方式，我们可以使用下面这个片断：<br />
<br />
&lt;!--&nbsp;&nbsp;<br />
Context fragment for deploying MyWebApp.war&nbsp;&nbsp;<br />
--&gt;<br />
&lt;Context path="/demo" docBase="webapps/MyWebApp.war" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;debug="0" privileged="true"&gt;<br />
&lt;Realm className="org.apache.catalina.realm.UserDatabaseRealm"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resourceName="UserDatabase"/&gt; <br />
&lt;/Context&gt;<br />
<br />
把该片断命名为&#8220;MyWebApp.xml&#8221;，然后拷贝到CATALINA_BASE/webapps目录下。<br />
<br />
这种context片断提供了一种便利的方法来部署web应用，你不需要编辑server.xml，除非你想改变缺省的部署特性，安装一个新的web应用时不需要重启动Tomcat。<br />
<br />
<br />
4．配置虚拟主机（Virtual Hosts）<br />
关于server.xml中&#8220;Host&#8221;这个元素，只有在你设置虚拟主机的才需要修改。虚拟主机是一种在一个web服务器上服务多个域名的机制，对每个域名而言，都好象独享了整个主机。实际上，大多数的小型商务网站都是采用虚拟主机实现的，这主要是因为虚拟主机能直接连接到Internet并提供相应的带宽，以保障合理的访问响应速度，另外虚拟主机还能提供一个稳定的固定IP。<br />
<br />
基于名字的虚拟主机可以被建立在任何web服务器上，建立的方法就是通过在域名服务器（DNS）上建立IP地址的别名，并且告诉web服务器把去往不同域名的请求分发到相应的网页目录。因为这篇文章主要是讲Tomcat，我们不准备介绍在各种操作系统上设置DNS的方法，如果你在这方面需要帮助，请参考《DNS and Bind》一书，作者是Paul Albitz and Cricket Liu (O&#39;Reilly)。为了示范方便，我将使用一个静态的主机文件，因为这是测试别名最简单的方法。<br />
在Tomcat中使用虚拟主机，你需要设置DNS或主机数据。为了测试，为本地IP设置一个IP别名就足够了，接下来，你需要在server.xml中添加几行内容，如下：<br />
<br />
&lt;Server port="8005" shutdown="SHUTDOWN" debug="0"&gt;<br />
&lt;Service name="Tomcat-Standalone"&gt;<br />
&nbsp;&nbsp; &lt;Connector className="org.apache.coyote.tomcat4.CoyoteConnector"<br />
port="8080" minProcessors="5" maxProcessors="75"<br />
enableLookups="true" redirectPort="8443"/&gt;<br />
&nbsp;&nbsp; &lt;Connector className="org.apache.coyote.tomcat4.CoyoteConnector"<br />
port="8443" minProcessors="5" maxProcessors="75"<br />
acceptCount="10" debug="0" scheme="https" secure="true"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;Factory className="org.apache.coyote.tomcat4.CoyoteServerSocketFactory"<br />
clientAuth="false" protocol="TLS" /&gt;<br />
&nbsp;&nbsp; &lt;/Connector&gt;<br />
&nbsp;&nbsp; &lt;Engine name="Standalone" defaultHost="localhost" debug="0"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- This Host is the default Host --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;Host name="localhost" debug="0" appBase="webapps"<br />
&nbsp;&nbsp;&nbsp;&nbsp; unpackWARs="true" autoDeploy="true"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Context path="" docBase="ROOT" debug="0"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Context path="/orders" docBase="/home/ian/orders" debug="0"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reloadable="true" crossContext="true"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Context&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Host&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- This Host is the first "Virtual Host": www.example.com --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;Host name="www.example.com" appBase="/home/example/webapp"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Context path="" docBase="."/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Host&gt;<br />
<br />
&nbsp;&nbsp; &lt;/Engine&gt;<br />
&lt;/Service&gt;<br />
&lt;/Server&gt;<br />
<br />
Tomcat的server.xml文件，在初始状态下，只包括一个虚拟主机，但是它容易被扩充到支持多个虚拟主机。在前面的例子中展示的是一个简单的server.xml版本，其中粗体部分就是用于添加一个虚拟主机。每一个Host元素必须包括一个或多个context元素，所包含的context元素中必须有一个是默认的context，这个默认的context的显示路径应该为空（例如，path=&#8221;&#8221;）。<br />
<br />
5．配置基础验证（Basic Authentication）<br />
容器管理验证方法控制着当用户访问受保护的web应用资源时，如何进行用户的身份鉴别。当一个web应用使用了Basic Authentication（BASIC参数在web.xml文件中auto-method元素中设置），而有用户访问受保护的web应用时，Tomcat将通过HTTP Basic Authentication方式，弹出一个对话框，要求用户输入用户名和密码。在这种验证方法中，所有密码将被以64位的编码方式在网络上传输。<br />
<br />
注意：使用Basic Authentication通过被认为是不安全的，因为它没有强健的加密方法，除非在客户端和服务器端都使用HTTPS或者其他密码加密码方式（比如，在一个虚拟私人网络中）。若没有额外的加密方法，网络管理员将能够截获（或滥用）用户的密码。但是，如果你是刚开始使用Tomcat，或者你想在你的web应用中测试一下基于容器的安全管理，Basic Authentication还是非常易于设置和使用的。只需要添加&lt;security-constraint&gt;和&lt;login-config&gt;两个元素到你的web应用的web.xml文件中，并且在CATALINA_BASE/conf/tomcat-users.xml 文件中添加适当的&lt;role&gt;和&lt;user&gt;即可，然后重新启动Tomcat。<br />
<br />
下面例子中的web.xml摘自一个俱乐部会员网站系统，该系统中只有member目录被保护起来，并使用Basic Authentication进行身份验证。请注意，这种方式将有效的代替Apache web服务器中的.htaccess文件。<br />
<br />
&lt;!--<br />
Define the Members-only area, by defining<br />
a "Security Constraint" on this Application, and<br />
mapping it to the subdirectory (URL) that we want<br />
to restrict.<br />
--&gt;<br />
&lt;security-constraint&gt;<br />
&lt;web-resource-collection&gt;<br />
&nbsp;&nbsp; &lt;web-resource-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; Entire Application<br />
&nbsp;&nbsp; &lt;/web-resource-name&gt;<br />
&nbsp;&nbsp; &lt;url-pattern&gt;/members/*&lt;/url-pattern&gt;<br />
&lt;/web-resource-collection&gt;<br />
&lt;auth-constraint&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;role-name&gt;member&lt;/role-name&gt;<br />
&lt;/auth-constraint&gt;<br />
&lt;/security-constraint&gt;<br />
&lt;!-- Define the Login Configuration for this Application --&gt;<br />
&lt;login-config&gt;<br />
&lt;auth-method&gt;BASIC&lt;/auth-method&gt;<br />
&lt;realm-name&gt;My Club Members-only Area&lt;/realm-name&gt;<br />
&lt;/login-config&gt;<br />
<br />
6．配置单点登录（Single Sign-On）<br />
一旦你设置了realm和验证的方法，你就需要进行实际的用户登录处理。一般说来，对用户而言登录系统是一件很麻烦的事情，你必须尽量减少用户登录验证的次数。作为缺省的情况，当用户第一次请求受保护的资源时，每一个web应用都会要求用户登录。如果你运行了多个web应用，并且每个应用都需要进行单独的用户验证，那这看起来就有点像你在与你的用户搏斗。用户们不知道怎样才能把多个分离的应用整合成一个单独的系统，所有他们也就不知道他们需要访问多少个不同的应用，只是很迷惑，为什么总要不停的登录。<br />
<br />
Tomcat 4的&#8220;single sign-on&#8221;特性允许用户在访问同一虚拟主机下所有web应用时，只需登录一次。为了使用这个功能，你只需要在Host上添加一个SingleSignOn Valve元素即可，如下所示：<br />
<br />
&lt;Valve className="org.apache.catalina.authenticator.SingleSignOn"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;debug="0"/&gt;<br />
<br />
在Tomcat初始安装后，server.xml的注释里面包括SingleSignOn Valve配置的例子，你只需要去掉注释，即可使用。那么，任何用户只要登录过一个应用，则对于同一虚拟主机下的所有应用同样有效。<br />
<br />
使用single sign-on valve有一些重要的限制：<br />
1&gt; value必须被配置和嵌套在相同的Host元素里，并且所有需要进行单点验证的web应用（必须通过context元素定义）都位于该Host下。<br />
2&gt; 包括共享用户信息的realm必须被设置在同一级Host中或者嵌套之外。<br />
3&gt; 不能被context中的realm覆盖。<br />
4&gt; 使用单点登录的web应用最好使用一个Tomcat的内置的验证方式（被定义在web.xml中的&lt;auth-method&gt;中），这比自定义的验证方式强，Tomcat内置的的验证方式包括basic、digest、form和client-cert。<br />
5&gt; 如果你使用单点登录，还希望集成一个第三方的web应用到你的网站中来，并且这个新的web应用使用它自己的验证方式，而不使用容器管理安全，那你基本上就没招了。你的用户每次登录原来所有应用时需要登录一次，并且在请求新的第三方应用时还得再登录一次。当然，如果你拥有这个第三方web应用的源码，而你又是一个程序员，你可以修改它，但那恐怕也不容易做。<br />
6&gt; 单点登录需要使用cookies。<br />
<br />
7．配置用户定制目录（Customized User Directores）<br />
一些站点允许个别用户在服务器上发布网页。例如，一所大学的学院可能想给每一位学生一个公共区域，或者是一个ISP希望给一些web空间给他的客户，但这又不是虚拟主机。在这种情况下，一个典型的方法就是在用户名前面加一个特殊字符（~），作为每位用户的网站，比如：<br />
<br />
http://www.cs.myuniversity.edu/~username<br />
http://members.mybigisp.com/~username<br />
<br />
Tomcat提供两种方法在主机上映射这些个人网站，主要使用一对特殊的Listener元素。Listener的className属性应该是org.apache.catalina.startup.UserConfig，userClass属性应该是几个映射类之一。如果你的系统是Unix，它将有一个标准的/etc/passwd文件，该文件中的帐号能够被运行中的Tomcat很容易的读取，该文件指定了用户的主目录，使用PasswdUserDatabase 映射类。<br />
<br />
&lt;Listener className="org.apache.catalina.startup.UserConfig" <br />
directoryName="public_html" <br />
userClass="org.apache.catalina.startup.PasswdUserDatabase"/&gt;<br />
<br />
web文件需要放置在像/home/users/ian/public_html 或者 /users/jbrittain/public_html一样的目录下面。当然你也可以改变public_html 到其他任何子目录下。<br />
<br />
实际上，这个用户目录根本不一定需要位于用户主目录下里面。如果你没有一个密码文件，但你又想把一个用户名映射到公共的像/home一样目录的子目录里面，则可以使用HomesUserDatabase类。<br />
<br />
&lt;Listener className="org.apache.catalina.startup.UserConfig" <br />
directoryName="public_html" homeBase="/home" <br />
userClass="org.apache.catalina.startup.HomesUserDatabase"/&gt;<br />
<br />
这样一来，web文件就可以位于像/home/ian/public_html 或者 /home/jasonb/public_html一样的目录下。这种形式对Windows而言更加有利，你可以使用一个像c:\home这样的目录。<br />
<br />
这些Listener元素，如果出现，则必须在Host元素里面，而不能在context元素里面，因为它们都用应用于Host本身。<br />
<br />
<br />
8．在Tomcat中使用CGI脚本<br />
Tomcat主要是作为Servlet/JSP容器，但它也有许多传统web服务器的性能。支持通用网关接口（Common Gateway Interface，即CGI）就是其中之一，CGI提供一组方法在响应浏览器请求时运行一些扩展程序。CGI之所以被称为通用，是因为它能在大多数程序或脚本中被调用，包括：Perl，Python，awk，Unix shell scripting等，甚至包括Java。当然，你大概不会把一个Java应用程序当作CGI来运行，毕竟这样太过原始。一般而言，开发Servlet总要比CGI具有更好的效率，因为当用户点击一个链接或一个按钮时，你不需要从操作系统层开始进行处理。<br />
<br />
Tomcat包括一个可选的CGI Servlet，允许你运行遗留下来的CGI脚本。<br />
<br />
为了使Tomcat能够运行CGI，你必须做如下几件事：<br />
1. 把servlets-cgi.renametojar （在CATALINA_HOME/server/lib/目录下）改名为servlets-cgi.jar。处理CGI的servlet应该位于Tomcat的CLASSPATH下。<br />
2. 在Tomcat的CATALINA_BASE/conf/web.xml 文件中，把关于&lt;servlet-name&gt; CGI的那段的注释去掉（默认情况下，该段位于第241行）。<br />
3. 同样，在Tomcat的CATALINA_BASE/conf/web.xml文件中，把关于对CGI进行映射的那段的注释去掉（默认情况下，该段位于第299行）。注意，这段内容指定了HTML链接到CGI脚本的访问方式。<br />
4. 你可以把CGI脚本放置在WEB-INF/cgi 目录下（注意，WEB-INF是一个安全的地方，你可以把一些不想被用户看见或基于安全考虑不想暴露的文件放在此处），或者你也可以把CGI脚本放置在context下的其他目录下，并为CGI Servlet调整cgiPathPrefix初始化参数。这就指定的CGI Servlet的实际位置，且不能与上一步指定的URL重名。<br />
5. 重新启动Tomcat，你的CGI就可以运行了。<br />
<br />
在Tomcat中，CGI程序缺省放置在WEB-INF/cgi目录下，正如前面所提示的那样，WEB-INF目录受保护的，通过客户端的浏览器无法窥探到其中内容，所以对于放置含有密码或其他敏感信息的CGI脚本而言，这是一个非常好的地方。为了兼容其他服务器，尽管你也可以把CGI脚本保存在传统的/cgi-bin目录，但要知道，在这些目录中的文件有可能被网上好奇的冲浪者看到。另外，在Unix中，请确定运行Tomcat的用户有执行CGI脚本的权限。<br />
<br />
9．改变Tomcat中的JSP编译器（JSP Compiler）<br />
在Tomcat 4.1（或更高版本，大概），JSP的编译由包含在Tomcat里面的Ant程序控制器直接执行。这听起来有一点点奇怪，但这正是Ant有意为之的一部分，有一个API文档指导开发者在没有启动一个新的JVM的情况下，使用Ant。这是使用Ant进行Java开发的一大优势。另外，这也意味着你现在能够在Ant中使用任何javac支持的编译方式，这里有一个关于Apache Ant使用手册的javac page列表。使用起来是容易的，因为你只需要在&lt;init-param&gt; 元素中定义一个名字叫&#8220;compiler&#8221;，并且在value中有一个支持编译的编译器名字，示例如下：<br />
<br />
&lt;servlet&gt;<br />
&nbsp;&nbsp; &lt;servlet-name&gt;jsp&lt;/servlet-name&gt;<br />
&nbsp;&nbsp; &lt;servlet-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; org.apache.jasper.servlet.JspServlet<br />
&nbsp;&nbsp; &lt;/servlet-class&gt;<br />
&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;logVerbosityLevel&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;WARNING&lt;/param-value&gt;<br />
&nbsp;&nbsp; &lt;/init-param&gt;<br />
&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;compiler&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;jikes&lt;/param-value&gt;<br />
&nbsp;&nbsp; &lt;/init-param&gt;<br />
&nbsp;&nbsp; &lt;load-on-startup&gt;3&lt;/load-on-startup&gt;<br />
&lt;/servlet&gt;<br />
<br />
当然，给出的编译器必须已经安装在你的系统中，并且CLASSPATH可能需要设置，那处决于你选择的是何种编译器。<br />
<br />
10．限制特定主机访问（Restricting Access to Specific Hosts）<br />
有时，你可能想限制对Tomcat web应用的访问，比如，你希望只有你指定的主机或IP地址可以访问你的应用。这样一来，就只有那些指定的的客户端可以访问服务的内容了。为了实现这种效果，Tomcat提供了两个参数供你配置：RemoteHostValve 和RemoteAddrValve。<br />
<br />
通过配置这两个参数，可以让你过滤来自请求的主机或IP地址，并允许或拒绝哪些主机/IP。与之类似的，在Apache的httpd文件里有对每个目录的允许/拒绝指定。<br />
例如你可以把Admin Web application设置成只允许本地访问，设置如下：<br />
<br />
&lt;Context path="/path/to/secret_files" ...&gt;<br />
&lt;Valve className="org.apache.catalina.valves.RemoteAddrValve"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allow="127.0.0.1" deny=""/&gt;<br />
&lt;/Context&gt;<br />
<br />
如果没有给出允许主机的指定，那么与拒绝主机匹配的主机就会被拒绝，除此之外的都是允许的。与之类似，如果没有给出拒绝主机的指定，那么与允许主机匹配的主机就会被允许，除此之外的都是拒绝的。<br />
<br />
<br />
<br />
随着java的流行，其在web上的应用也越来越广，tomcat作为一个开源的servlet容器，应用前景越来越广，本文将向你讲述tomcat的一些知识。<br />
一：简介 <br />
tomcat是jakarta项目中的一个重要的子项目，其被JavaWorld杂志的编辑选为2001年度最具创新的java产品(Most Innovative Java Product)，同时它又是sun公司官方推荐的servlet和jsp容器(具体可以见http://java.sun.com/products/jsp/tomcat/)，因此其越来越多的受到软件公司和开发人员的喜爱。servlet和jsp的最新规范都可以在tomcat的新版本中得到实现。<br />
<br />
二：安装及配置 <br />
tomcat最新版本为4.0.1，这个版本用了一个新的servlet容器Catalina，完整的实现了servlet2.3和jsp1.2规范。注意安装之前你的系统必须安装了jdk1.2以上版本。<br />
<br />
(一)：安装 <br />
1：windows平台<br />
从tomcat网站下载jakarta-tomcat-4.0.1.exe，按照一般的windows程序安装步骤即可安装好tomcat,安装时它会自动寻找你的jdk和jre的位置。<br />
<br />
2：linux平台<br />
下载jakarta-tomcat-4.0.1.tar.gz，将其解压到一个目录。<br />
<br />
(二)：配置 <br />
运行tomcat需要设置JAVA_HOME变量 <br />
set JAVA_HOME=c:/jdk (win98，在msdos方式下使用，或者放入autoexec.bat中)<br />
export JAVA_HOME=/usr/local/jdk (linux下使用，放到/etc/bashrc或者/etc/profile中)<br />
<br />
<br />
<br />
<br />
(三)：运行 <br />
设置完毕后就可以运行tomcat服务器了，进入tomcat的bin目录，win98下用startup启动tomcat，linux下用startup.sh，相应的关闭tomcat的命令为shutdown和shutdown.sh。<br />
<br />
启动后可以在浏览器中输入http://localhost:8080/测试，由于tomcat本身具有web服务器的功能，因此我们不必安装apache，当然其也可以与apache集成到一起，下面会介绍。<br />
<br />
下面你可以测试其自带的jsp和servlet示例。<br />
<br />
三：应用<br />
<br />
(一):目录结构 <br />
tomcat的目录结构如下：<br />
目录名 简介 <br />
bin 存放启动和关闭tomcat脚本 <br />
conf 包含不同的配置文件,server.xml(Tomcat的主要配置文件)和web.xml <br />
work 存放jsp编译后产生的class文件 <br />
webapp 存放应用程序示例，以后你要部署的应用程序也要放到此目录 <br />
logs 存放日志文件 <br />
lib/japser/common 这三个目录主要存放tomcat所需的jar文件 <br />
<br />
<br />
(二)：server.xml配置简介 <br />
下面我们将讲述这个文件中的基本配置信息，更具体的配置信息见tomcat的文档 元素名 属性 解释 <br />
server port 指定一个端口，这个端口负责监听关闭tomcat的请求 <br />
shutdown 指定向端口发送的命令字符串 <br />
service name 指定service的名字 <br />
Connector<br />
(表示客户端和service之间的连接) port 指定服务器端要创建的端口号，并在这个断口监听来自客户端的请求 <br />
minProcessors 服务器启动时创建的处理请求的线程数 <br />
maxProcessors 最大可以创建的处理请求的线程数 <br />
enableLookups 如果为true，则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名，若为false则不进行DNS查询，而是返回其ip地址 <br />
redirectPort 指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号 <br />
acceptCount 指定当所有可以使用的处理请求的线程数都被使用时，可以放到处理队列中的请求数，超过这个数的请求将不予处理 <br />
connectionTimeout 指定超时的时间数(以毫秒为单位) <br />
Engine<br />
(表示指定service中的请求处理机，接收和处理来自Connector的请求) defaultHost 指定缺省的处理请求的主机名，它至少与其中的一个host元素的name属性值是一样的 <br />
Context<br />
(表示一个web应用程序，通常为WAR文件，关于WAR的具体信息见servlet规范) docBase 应用程序的路径或者是WAR文件存放的路径 <br />
path 表示此web应用程序的url的前缀，这样请求的url为http://localhost:8080/path/**** <br />
reloadable 这个属性非常重要，如果为true，则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化，自动装载新的应用程序，我们可以在不重起tomcat的情况下改变应用程序&nbsp;&nbsp;<br />
host<br />
(表示一个虚拟主机) <br />
name 指定主机名 <br />
appBase 应用程序基本目录，即存放应用程序的目录 <br />
unpackWARs 如果为true，则tomcat会自动将WAR文件解压，否则不解压，直接从WAR文件中运行应用程序 <br />
Logger<br />
(表示日志，调试和错误信息)<br />
className 指定logger使用的类名，此类必须实现org.apache.catalina.Logger 接口 <br />
prefix 指定log文件的前缀 <br />
suffix 指定log文件的后缀 <br />
timestamp 如果为true，则log文件名中要加入时间，如下例:localhost_log.2001-10-04.txt <br />
Realm<br />
(表示存放用户名，密码及role的数据库)<br />
className 指定Realm使用的类名，此类必须实现org.apache.catalina.Realm接口 <br />
Valve<br />
(功能与Logger差不多，其prefix和suffix属性解释和Logger 中的一样) <br />
className 指定Valve使用的类名，如用org.apache.catalina.valves.AccessLogValve类可以记录应用程序的访问信息<br />
<br />
directory 指定log文件存放的位置 <br />
pattern 有两个值，common方式记录远程主机名或ip地址，用户名，日期，第一行请求的字符串，HTTP响应代码，发送的字节数。combined方式比common方式记录的值更多 <br />
<br />
<br />
注意：1：经过我测试，我设置Context 的path="",reloadable=true，然后放一个WAR文件到webapps目录，结果tomcat不能检测出此文件(重起tomcat可以)，而把此文件解压，则tomcat会自动检测出这个新的应用程序。如果不能自动检测WAR文件，我们可以利用下面管理中讲的方法来部署应用程序。<br />
<br />
2：默认的server.xml中，Realm元素只设置了一个className属性，但此文件中也包含几个通过JDBC连接到数据库进行验证的示例(被注释掉了)，通过Realm元素我们可以实现容器安全管理(Container Managed Security)。<br />
<br />
3：还有一些元素我们没有介绍，如Parameter，loader，你可以通过tomcat的文档获取这些元素的信息。<br />
<br />
(三)：管理<br />
<br />
1：配置 <br />
在进行具体的管理之前，我们先给tomcat添加一个用户，使这个用户有权限来进行管理。<br />
<br />
打开conf目录下的tomcat-users.xml文件，在相应的位置添加下面一行： <br />
&lt;user name="zf" password="zf" roles="standard,manager"/&gt; <br />
<br />
<br />
<br />
<br />
注意：这一行的最后部分一定是/&gt;,tomcat的文档掉了/符号，如果没有/符号的话，tomcat重起时将无法访问应用程序。通过logs/catalina.out文件你可以看到这个错误的详细信息。 <br />
<br />
然后重起tomcat，在浏览器中输入http://localhost:8080/manager/，会弹出对话框，输入上面的用户名和密码即可。 <br />
<br />
2：应用程序列表 <br />
在浏览器中输入http://localhost:8080/manager/list，浏览器将会显示如下的信息： <br />
OK - Listed applications for virtual host localhost<br />
/ex:running:1<br />
/examples:running:1<br />
/webdav:running:0<br />
/tomcat-docs:running:0<br />
/manager:running:0<br />
/:running:0 <br />
<br />
<br />
<br />
面的信息分别为应用程序的路径，当前状态(running 或者stopped)，与这个程序相连的session数。<br />
<br />
3：重新装载应用程序 <br />
在浏览器中输入 http://localhost:8080/manager/reload?path=/examples，浏览器显示如下： <br />
OK - Reloaded application at context path /examples&nbsp;&nbsp;<br />
<br />
<br />
<br />
<br />
表示example应用程序装载成功，如果我们将server.xml的Context元素的reloadable属性设为true(见上面表格)，则没必要利用这种方式重新装载应用程序，因为tomcat会自动装载。<br />
<br />
4：显示session信息 <br />
在浏览器中输入http://localhost:8080/manager/sessions?path=/examples，浏览器显示如下： OK - Session information for application at context path /examples Default maximum session inactive interval 30 minutes&nbsp;&nbsp;<br />
<br />
<br />
<br />
<br />
5：启动和关闭应用程序 <br />
在浏览器中输入http://localhost:8080/manager/start?path=/examples和http://localhost:8080/manager/stop?path=/examples分别启动和关闭examples应用程序。<br />
<br />
6：部署及撤销部署 <br />
WAR有两种组织方式，一种是按一定的目录结构组织文件，一种是一个后缀为WAR的压缩包，因此它的部署方式也有两种：<br />
(1)：在浏览器中输入：http://localhost:8080/manager/install?path=/examples&amp;war=file:/c:\examples<br />
就会将按目录结构组织的WAR部署<br />
<br />
(2)：如果输入:http://localhost:8080/manager/install?path=/examples&amp;war=jar:file:/c:\examples.war!/<br />
就会将按压缩包组织的WAR部署，注意此url后半部分一定要有!/号。<br />
<br />
部署后就可以用 http://localhost:8080/examples访问了。<br />
<br />
在浏览器中输入：http://localhost:8080/manager/remove?path=/examples<br />
就会撤销刚才部署的应用程序。<br />
<br />
(四)：与apache集成 <br />
虽然tomcat也可以作web服务器,但其处理静态html的速度比不上apache,且其作为web服务器的功能远不如apache,因此我们想把apache和tomcat集成起来。<br />
<br />
我们以linux系统为例介绍.<br />
<br />
从apache网站下载apache1.3.22源代码版本，然后使用如下命令配置安装apache： <br />
mkdir /usr/local/apache<br />
tar zxvf apache.1.32.tar.gz<br />
cd apache.1.32<br />
./configure --prefix=/usr/local/apache --enable-module=so <br />
make<br />
make install<br />
<br />
<br />
<br />
<br />
注意configure命令指定目标安装目录，并且加入DSO(Dynamic Shared Object)支持，注意一定不要忘了这一个选项。<br />
<br />
然后下载webapp模块，将解压后mod_webapp.so文件放入apache的libexec目录，编辑apache的conf目录下的httpd.conf，在这个文件的最后加入下面三行： <br />
LoadModule webapp_module libexec/mod_webapp.so<br />
WebAppConnection warpConnection warp localhost:8008<br />
WebAppDeploy examples warpConnection /examples/ <br />
<br />
<br />
<br />
<br />
第一行是加入webapp模块，如果编译apache时不增加DSO支持，则无法使用LoadModule指令，第二行指定tomcat与apache的连接，第三行指定部署那个应用，这两个指令使用格式如下： <br />
WebAppConnection [connection name] [provider] [host:port]<br />
WebAppDeploy [application name] [connection name] [url path]&nbsp;&nbsp;<br />
<br />
<br />
<br />
<br />
其中connection name指定连接名，provider只能是warp，port端口与你的tomcat的配置文件server.xml最后几行指定的要保持一致。文件如下： <br />
&lt;Service name="Tomcat-Apache"&gt; <br />
&lt;Connector className="org.apache.catalina.connector.warp.WarpConnector"<br />
port="8008" minProcessors="5" maxProcessors="75"<br />
enableLookups="true"<br />
acceptCount="10" debug="0"/&gt;<br />
******<br />
&lt;/Service&gt; <br />
<br />
<br />
<br />
<br />
application name与你在tomcat中部署的应用名一致，url path指定访问这个应用的url。例如上面的例子可以通过http://localhost/examples/来访问tomcat中的examples应用。<br />
<br />
(五)：中文问题 <br />
一般jsp的乱码问题可以通过在jsp中加入&lt;%@ page contentType="text/html;charset=GB2312" %&gt;来解决，至于servlet的乱码在可以使用servlet2.3中提供的HttpServeletRequest.setCharacterEncoding函数。更详细的中文问题请见JSP/Servlet 中的汉字编码问题。 <br />
<br />
四：综述 <br />
tomcat作为一个servlet(jsp也被编译为servlet执行)容器，其应用前景是非常好的，如果与jboss结合起来，则可以实现sun的j2ee规范(用jboss作ejb服务器)。jboss的官方网站也提供集成了tomcat3.2*的jboss以供下载。另外一个开源的应用服务器(enhydra) 也是基于tomcat的，其提供了更友好的管理界面，部署应用程序也更简单，功能也更强大。 <br />
<img src ="http://www.blogjava.net/CrazyJava/aggbug/183075.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2008-03-01 09:13 <a href="http://www.blogjava.net/CrazyJava/articles/183075.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Tomcat中使用Yale CAS实现单点登陆(SSO) 文章合集</title><link>http://www.blogjava.net/CrazyJava/articles/180047.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Fri, 15 Feb 2008 04:46:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/180047.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/180047.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/180047.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/180047.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/180047.html</trackback:ping><description><![CDATA[<p style="text-indent: 21pt"><span twffan="done"><span style="font-family: 宋体" twffan="done">耶鲁大学开发的单点登录系统称为<span twffan="done">CAS（Central Authentication Server）被设计成一个独立的Web应用程序(cas.war)。它目前用几个Java Servlet作为实现并且通过一个Https服务器来运行。要使用单点登陆功能的Web应用作为CAS的一个客户端来运行。</span></span> </span></p>
<p style="text-indent: 21pt"><span twffan="done"><span style="font-family: 宋体" twffan="done">由于<span twffan="done">CAS使用Https协议，所以首先要知道如何在容器中配置SSL。Tomcat的SSL配置相对其它的容器较为简单，SSL配置完成后CAS服务器一般都能正常运行了。</span></span> </span></p>
<p style="text-indent: 21pt"><span twffan="done"><span style="font-family: 宋体" twffan="done">CAS的客户端以一个Web应用的Filter运行。当Web应用的某个功能被请求时，Filter就会拦截应用的URL，从而迫使用户到CAS服务器进行登陆。在所有不同的Web应用中，使用同一个CAS服务器进行登陆，即可达到单点登陆之目的。</span> </span></p>
<p style="text-indent: 21pt"><span twffan="done"><span style="font-family: 宋体" twffan="done">本文使用同一个<span twffan="done">Tomcat（版本Tomcat5.0.30）配置CAS服务器及客户端，分别在8443端口及8080端口。下面是在Tomcat中使用Yale CAS实现单点登陆的详细步骤：</span></span> </span></p>
<p style="margin-bottom: 0pt; margin-left: 21.25pt; text-indent: -21.25pt; margin-right: 0cm">&lt;!--[if !supportLists]--&gt;<span twffan="done"><strong><span style="font-size: 14pt; font-family: 黑体" twffan="done">1.&nbsp;</span></strong></span>&lt;!--[endif]--&gt;<span twffan="done"><strong><span style="font-size: 14pt; font-family: 黑体" twffan="done">安装<span twffan="done">CAS服务器</span></span></strong></span></p>
<p style="margin-bottom: 0pt; margin-left: 1cm; text-indent: -1cm; margin-right: 0cm">&lt;!--[if !supportLists]--&gt;<span twffan="done"><span style="font-family: 宋体" twffan="done">1.1.&nbsp;</span></span>&lt;!--[endif]--&gt;<span twffan="done"><span style="font-family: 宋体" twffan="done">下载<span twffan="done">CAS发行包，下载地址：</span></span></span></p>
<p><span twffan="done">CAS</span> <span style="font-family: 宋体" twffan="done">服务器：</span> <span twffan="done"><a href="http://www.yale.edu/tp/cas/cas-server-2.0.12.zip">http://www.yale.edu/tp/cas/cas-server-2.0.12.zip</a> </span><span style="font-family: 宋体" twffan="done">或</span> <span twffan="done"><br clear="all" />
<a href="https://clearinghouse.ja-sig.org/wiki/download/attachments/924/cas-server-2.0.12.zip">https://clearinghouse.ja-sig.org/wiki/download/attachments/924/cas-server-2.0.12.zip</a> <br />
CAS</span> <span style="font-family: 宋体" twffan="done">客户端：</span> <span twffan="done"><a href="http://www.yale.edu/tp/cas/cas-client-2.0.11.zip">http://www.yale.edu/tp/cas/cas-client-2.0.11.zip</a> </span><span style="font-family: 宋体" twffan="done">或</span> <span twffan="done"><br clear="all" />
<a href="https://clearinghouse.ja-sig.org/wiki/download/attachments/827/cas-client-2.0.11.zip">https://clearinghouse.ja-sig.org/wiki/download/attachments/827/cas-client-2.0.11.zip</a> </span></p>
<p style="margin-bottom: 0pt; margin-left: 1cm; text-indent: -1cm; margin-right: 0cm">&lt;!--[if !supportLists]--&gt;<span style="font-family: 宋体" twffan="done">1.2.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp; </span></span>&lt;!--[endif]--&gt;<span style="font-family: 宋体" twffan="done">将</span><span twffan="done">cas-server-2.0.12.zip</span><span style="font-family: 宋体" twffan="done">解压，并将</span><span twffan="done">lib/cas.war</span><span style="font-family: 宋体" twffan="done">拷贝到</span><span twffan="done">Tomcat</span><span style="font-family: 宋体" twffan="done">的</span><span twffan="done">webapps</span><span style="font-family: 宋体" twffan="done">下，测试</span><span twffan="done">CAS</span><span style="font-family: 宋体" twffan="done">服务器是否发布正常，可以访问</span><span twffan="done"><a href="http://localhost:8080/cas/login">http://localhost:8080/cas/login</a></span><span style="font-family: 宋体" twffan="done">出现登陆窗口。输入用户名密码（用户名＝密码），出现登陆成功页面说明发布正常。</span></p>
<p style="margin-bottom: 0pt; margin-left: 21.25pt; text-indent: -21.25pt; margin-right: 0cm">&lt;!--[if !supportLists]--&gt;<strong><span style="font-size: 14pt; font-family: 黑体" twffan="done">2.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal" twffan="done">&nbsp;&nbsp; </span></span></strong>&lt;!--[endif]--&gt;<strong><span style="font-size: 14pt; font-family: 黑体" twffan="done">配置<span twffan="done">Tomcat使用https协议</span></span></strong></p>
<p style="margin-bottom: 0pt; margin-left: 1cm; text-indent: -1cm; margin-right: 0cm">&lt;!--[if !supportLists]--&gt;<span style="font-family: 宋体" twffan="done">2.1.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp; </span></span>&lt;!--[endif]--&gt;<span style="font-family: 宋体" twffan="done">使用</span><span twffan="done">Java</span><span style="font-family: 宋体" twffan="done">自带的</span><span twffan="done">keytool</span><span style="font-family: 宋体" twffan="done">命令，产生</span><span twffan="done">SERVER</span><span style="font-family: 宋体" twffan="done">的证书</span></p>
<p><span twffan="done">D<strong>:</strong>"&gt; <em>keytool -genkey -alias my-alias-name -keyalg RSA -keystore keystore-file</em></span> </p>
<p style="text-indent: 21pt"><span style="font-family: 宋体" twffan="done">其中</span> <span twffan="done">my-alias-name</span> <span style="font-family: 宋体" twffan="done">为别名，这行命令的作用是产生一个新的公共</span> <span twffan="done">/</span> <span style="font-family: 宋体" twffan="done">私有钥匙对。</span> <em><span twffan="done">keystore-file</span> </em><span style="font-family: 宋体" twffan="done">为存储钥匙和证书的文件。</span> </p>
<p style="text-indent: 21pt"><span style="font-family: 宋体" twffan="done">命令运行后，根据提示回答。<strong>注意在开始问&#8220;你的名字&#8221;或&#8220;<span twffan="done">DName&#8221;的时候，必须填写你服务器所在域名（在局域网中测试时，使用主机名或hosts文件中注册的域名,本机可以使用localhost）。</span></strong></span> </p>
<p style="margin-bottom: 0pt; margin-left: 1cm; text-indent: -1cm; margin-right: 0cm">&lt;!--[if !supportLists]--&gt;<span style="font-family: 宋体" twffan="done">2.2.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp; </span></span>&lt;!--[endif]--&gt;<span style="font-family: 宋体" twffan="done">在</span><span twffan="done">Tomcat</span><span style="font-family: 宋体" twffan="done">的</span><span twffan="done">8443</span><span style="font-family: 宋体" twffan="done">端口配置</span><span twffan="done">SSL</span></p>
<p><span style="font-family: 宋体" twffan="done">在</span> <span twffan="done">Tomcat_Path"conf"server.xml</span> <span style="font-family: 宋体" twffan="done">文件中配置</span> <span twffan="done">SSL</span> <span style="font-family: 宋体" twffan="done">的地方，增加如下配置：</span> </p>
<p><span style="font-family: 宋体" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span>&lt;Connector className="org.apache.coyote.tomcat5.CoyoteConnector"</span> </p>
<p><span style="font-family: 宋体" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span>port="8443" minProcessors="5" maxProcessors="75"</span> </p>
<p><span style="font-family: 宋体" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span>enableLookups="true" disableUploadTimeout="true"</span> </p>
<p><span style="font-family: 宋体" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span>acceptCount="100" debug="0" scheme="https"</span> </p>
<p><span style="font-family: 宋体" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span>secure="true"&gt;</span> </p>
<p><span style="font-family: 宋体" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span>&lt;Factory className="org.apache.coyote.tomcat5.CoyoteServerSocketFactory"</span> </p>
<p><span style="font-family: 宋体" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span>keystoreFile="D:/keystore-file"</span> </p>
<p><span style="font-family: 宋体" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span>keystorePass="password" clientAuth="false" protocol="TLS" /&gt;</span> </p>
<p><span style="font-family: 宋体" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span>&lt;/Connector&gt;</span> </p>
<p><span style="font-family: 宋体" twffan="done">其中，<span twffan="done">keystoreFile使用绝对路径，keystorePass为第3点输入的keystore密码。配置完成后，启动Tomcat,访问<a href="https://localhost:8443/">https://localhost:8443</a> ，访问成功说明SSL配置成功。也可以访问<a href="https://localhost:8443/cas/login">https://localhost:8443/cas/login</a> 。</span></span> </p>
<p style="margin-bottom: 0pt; margin-left: 21.25pt; text-indent: -21.25pt; margin-right: 0cm">&lt;!--[if !supportLists]--&gt;<strong><span style="font-family: 宋体" twffan="done">3.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong>&lt;!--[endif]--&gt;<strong><span style="font-size: 14pt; font-family: 黑体" twffan="done">配置<span twffan="done"> CAS客户端</span></span></strong></p>
<p><span style="font-family: 宋体" twffan="done">以<span twffan="done">Tomcat中自带的Servlet examples应用为例，在Web应用中使用配置CAS客户端。</span></span> </p>
<p style="margin-bottom: 0pt; margin-left: 1cm; text-indent: -1cm; margin-right: 0cm">&lt;!--[if !supportLists]--&gt;<span twffan="done">3.1.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>&lt;!--[endif]--&gt;<span style="font-family: 宋体" twffan="done">在<span twffan="done">Servlet examples应用里配置CAS客户端，需修改</span></span><span twffan="done">servlets-examples/WEB-INF/web.xml</span><span style="font-family: 宋体" twffan="done">，在</span><span twffan="done">web.xml</span><span style="font-family: 宋体" twffan="done">文件中</span><span twffan="done">,</span><span style="font-family: 宋体" twffan="done">加入如下</span><span twffan="done">Filter</span><span style="font-family: 宋体" twffan="done">配置：</span></p>
<p><span style="font-family: 宋体" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span>&lt;filter&gt;</span> </p>
<p><span style="font-family: 宋体" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span><span twffan="done">&nbsp;&nbsp;&nbsp; </span>&lt;filter-name&gt;CASFilter&lt;/filter-name&gt;</span> </p>
<p><span style="font-family: 宋体" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span>&lt;filter-class&gt;edu.yale.its.tp.cas.client.filter.CASFilter&lt;/filter-class&gt;</span> </p>
<p><span style="font-family: 宋体" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span><span twffan="done">&nbsp;&nbsp;&nbsp; </span>&lt;init-param&gt;</span> </p>
<p><span style="font-family: 宋体" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span><span twffan="done">&nbsp;&nbsp;&nbsp; </span>&lt;param-name&gt;edu.yale.its.tp.cas.client.filter.loginUrl&lt;/param-name&gt;</span> </p>
<p><span style="font-family: 宋体" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span><span twffan="done">&nbsp;&nbsp;&nbsp; </span>&lt;param-value&gt;https://localhost:8443/cas/login&lt;/param-value&gt;</span> </p>
<p><span style="font-family: 宋体" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span><span twffan="done">&nbsp;&nbsp;&nbsp; </span>&lt;/init-param&gt;</span> </p>
<p><span style="font-family: 宋体" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span><span twffan="done">&nbsp;&nbsp;&nbsp; </span>&lt;init-param&gt;</span> </p>
<p><span style="font-family: 宋体" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span><span twffan="done">&nbsp;&nbsp;&nbsp; </span>&lt;param-name&gt;edu.yale.its.tp.cas.client.filter.validateUrl&lt;/param-name&gt;</span> </p>
<p><span style="font-family: 宋体" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span><span twffan="done">&nbsp;&nbsp;&nbsp; </span>&lt;param-value&gt;https://localhost:8443/cas/proxyValidate&lt;/param-value&gt;</span> </p>
<p><span style="font-family: 宋体" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span><span twffan="done">&nbsp;&nbsp;&nbsp; </span>&lt;/init-param&gt;</span> </p>
<p><span style="font-family: 宋体" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span><span twffan="done">&nbsp;&nbsp;&nbsp; </span>&lt;init-param&gt;<span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">&nbsp;&nbsp;&nbsp; </span>&lt;param-name&gt;edu.yale.its.tp.cas.client.filter.serverName&lt;/param-name&gt;</span> </p>
<p><span style="font-family: 宋体" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">&nbsp;&nbsp;&nbsp; </span>&lt;param-value&gt;localhost:8080&lt;/param-value&gt;</span> </p>
<p><span style="font-family: 宋体" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span><span twffan="done">&nbsp;&nbsp;&nbsp; </span>&lt;/init-param&gt;</span> </p>
<p><span style="font-family: 宋体" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span>&lt;/filter&gt;</span> </p>
<p><span style="font-family: 宋体" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span>&lt;filter-mapping&gt;</span> </p>
<p><span style="font-family: 宋体" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span><span twffan="done">&nbsp;&nbsp;&nbsp; </span>&lt;filter-name&gt;CASFilter&lt;/filter-name&gt;</span> </p>
<p><span style="font-family: 宋体" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span><span twffan="done">&nbsp;&nbsp;&nbsp; </span>&lt;url-pattern&gt;/servlet/*&lt;/url-pattern&gt;</span> </p>
<p><span style="font-family: 宋体" twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span>&lt;/filter-mapping&gt;</span> </p>
<p><span style="font-family: 宋体" twffan="done">其中，第一，二个<span twffan="done">localhost都改成CAS服务器域名或主机名，第三个改成你servelt example应用域名或主机名，由于本文中CAS服务器与客户端在同一主机同一Tomcat上，所以都为localhost。若不在同一主机，则分别使用两主机的域名或主机名。</span></span> </p>
<p style="margin-left: 1cm; text-indent: -1cm">&lt;!--[if !supportLists]--&gt;<span style="font-size: 10.5pt" twffan="done">3.2.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp; </span></span>&lt;!--[endif]--&gt;<span style="font-size: 10.5pt" twffan="done">将<span twffan="done">cas-client-2.0.11.zip解压，把java/lib/casclient.jar拷贝到Tomcat的<br />
webapps/servlets-examples/WEB-INF/lib目录下（如果没有就建一个）<br />
&lt;!--[if !supportLineBreakNewLine]--&gt;<br />
&lt;!--[endif]--&gt;</span></span></p>
<p style="margin-left: 1cm; text-indent: -1cm">&lt;!--[if !supportLists]--&gt;<span style="font-size: 10.5pt" twffan="done">3.3.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp; </span></span>&lt;!--[endif]--&gt;<span style="font-size: 10.5pt" twffan="done">导出<span twffan="done">SERVER的证书，用来给所有需要用到的客户端导入</span></span></p>
<p><span style="font-size: 10.5pt" twffan="done">D:"&gt; <em>keytool -export -file myserver.cert -alias my-alias-name -keystore keystore-file</em></span> </p>
<p style="margin-left: 1cm; text-indent: -1cm">&lt;!--[if !supportLists]--&gt;<span style="font-size: 10.5pt" twffan="done">3.4.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp; </span></span>&lt;!--[endif]--&gt;<span style="font-size: 10.5pt" twffan="done">在客户端的<span twffan="done">JVM里导入信任的SERVER的证书，输入keystore密码时，注意现在的keystore为cacerts，而cacerts的初密码为changeit，而不是前面keystore-file的密码，所以要是没有改过cacerts密码应该输入changeit.</span></span></p>
<p><span style="font-size: 10.5pt" twffan="done">D:"&gt;<em> keytool -import -keystore $JAVA_HOME/jre/lib/security/cacerts -file myserver.cert -alias my-alias-name</em></span> </p>
<p><span style="font-size: 10.5pt" twffan="done">其中，<span twffan="done">$JAVA_HOME改成JDK的绝对路径。</span></span> </p>
<p style="margin-bottom: 0pt; margin-left: 21.25pt; text-indent: -21.25pt; margin-right: 0cm">&lt;!--[if !supportLists]--&gt;<span twffan="done">4.<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>&lt;!--[endif]--&gt;<strong><span style="font-size: 14pt; font-family: 黑体" twffan="done">测试<span twffan="done">SSO</span></span></strong></p>
<p style="text-indent: 21pt"><span style="font-size: 10.5pt" twffan="done">启动<span twffan="done">Tomcat，访问</span></span> <span twffan="done"><a href="http://localhost:8080/servlets-examples/">http://localhost:8080/servlets-examples/</a> </span><span style="font-size: 10.5pt" twffan="done">，随便执行一个servlet，系统会自动跳转到一个验证页面，随便输入一个相同的账号,密码，认证通过之后，就会访问到你点击的servlet了。</span> </p>
<span style="font-size: 10.5pt" twffan="done">
<p>CAS (Central Authentication Service)是Yale大学的ITS开发的一套JAVA实现的开源<br />
的SSO(single sign-on)的服务。</p>
<p>这里用一个简单的例子来说明用CAS来实现单点登陆(SSO)。</p>
<p>Yale CAS Server 的配置过程</p>
<p>CAS (Central Authentication Service)是Yale大学的ITS开发的一套JAVA实现的开源<br />
的SSO(single sign-on)的服务。该服务是以一个java web app(eg:cas.war)来进行服务的，<br />
使用时需要将cas.war发布到一个servlet2.3兼容的服务器上，并且服务器需要支持SSL，<br />
在需要使用该服务的其他服务器（客户），只要进行简单的配置就可以实现SSO了。</p>
<p>CAS 的客户端可以有很多种，因为验证的结果是以XML的格式返回的，CAS的客户端已<br />
打包进去的有java,perl,python,asp,apache module等好几种客户端示例，你还可以根据<br />
需要实现一个自己的客户端，非常简单!~</p>
<p>下面我们以tomcat 5.0 作为CAS Server(server1)，另外一台tomcat5.0 为client(client1)<br />
为例进行说明。</p>
<p>1.下载cas-server和cas-client(可选，建议使用）<br />
http://www.yale.edu/tp/cas/cas-server-2.0.12.zip<br />
http://www.yale.edu/tp/cas/cas-client-2.0.11.zip</p>
<p>2.将cas-server-2.0.12.zip解压，并将lib/cas.war拷贝到server1的webapps下 </p>
<p>3.产生SERVER的证书<br />
keytool -genkey -alias my-alias-name -keyalg RSA -keystore keystore-file</p>
<p>4.在server1配置tomcat使用HTTPS</p>
<p>$CATALINA_HOME/conf/server.xml里<br />
<br />
&lt;Connector className="org.apache.coyote.tomcat5.CoyoteConnector"<br />
port="8443" minProcessors="5" maxProcessors="75"<br />
enableLookups="true" disableUploadTimeout="true"<br />
acceptCount="100" debug="0" scheme="https"<br />
secure="true"&gt;<br />
&lt;Factory className="org.apache.coyote.tomcat5.CoyoteServerSocketFactory"<br />
keystoreFile="/path/to/your/keystore-file"<br />
keystorePass="your-password" clientAuth="false" protocol="TLS" /&gt;<br />
&lt;/Connector&gt;</p>
<p>5.在要使用CAS的客户端client1里设置（以servlets-examples这个APP为例），我们使用<br />
ServletFilter(CAS client里提供的)来实现SSO的检查。<br />
<br />
修改servlets-examples/WEB-INF/web.xml<br />
<br />
&lt;filter&gt;<br />
&lt;filter-name&gt;CASFilter&lt;/filter-name&gt;<br />
&lt;filter-class&gt;edu.yale.its.tp.cas.client.filter.CASFilter&lt;/filter-class&gt;<br />
&lt;init-param&gt;<br />
&lt;param-name&gt;edu.yale.its.tp.cas.client.filter.loginUrl&lt;/param-name&gt;<br />
&lt;param-value&gt;https://your.cas.server.name(eg:server1):port/cas/login&lt;/param-value&gt;<br />
&lt;/init-param&gt;<br />
&lt;init-param&gt;<br />
&lt;param-name&gt;edu.yale.its.tp.cas.client.filter.validateUrl&lt;/param-name&gt;<br />
&lt;param-value&gt;https://your.cas.server.name(eg:server1):port/cas/proxyValidate&lt;/param-value&gt;<br />
&lt;/init-param&gt;<br />
<br />
&lt;init-param&gt;<br />
&lt;param-name&gt;edu.yale.its.tp.cas.client.filter.serverName&lt;/param-name&gt;<br />
&lt;param-value&gt;your.client.server.name(eg:client1):port&lt;/param-value&gt;<br />
&lt;/init-param&gt;<br />
<br />
&lt;/filter&gt;<br />
<br />
&lt;filter-mapping&gt;<br />
&lt;filter-name&gt;CASFilter&lt;/filter-name&gt;<br />
&lt;url-pattern&gt;/servlet/*&lt;/url-pattern&gt;<br />
&lt;/filter-mapping&gt;</p>
<p>6.将cas-client-2.0.11.zip解压，把java/lib/casclient.jar拷贝到client1服务器上的<br />
webapps/servlets-examples/WEB-INF/lib目录下（如果没有就建一个）<br />
<br />
7.导出SERVER的证书，用来给所有需要用到的客户端导入<br />
keytool -export -file myserver.cert -alias my-alias-name -keystore keystore-file</p>
<p>8.在客户端的JVM里导入信任的SERVER的证书(根据情况有可能需要管理员权限)<br />
keytool -import -keystore $JAVA_HOME/jre/lib/security/cacerts -file myserver.cert -alias my-alias-name</p>
<p>9.test &amp; done.<br />
把server1和client1分别起来，检查启动的LOG是否正常，如果一切OK，就访问<br />
http://client1:8080/servlets-examples/servlet/HelloWorldExample<br />
系统会自动跳转到一个验证页面，随便输入一个相同的账号,密码，严正通过之后就会访问<br />
到真正的HelloWorldExample这个servlet了<br />
<br />
</p>
<div twffan="done"><a id="viewpost1_TitleUrl" href="http://www.blogjava.net/zhangwh6882/archive/2006/04/04/CASClientTomcat5516.html">CAS java client2.1.1 在Tomcat5.5.16下bug的解决</a> </div>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 最近在项目中集成了CAS 结合Acegi来作单点登陆。感觉CAS虽然简单，用起来还是很爽的。不过前几天发布一个子系统的时候出现了下面的问题。</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee" twffan="done"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" twffan="done"  alt="" /> <span style="color: #000000" twffan="done">edu.yale.its.tp.cas.client.CASAuthenticationException:&nbsp;Unable&nbsp;to&nbsp;validate&nbsp;ProxyTicketValidator<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" twffan="done"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #000000" twffan="done">&lt;</span> <span style="color: #000000" twffan="done">cas:authenticationFailure&nbsp;code</span> <span style="color: #000000" twffan="done">=</span> <span style="color: #000000" twffan="done">'</span> <span style="color: #000000" twffan="done">INVALID_SERVICE</span> <span style="color: #000000" twffan="done">'</span> <span style="color: #000000" twffan="done">&gt;</span> <span style="color: #000000" twffan="done"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" twffan="done"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ticket&nbsp;</span> <span style="color: #000000" twffan="done">'</span> <span style="color: #000000" twffan="done">ST-74-yBBJRjb3qnFle0Ynhq7sgUsdaox9nPoFbGu-20</span> <span style="color: #000000" twffan="done">'</span> <span style="color: #000000" twffan="done">&nbsp;does&nbsp;not&nbsp;match&nbsp;supplied&nbsp;service<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" twffan="done"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #000000" twffan="done">&lt;/</span> <span style="color: #000000" twffan="done">cas:authenticationFailure</span> <span style="color: #000000" twffan="done">&gt;</span> </div>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp; 经排查，发现是CAS java client2.1.1 与Tomcat 5.5.16配合有问题。查看log，发现Cas Server端解析出的service URL前后相差了一个&#8220;?&#8221;，怀疑是cas client在新版tomcat下生成 service URL时出现问题，检查client代码，定位到edu.yale.its.tp.cas.client.Util的getService方法，跟踪了一下，发现<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee" twffan="done"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" twffan="done"  alt="" /> <span style="color: #0000ff" twffan="done">if</span> <span style="color: #000000" twffan="done">&nbsp;(<font color="#ff1493">request.getQueryString()</font>&nbsp;</span> <font color="#ff1493"><span style="color: #000000" twffan="done">!=</span> &nbsp; <span style="color: #0000ff" twffan="done">null</span> </font><span style="color: #000000" twffan="done">)&nbsp;<br />
<img id="Codehighlighter1_41_834_Open_Image" onclick="this.style.display='none'; Codehighlighter1_41_834_Open_Text.style.display='none'; Codehighlighter1_41_834_Closed_Image.style.display='inline'; Codehighlighter1_41_834_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" twffan="done"  alt="" /><img id="Codehighlighter1_41_834_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_41_834_Closed_Text.style.display='none'; Codehighlighter1_41_834_Open_Image.style.display='inline'; Codehighlighter1_41_834_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top" twffan="done"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span id="Codehighlighter1_41_834_Open_Text" twffan="done"><span style="color: #000000" twffan="done">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" twffan="done"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #008000" twffan="done">//</span> <span style="color: #008000" twffan="done">&nbsp;first,&nbsp;see&nbsp;whether&nbsp;we've&nbsp;got&nbsp;a&nbsp;'ticket'&nbsp;at&nbsp;all</span> <span style="color: #008000" twffan="done"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" twffan="done"  alt="" /> </span><span style="color: #000000" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff" twffan="done">int</span> <span style="color: #000000" twffan="done">&nbsp;ticketLoc&nbsp;</span> <span style="color: #000000" twffan="done">=</span> <span style="color: #000000" twffan="done">&nbsp;request.getQueryString().indexOf(</span> <span style="color: #000000" twffan="done">"</span> <span style="color: #000000" twffan="done">ticket=</span> <span style="color: #000000" twffan="done">"</span> <span style="color: #000000" twffan="done">);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" twffan="done"  alt="" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" twffan="done"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #008000" twffan="done">//</span> <span style="color: #008000" twffan="done">&nbsp;if&nbsp;ticketLoc&nbsp;==&nbsp;0,&nbsp;then&nbsp;it's&nbsp;the&nbsp;only&nbsp;parameter&nbsp;and&nbsp;we&nbsp;ignore<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" twffan="done"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #008000" twffan="done">//</span> <span style="color: #008000" twffan="done">&nbsp;the&nbsp;whole&nbsp;query&nbsp;string<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" twffan="done"  alt="" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" twffan="done"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #008000" twffan="done">//</span> <span style="color: #008000" twffan="done">&nbsp;if&nbsp;no&nbsp;ticket&nbsp;is&nbsp;present,&nbsp;we&nbsp;use&nbsp;the&nbsp;query&nbsp;string&nbsp;wholesale</span> <span style="color: #008000" twffan="done"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" twffan="done"  alt="" /> </span><span style="color: #000000" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff" twffan="done">if</span> <span style="color: #000000" twffan="done">&nbsp;(ticketLoc&nbsp;</span> <span style="color: #000000" twffan="done">==</span> &nbsp; <span style="color: #000000" twffan="done">-</span> <span style="color: #000000" twffan="done">1</span> <span style="color: #000000" twffan="done">)<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" twffan="done"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(</span> <span style="color: #000000" twffan="done">"</span> <span style="color: #000000" twffan="done">?</span> <span style="color: #000000" twffan="done">"</span> &nbsp; <span style="color: #000000" twffan="done">+</span> <span style="color: #000000" twffan="done">&nbsp;request.getQueryString());<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" twffan="done"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff" twffan="done">else</span> &nbsp; <span style="color: #0000ff" twffan="done">if</span> <span style="color: #000000" twffan="done">&nbsp;(ticketLoc&nbsp;</span> <span style="color: #000000" twffan="done">&gt;</span> &nbsp; <span style="color: #000000" twffan="done">0</span> <span style="color: #000000" twffan="done">)&nbsp;<br />
<img id="Codehighlighter1_423_830_Open_Image" onclick="this.style.display='none'; Codehighlighter1_423_830_Open_Text.style.display='none'; Codehighlighter1_423_830_Closed_Image.style.display='inline'; Codehighlighter1_423_830_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" twffan="done"  alt="" /><img id="Codehighlighter1_423_830_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_423_830_Closed_Text.style.display='none'; Codehighlighter1_423_830_Open_Image.style.display='inline'; Codehighlighter1_423_830_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" twffan="done"  alt="" /></span> <span id="Codehighlighter1_423_830_Open_Text" twffan="done"><span style="color: #000000" twffan="done">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" twffan="done"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ticketLoc&nbsp;</span> <span style="color: #000000" twffan="done">=</span> <span style="color: #000000" twffan="done">&nbsp;request.getQueryString().indexOf(</span> <span style="color: #000000" twffan="done">"</span> <span style="color: #000000" twffan="done">&amp;ticket=</span> <span style="color: #000000" twffan="done">"</span> <span style="color: #000000" twffan="done">);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" twffan="done"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #0000ff" twffan="done">if</span> <span style="color: #000000" twffan="done">&nbsp;(ticketLoc&nbsp;</span> <span style="color: #000000" twffan="done">==</span> &nbsp; <span style="color: #000000" twffan="done">-</span> <span style="color: #000000" twffan="done">1</span> <span style="color: #000000" twffan="done">)&nbsp;<br />
<img id="Codehighlighter1_517_649_Open_Image" onclick="this.style.display='none'; Codehighlighter1_517_649_Open_Text.style.display='none'; Codehighlighter1_517_649_Closed_Image.style.display='inline'; Codehighlighter1_517_649_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" twffan="done"  alt="" /><img id="Codehighlighter1_517_649_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_517_649_Closed_Text.style.display='none'; Codehighlighter1_517_649_Open_Image.style.display='inline'; Codehighlighter1_517_649_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" twffan="done"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span id="Codehighlighter1_517_649_Open_Text" twffan="done"><span style="color: #000000" twffan="done">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" twffan="done"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #008000" twffan="done">//</span> <span style="color: #008000" twffan="done">&nbsp;there&nbsp;was&nbsp;a&nbsp;'ticket='&nbsp;unrelated&nbsp;to&nbsp;a&nbsp;parameter&nbsp;named<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" twffan="done"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #008000" twffan="done">//</span> <span style="color: #008000" twffan="done">&nbsp;'ticket'</span> <span style="color: #008000" twffan="done"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" twffan="done"  alt="" /> </span><span style="color: #000000" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(</span> <span style="color: #000000" twffan="done">"</span> <span style="color: #000000" twffan="done">?</span> <span style="color: #000000" twffan="done">"</span> &nbsp; <span style="color: #000000" twffan="done">+</span> <span style="color: #000000" twffan="done">&nbsp;request.getQueryString());<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" twffan="done"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span>&nbsp; <span style="color: #0000ff" twffan="done">else</span> &nbsp; <span style="color: #0000ff" twffan="done">if</span> <span style="color: #000000" twffan="done">&nbsp;(ticketLoc&nbsp;</span> <span style="color: #000000" twffan="done">&gt;</span> &nbsp; <span style="color: #000000" twffan="done">0</span> <span style="color: #000000" twffan="done">)&nbsp;<br />
<img id="Codehighlighter1_680_825_Open_Image" onclick="this.style.display='none'; Codehighlighter1_680_825_Open_Text.style.display='none'; Codehighlighter1_680_825_Closed_Image.style.display='inline'; Codehighlighter1_680_825_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" twffan="done"  alt="" /><img id="Codehighlighter1_680_825_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_680_825_Closed_Text.style.display='none'; Codehighlighter1_680_825_Open_Image.style.display='inline'; Codehighlighter1_680_825_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" twffan="done"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span id="Codehighlighter1_680_825_Open_Text" twffan="done"><span style="color: #000000" twffan="done">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" twffan="done"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #008000" twffan="done">//</span> <span style="color: #008000" twffan="done">&nbsp;otherwise,&nbsp;we&nbsp;use&nbsp;the&nbsp;query&nbsp;string&nbsp;up&nbsp;to&nbsp;"&amp;ticket="</span> <span style="color: #008000" twffan="done"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" twffan="done"  alt="" /> </span><span style="color: #000000" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(</span> <span style="color: #000000" twffan="done">"</span> <span style="color: #000000" twffan="done">?</span> <span style="color: #000000" twffan="done">"</span> <span style="color: #000000" twffan="done"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" twffan="done"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #000000" twffan="done">+</span> <span style="color: #000000" twffan="done">&nbsp;request.getQueryString().substring(</span> <span style="color: #000000" twffan="done">0</span> <span style="color: #000000" twffan="done">,&nbsp;ticketLoc));<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" twffan="done"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="color: #000000" twffan="done"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" twffan="done"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="color: #000000" twffan="done"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" twffan="done"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span></div>
<p><br />
发现对于没有参数的http请求，request.getQueryString()函数在Tomcat5.5.15中是返回null，而5.5.16中是返回""。到这里问题就清楚了，看来yale的这帮学生代码写得还是有点业余呀，直接加上对空string判断的逻辑，问题解决。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这个bug我已经提交到cas的jira上了，应该很快可以fix了，在新版本client没有发布前，可以使用附件压缩包中的jar替换casclient.jar。<br />
<a title="caszip" href="http://www.blogjava.net/Files/zhangwh6882/casclient.zip" target="">casclient.zip</a><br />
<br />
<br />
</p>
<h3>Yale CAS项目总结</h3>
<p>SSO总会有一个结束的时候，我最终把CAS Server 2.0放到Weblogic Portal上，并实现了到其他WebApp的单点登陆。困难比我原先想象的要大，总结几点，希望对来者有所帮助。<br />
1，搞SSO前请先熟悉SSL/PKI，因为，CAS的安全性很大程度依赖于SSL，没有安全性，不敢想象SSO有何作为。<br />
2，因为我们的环境是在Weblogic Portal上，Portal环境上，调试CAS费了我好大力气，加之我重写了CAS的LoginModule(CAS不提供J_Security_check登陆方式)，中途抛出的错误很多，访问BEA Support网站是家常便饭了。<br />
3，CAS需要配置信任证书，如果象我那样一步一步地创建根CA，ServerCA，恐怕会比较辛苦，但证书的确让我高枕无忧，从CAS Server和各个Web应用之间建立一种更松耦合的信任关系。<br />
4，IE端到CAS Server的双向SSL虽是画蛇添足，但是在一些高安全性的SSO环境，如网上付费，付出少许的计算代价，即让身份欺诈无所遁形。</p>
<p>冷静下来，想了一下SSO的用处，看来在互连星空中会有卖点，事实上，电信已经使用了SSO了，联通在信平台也在各SP与MISC之间部署SSO，随着B2B，B2C的发展，相信SSO会有很不错的前途。</p>
<p>我个人对CAS的评价是，<br />
PureJava Impl，OpenSource，能轻松在各种WebServer间移植，协议并没有Kerberos那么复杂(当然Kerberos更安全)，所以使用和调试起来，没有Kerberos那么痛苦。实战中，本人更倾向使用CAS 3.0，基于Spring的一种实现方式，将来有空必为此写一Blog.<br />
<br />
</p>
<table cellspacing="0" width="100%" border="0" blogpost?>
    <tbody>
        <tr>
            <td><span id="subjcns!3552D94AEF2D2247!105" twffan="done"><strong>使用cas实现sso</strong> </span></td>
        </tr>
        <tr>
            <td id="msgcns!3552D94AEF2D2247!105">
            <div twffan="done">CAS (Central Authentication Service)是Yale大学的ITS开发的一套JAVA实现的开源<br />
            的SSO(single sign-on)的服务,http://www.yale.edu/tp/cas/ </div>
            <div twffan="done">cas分为服务端和客户端，在服务端开启SSL，服务器下发证书安装到各个客户端中，客户端在与服务器进行通讯验证时，将检验二者的证书是否一致。</div>
            <div twffan="done">1、服务器中生成证书：keytool -genkey -alias cnc -keystore c:"mykeystore</div>
            <div twffan="done">导出证书，由客户端安装： keytool -export -alias -keystore c:"mykeystore -file c:"mycerts.cer</div>
            <div twffan="done">注：生成证书时，CN要和服务器的域名相同，如果在本地测试，则使用localhost</div>
            <div twffan="done">2、客户端配置：（注：使用client2.0.11版本稳定些，2.0.10总报异常）</div>
            <div twffan="done">将服务器下发的证书导入到JVM中</div>
            <div twffan="done">keytool -import -trustcacerts -alias cnc -keystore $JAVA_HOME/JRE/LIB/SECURITY/CACERTS -file c:"mycert.cer </div>
            <div twffan="done">（如果这样不行，则到JAVA_HOME/JRE/LIB/SECURITY/下进行）</div>
            <div twffan="done">配置web.xml：</div>
            <div twffan="done">&lt;filter&gt;<br />
            &lt;filter-name&gt;CASFilter&lt;/filter-name&gt;<br />
            &lt;filter-class&gt;edu.yale.its.tp.cas.client.filter.CASFilter&lt;/filter-class&gt;<br />
            &lt;init-param&gt;<br />
            &lt;param-name&gt;edu.yale.its.tp.cas.client.filter.loginUrl&lt;/param-name&gt;<br />
            &lt;param-value&gt;https://localhost:8443/cas/login&lt;/param-value&gt;<br />
            &lt;/init-param&gt;<br />
            &lt;init-param&gt;<br />
            &lt;param-name&gt;edu.yale.its.tp.cas.client.filter.validateUrl&lt;/param-name&gt;<br />
            &lt;param-value&gt;https://localhost:8443/cas/proxyValidate&lt;/param-value&gt;<br />
            &lt;/init-param&gt;<br />
            &lt;init-param&gt;<br />
            &lt;param-name&gt;edu.yale.its.tp.cas.client.filter.serverName&lt;/param-name&gt;<br />
            &lt;param-value&gt;localhost&lt;/param-value&gt;<br />
            &lt;/init-param&gt;<br />
            <br />
            &lt;/filter&gt;</div>
            <div twffan="done">&lt;filter-mapping&gt;<br />
            &lt;filter-name&gt;CASFilter&lt;/filter-name&gt;<br />
            &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
            &lt;/filter-mapping&gt;</div>
            <p>　当前CAS默认的用户名和密码判断是，只要用户名和密码相同即可。使用的类为SampleHandler,一般的是与数据库进行匹配，这样我们可以实现PasswordHandler接口， 在authenticate（）方法中进行验证。可以在容器中配置数据源，使用容器提供的数据源。</p>
            <p>　　同时修改服务器下ＣＡＳ的web.xml中的配置，使用自己的类。</p>
            <p>&lt;context-param&gt;<br />
            &lt;param-name&gt;edu.yale.its.tp.cas.authHandler&lt;/param-name&gt;<br />
            &lt;param-value&gt;edu.yale.its.tp.cas.auth.provider.MyDBHandler&lt;/param-value&gt;<br />
            &lt;/context-param&gt;</p>
            <p>　　然后重新BUILD，将类打包，替换服务器CAS/WEB-INF/LIB下原来的包。</p>
            <p>　CAS只能提供SSO，对于角色，授权，则要在web.xml进行相应的配置&lt;security-constraint&gt;，也可以使用filter。</p>
            <p>常出现的异常：&#8220;未找到可信任的证书&#8221;--主要原因为在客户端未将服务器下发的证书导入到JVM中，可以用keytool -list -alias cnc -keystore $JAVA_HOME/JRE/LIB/SECURITY/CACERTS<br />
            来查看证书是否真的导入到JVM中。</p>
            <p>&#8220;https hostname must be <a href="http://www.xx.com/"><font color="#0808c3">www.xx.com</font></a>&#8220;---主要原因为在创建keystore是，CN没设置成为服务器的域名，例如 <a href="http://www.auth.com.cn/"><font color="#0808c3">www.auth.com.cn</font></a></p>
            </td>
        </tr>
    </tbody>
</table>
</span>
<img src ="http://www.blogjava.net/CrazyJava/aggbug/180047.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2008-02-15 12:46 <a href="http://www.blogjava.net/CrazyJava/articles/180047.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>单点登录CAS的使用方法</title><link>http://www.blogjava.net/CrazyJava/articles/180030.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Fri, 15 Feb 2008 02:32:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/180030.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/180030.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/180030.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/180030.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/180030.html</trackback:ping><description><![CDATA[下载地址: <a href="http://www.oksonic.cn/">http://www.oksonic.cn</a>
<p><span><span>一．</span></span><span>环境</span></p>
<p><span><span>a)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Windows 2003 sp1</span></p>
<p><span><span>b)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>JDK<ST1:CHSDATE w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.5.0</ST1:CHSDATE>_11</span></p>
<p><span><span>c)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Tomcat <ST1:CHSDATE w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">5.5.23</ST1:CHSDATE></span></p>
<p><span><span>d)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>MySql5.0</span></p>
<p><span><span>二．</span></span><span>准备</span></p>
<p><span><span>a)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>cas-server-<ST1:CHSDATE w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">3.0.6</ST1:CHSDATE>.zip&nbsp;</span><span>下载地址：</span><span>http://www.ja-sig.org/products/cas/index.html</span></p>
<p><span><span>b)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>cas-client-java-<ST1:CHSDATE w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">2.1.1</ST1:CHSDATE>.zip&nbsp;</span><span>下载地址：同上</span></p>
<p><span><span>c)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>安装完</span><span>jdk</span><span>和</span><span>jre</span><span>后，需要配置</span><span>JAVA_HOME</span><span>和</span><span>PATH=%JAVA_HOME%\bin</span></p>
<p><span><span>三．</span></span><span>步骤</span></p>
<p><strong><span><span>a)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></strong><strong><span>配置</span><span>Tomcat</span></strong><strong><span>使用</span><span>SSL</span></strong><strong><span>安全认证</span></strong></p>
<p><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>i.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>使用命令提示符进入到</span><span>Tomcat</span><span>安装目录</span></p>
<p><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ii.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>生成服务端密匙</span></strong><span>，</span><span>执行以下命令</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>keytool -genkey -alias </span></span><strong><span>别名</span><span>k</span></strong><span>eyalg RSA -keypass changeit -storepass changeit <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>-keystore server.keystore</span></p>
<p><span>例：</span><span>keytool -genkey -alias casserver -keyalg RSA -keypass changeit -storepass changeit -keystore server.keystore</span></p>
<p><span>运行后出现提示信息：</span></p>
<p><span>输入</span><span>keystore</span><span>密码：</span><span>changeit <span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>这里也填入<strong>主机名</strong></span><strong></strong></p>
<p><span>您的名字与姓氏是什么？</span></p>
<p><span>&nbsp;[Unknown]</span><span>：</span><span>&nbsp;</span><span>localhost</span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>这里一定要填写正确的主机名</span></p>
<p><span>您的组织单位名称是什么？</span></p>
<p><span>&nbsp;[Unknown]</span><span>：</span><span>&nbsp;</span><span>oksonic</span></p>
<p><span>您的组织名称是什么？</span></p>
<p><span>&nbsp;[Unknown]</span><span>：</span><span>&nbsp;</span><span>oksonic</span></p>
<p><span>您所在的城市或区域名称是什么？</span></p>
<p><span>&nbsp;[Unknown]</span><span>：</span><span>&nbsp;</span><ST1:PLACE w:st="on"><ST1:CITY w:st="on"><span>kunming</span></ST1:CITY></ST1:PLACE></p>
<p><span>您所在的州或省份名称是什么？</span></p>
<p><span>&nbsp;[Unknown]</span><span>：</span><span>&nbsp;</span><ST1:PLACE w:st="on"><ST1:STATE w:st="on"><span>yunnan</span></ST1:STATE></ST1:PLACE></p>
<p><span>该单位的两字母国家代码是什么</span></p>
<p><span>&nbsp;[Unknown]</span><span>：</span><span>&nbsp;</span><span>cn</span></p>
<p><span>CN=localhost, OU=oksonic, O=oksonic, L=kunming, ST=yunnan, C=cn </span><span>正确吗？</span></p>
<p><span>&nbsp;[</span><span>否</span><span>]</span><span>：</span><span>&nbsp;</span><span>y</span></p>
<p><span>完成后会在</span><span>Tomcat</span><span>目录生成一个名为</span><span>casserver</span><span>的文件</span></p>
<p><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>iii.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>生成服务端证书</span></strong><span>，</span><span>执行以下命令</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>keytool -export -alias </span><strong><span>casserver</span></strong><span> -storepass changeit -file server.cer <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>-keystore server.keystore</span></span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>命令执行后生成一个</span><span>server.cer</span><span>的证书文件</span></p>
<p>&nbsp;</p>
<p><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>iv.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>生成客户端密匙</span></strong><span>，</span><span>执行以下命令</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>keytool -genkey -alias </span><strong><span>casclient</span></strong><span> -keyalg RSA -keypass changeit -storepass <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>changeit -keystore client.keystore</span></p>
<p><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>v.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>生成客户端证书</span></strong><span>，</span><span>执行以下命令</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>keytool -export -alias </span><strong><span>casclient</span></strong><span> -storepass changeit -file client.cer <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>-keystore client.keystore</span></span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>命令执行后生成一个</span><span>server.cer</span><span>的证书文件</span></p>
<p><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>vi.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>导入证书文件到</span><span>cacerts</span><span> </span></strong><strong><span>文件中</span></strong><span>，执行以下命令</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>keytool -import -trustcacerts -alias server -file server.cer -keystore <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>cacerts -storepass changeit </span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>keytool -import -trustcacerts -alias client -file client.cer -keystore <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>cacerts -storepass changeit </span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span>把</span><span>cacerts</span></strong><strong><span>文件，拷贝到</span><span>&lt;JAVA_HOME&gt;\jre\lib\security</span></strong><strong><span>目录下</span></strong></p>
<p><strong>&nbsp;</strong></p>
<p><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>vii.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>拷贝</span><span>cas-server-<ST1:CHSDATE w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">3.0.6</ST1:CHSDATE>.zip</span><span>包内的</span><span>target</span><span>目录下的</span><span>cas.war</span><span>文件到</span><span>Tomcat</span><span>目录下的</span><span>webapps</span><span>目录下</span></p>
<p><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>viii.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>修改</span><span>Tomcat</span><span>的配置文件</span><span>server.xml</span><span>把以下补注释的内容打开</span></p>
<p><span>&lt;Connector port="8443" maxHttpHeaderSize="8192"</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>maxThreads="150" minSpareThreads="25" maxSpareThreads="75"</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>enableLookups="false" disableUploadTimeout="true"</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>acceptCount="100" scheme="https" secure="true"</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>clientAuth="false" sslProtocol="TLS" /&gt;</span></p>
<p><span>加入红字部份后的内容如下：</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;Connector port="8443" maxHttpHeaderSize="8192"</span><span> </span></p>
<p><span>keystorePass="changeit" keystoreFile="/</span><span>server.keystore</span><span>"</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>maxThreads="150" minSpareThreads="25" maxSpareThreads="75"</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>enableLookups="false" disableUploadTimeout="true"</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>acceptCount="100" scheme="https" secure="true"</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>clientAuth="false" sslProtocol="TLS" /&gt;</span></p>
<p>&nbsp;</p>
<p><strong><span><span>b)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></strong><strong><span>配置客户端应用</span></strong></p>
<p><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>i.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>使用</span><span>Tomcat</span><span>的例子</span><span>jsp-examples</span><span>来做客户端</span></p>
<p><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ii.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>打开项目中的</span><span>web.xml</span><span>文件，加入以下配置信息</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&lt;filter&gt;<br />
&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;&lt;filter-name&gt;CASFilter&lt;/filter-name&gt;<br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;&nbsp;&lt;filter-class&gt;<br />
&nbsp;&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;edu.yale.its.tp.cas.client.filter.CASFilter<br />
&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;&lt;/filter-class&gt;<br />
&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;&lt;init-param&gt;<br />
&nbsp;&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;&lt;param-name&gt;<br />
&nbsp;&nbsp;&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;edu.yale.its.tp.cas.client.filter.loginUrl<br />
&nbsp;&nbsp;&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/param-name&gt;<br />
&nbsp;&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;&lt;param-value&gt;</span><span>https://localhost:8443/cas/login</span><span>&lt;/param-value&gt;<br />
&nbsp;&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/init-param&gt;&nbsp;<br />
&nbsp;&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;init-param&gt;<br />
&nbsp;&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;&nbsp; &lt;param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>edu.yale.its.tp.cas.client.filter.validateUrl<br />
&nbsp;&nbsp;&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;param-value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span><a href="https://localhost:8443/cas/proxyValidate"><span>https://localhost:8443/cas/proxyValidate</span></a></span><span><br />
&nbsp;&nbsp;&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/param-value&gt;<br />
&nbsp;&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/init-param&gt;<br />
&nbsp;&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;param-name&gt;<br />
&nbsp;&nbsp;&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;edu.yale.its.tp.cas.client.filter.serverName<br />
&nbsp;&nbsp;&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;param-value&gt;</span><span>localhost:8080</span><span>&lt;/param-value&gt;<br />
&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;&lt;/init-param&gt;<br />
&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/filter&gt;</span></span></p>
<p><span>&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;filter-mapping&gt;<br />
&nbsp;&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;filter-name&gt;CASFilter&lt;/filter-name&gt;<br />
&nbsp;&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;url-pattern&gt;</span><span>/ *</span><span>&lt;/url-pattern&gt;<br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;&lt;/filter-mapping&gt;</span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span>拷贝</span><span>cas-client-java-<ST1:CHSDATE w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">2.1.1</ST1:CHSDATE>.zip</span></strong><strong><span>包中的</span><span>casclient.jar</span></strong><strong><span>到项目的</span><span>lib</span></strong><strong><span>目录下</span></strong></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>现在可以启动</span><span>Tomcat</span><span>来测试一下是否能够进入到登录页</span></p>
<p><strong><span><span>c)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></strong><strong><span>配置</span><span>CAS</span></strong><strong><span>使用数据库进行验证</span></strong></p>
<p><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>i.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>在</span><span>MySql</span><span>中的</span><span>Test</span><span>库中新建</span><span>app_user</span><span>表</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>CREATE TABLE `app_user` (<br />
&nbsp; <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>`username` varchar(30) NOT NULL default '',<br />
&nbsp; <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>`password` varchar(45) NOT NULL default '',<br />
&nbsp; <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>PRIMARY KEY&nbsp; (`username`)<br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>) ENGINE=InnoDB DEFAULT CHARSET=utf8;<br />
</span><span>添加以下用户：</span><span><br />
</span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>INSERT INTO `app_user` (`username`,`password`) VALUES </span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;('oksonic','oksonic'),</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;('oksonic1','oksonic1');</span></p>
<p>&nbsp;</p>
<p><strong><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ii.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></strong><strong><span>修改</span><span>cas</span></strong><strong><span>项目中的</span><span>deployerConfigContext.xml</span></strong><strong><span>文件</span></strong></p>
<p><span>&lt;bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" /&gt;<br />
</span><span>注释掉该行，在其下加入：</span><span><br />
<span>&lt;bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="sql" value="select password from</span><span> <strong>app_user</strong></span><strong><span> </span></strong><span>where username=?" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="dataSource" ref="dataSource" /&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span> &lt;/bean&gt;<br />
</span></span><span>并添加一个</span><span>bean</span><span>：</span><span><br />
&nbsp;&nbsp;&nbsp; &lt;bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="driverClassName"&gt;&lt;value&gt;com.mysql.jdbc.Driver&lt;/value&gt;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="url"&gt;&lt;value&gt;jdbc:mysql://localhost:3306/test&lt;/value&gt;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="username"&gt;&lt;value&gt;test&lt;/value&gt;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="password"&gt;&lt;value&gt;test&lt;/value&gt;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
</span><span>拷贝</span><span>cas-server-jdbc-<ST1:CHSDATE w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">3.0.6</ST1:CHSDATE>.jar</span><span>和</span><span>mysql-connector-java-3.1.11-bin.jar</span><span>到</span><span>webapps/cas/WEB-INF/lib</span><span>下</span></p>
<img src ="http://www.blogjava.net/CrazyJava/aggbug/180030.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2008-02-15 10:32 <a href="http://www.blogjava.net/CrazyJava/articles/180030.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>cas实现单点登录</title><link>http://www.blogjava.net/CrazyJava/articles/180028.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Fri, 15 Feb 2008 02:31:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/180028.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/180028.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/180028.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/180028.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/180028.html</trackback:ping><description><![CDATA[<p>1 简介 <br />
cas是耶鲁大学开发的一个开源项目，含义为集中认证服务(Central Authentication Service)， <br />
目标为：当耶鲁大学有新的应用系统上线时，这个应用系统只需要配置使用cas来保护它的资源受限访问，而不需要 这个应用系统本身再编写安全方面的代码。 <br />
<a href="http://www.yale.edu/tp/auth">www.yale.edu/tp/auth</a> <br />
2 实现方式 <br />
cas是以web app的形式出现的，即cas本身是一个web应用 需要使用cas的其他web app，只需要在它的部署文件web.xml中配置一个过滤servlet，就可以利用cas来提供因为cas需要使用ssl来加强安全，因此web服务器要开放ssl连接 <br />
--------------------------------------------------------------------------------------<br />
Yale CAS (Central Authentication Service，中央认证服务)是耶鲁大学的一个开源项目。它为耶鲁大学的网络应用提供了一种标准的用户认证服务，从而实现了SSO的功能。<br />
Yale CAS被设计成为一个独立的网络应用程序，它使用JavaServlet技术实现，可以作为用户身份认证模块加入到网络应用中。<br />
他的实现的小例子，网上有很多版本，可是总是配置不成功，现在总结一下自己的配置过程。希望对各位网友有所帮助。<br />
Tomcat5.5.9 <br />
Jdk 1.5.0.1<br />
按照如下的配置成功：<br />
1、首先我打开tomcat5.5的SSL，修改Tomcat配置文件server.xml，去掉对于SSL的注释，即开放8443端口（注意：不用添加任何东西）</p>
<p>2.生成安全证书<br />
在命令行中：切换到<br />
%java_home%\bin\keytool -genkey -alias tomcat -keyalg RSA<br />
密码是:changeit<br />
姓名是:localhost<br />
其他随便写的<br />
之后是<br />
%java_home%\bin\keytool -export -alias tomcat -file server.crt<br />
和<br />
%java_home%\bin\keytool -import -file server.crt -keystore %java_home%/jre/lib/security/cacerts <br />
-----------------------------------------</p>
<p>&nbsp;</p>
<p>Yale CAS Server 的配置过程</p>
<p>CAS (Central Authentication Service)是Yale大学的ITS开发的一套JAVA实现的开源<br />
的SSO(single sign-on)的服务。该服务是以一个java web app(eg:cas.war)来进行服务的，<br />
使用时需要将cas.war发布到一个servlet2.3兼容的服务器上，并且服务器需要支持SSL，<br />
在需要使用该服务的其他服务器（客户），只要进行简单的配置就可以实现SSO了。</p>
<p>CAS 的客户端可以有很多种，因为验证的结果是以XML的格式返回的，CAS的客户端已<br />
打包进去的有java,perl,python,asp,apache module等好几种客户端示例，你还可以根据<br />
需要实现一个自己的客户端，非常简单!~</p>
<p>下面我们以tomcat 5.0 作为CAS Server(server1)，另外一台tomcat5.0 为client(client1)<br />
为例进行说明。</p>
<p>1.下载cas-server和cas-client(可选，建议使用）<br />
<a href="http://www.yale.edu/tp/cas/cas-server-2.0.12.zip">http://www.yale.edu/tp/cas/cas-server-2.0.12.zip</a><br />
<a href="http://www.yale.edu/tp/cas/cas-client-2.0.11.zip">http://www.yale.edu/tp/cas/cas-client-2.0.11.zip</a></p>
<p>2.将cas-server-2.0.12.zip解压，并将lib/cas.war拷贝到server1的webapps下 </p>
<p>3.产生SERVER的证书<br />
keytool -genkey -alias my-alias-name -keyalg RSA -keystore keystore-file</p>
<p>4.在server1配置tomcat使用HTTPS</p>
<p>$CATALINA_HOME/conf/server.xml里</p>
<p>&lt;Connector className="org.apache.coyote.tomcat5.CoyoteConnector"<br />
port="8443" minProcessors="5" maxProcessors="75"<br />
enableLookups="true" disableUploadTimeout="true"<br />
acceptCount="100" debug="0" scheme="https"<br />
secure="true"&gt;<br />
&lt;Factory className="org.apache.coyote.tomcat5.CoyoteServerSocketFactory"<br />
keystoreFile="/path/to/your/keystore-file"<br />
keystorePass="your-password" clientAuth="false" protocol="TLS" /&gt;<br />
&lt;/Connector&gt;</p>
<p>5.在要使用CAS的客户端client1里设置（以servlets-examples这个APP为例），我们使用<br />
ServletFilter(CAS client里提供的)来实现SSO的检查。</p>
<p>修改servlets-examples/WEB-INF/web.xml</p>
<p>&lt;filter&gt;<br />
&lt;filter-name&gt;CASFilter&lt;/filter-name&gt;<br />
&lt;filter-class&gt;edu.yale.its.tp.cas.client.filter.CASFilter&lt;/filter-class&gt;<br />
&lt;init-param&gt;<br />
&lt;param-name&gt;edu.yale.its.tp.cas.client.filter.loginUrl&lt;/param-name&gt;<br />
&lt;param-value&gt;https://your.cas.server.name(eg:server1):port/cas/login&lt;/param-value&gt;<br />
&lt;/init-param&gt;<br />
&lt;init-param&gt;<br />
&lt;param-name&gt;edu.yale.its.tp.cas.client.filter.validateUrl&lt;/param-name&gt;<br />
&lt;param-value&gt;https://your.cas.server.name(eg:server1):port/cas/proxyValidate&lt;/param-value&gt;<br />
&lt;/init-param&gt;</p>
<p>&lt;init-param&gt;<br />
&lt;param-name&gt;edu.yale.its.tp.cas.client.filter.serverName&lt;/param-name&gt;<br />
&lt;param-value&gt;your.client.server.name(eg:client1):port&lt;/param-value&gt;<br />
&lt;/init-param&gt;</p>
<p>&lt;/filter&gt;</p>
<p>&lt;filter-mapping&gt;<br />
&lt;filter-name&gt;CASFilter&lt;/filter-name&gt;<br />
&lt;url-pattern&gt;/servlet/*&lt;/url-pattern&gt;<br />
&lt;/filter-mapping&gt;</p>
<p>6.将cas-client-2.0.11.zip解压，把java/lib/casclient.jar拷贝到client1服务器上的<br />
webapps/servlets-examples/WEB-INF/lib目录下（如果没有就建一个）</p>
<p>7.导出SERVER的证书，用来给所有需要用到的客户端导入<br />
keytool -export -file myserver.cert -alias my-alias-name -keystore keystore-file</p>
<p>8.在客户端的JVM里导入信任的SERVER的证书(根据情况有可能需要管理员权限)<br />
keytool -import -keystore $JAVA_HOME/jre/lib/security/cacerts -file myserver.cert -alias my-alias-name</p>
<p>9.test &amp; done.<br />
把server1和client1分别起来，检查启动的LOG是否正常，如果一切OK，就访问<br />
<a href="http://client1:8080/servlets-examples/servlet/HelloWorldExample">http://client1:8080/servlets-examples/servlet/HelloWorldExample</a><br />
系统会自动跳转到一个验证页面，随便输入一个相同的账号,密码，严正通过之后就会访问<br />
到真正的HelloWorldExample这个servlet了</p>
<p>更多信息请参考<br />
<a href="http://www.yale.edu/tp/cas/">http://www.yale.edu/tp/cas/</a><br />
<a href="http://www-106.ibm.com/developerworks/web/library/wa-singlesign/">http://www-106.ibm.com/developerworks/web/library/wa-singlesign/</a><br />
&nbsp;</p>
<br />
<br />
<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1558776</p>
<img src ="http://www.blogjava.net/CrazyJava/aggbug/180028.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2008-02-15 10:31 <a href="http://www.blogjava.net/CrazyJava/articles/180028.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>win2003+IIS6+Tomcat5+jk2整合</title><link>http://www.blogjava.net/CrazyJava/articles/178570.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Wed, 30 Jan 2008 10:00:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/178570.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/178570.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/178570.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/178570.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/178570.html</trackback:ping><description><![CDATA[制作环境：
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><strong><span style="font-size: 10pt; font-family: 宋体">&nbsp;</span></strong><span style="font-size: 10pt; font-family: 宋体">Windows 2003 + IIS6、jre1.5.0_06、apache-tomcat-5.5.17</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><strong>&nbsp;</strong></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><strong><span style="font-size: 10pt; font-family: 宋体">首先需要做以下准备工作</span> </strong></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><strong><span style="font-size: 10pt; font-family: 宋体">&nbsp;</span></strong><span style="font-size: 10pt; font-family: 宋体">1、安装好 <span style="color: blue">Tomcat </span>和 <span style="color: blue">IIS6</span> ，并且都能正常运行</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;2、Tomcat的端口没做任何修改</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;3、下载好 集成需要的 <span style="color: blue">isapi_redirector2.dll </span>文件</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">http://archive.apache.org/dist/tomcat/tomcat-connectors/jk2/binaries/win32/jakarta-tomcat-connectors-jk2.0.4-win32-IIS.zip&nbsp;</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 宋体">集成步骤</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;1、配置环境变量</span> <span style="font-size: 10pt; color: blue; font-family: 宋体">JAVA_HOME </span><span style="font-size: 10pt; color: black; font-family: 宋体">和</span> <span style="font-size: 10pt; color: blue; font-family: 宋体">TOMCAT_HOME</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;2、将 <span style="color: blue">isapi_redirector2.dll</span> 文件拷贝到 <span style="color: blue">TOMCAT_HOME</span> 中的任意一个目录中，如：<span style="color: blue">TOMCAT_HOME/iis </span>此目录需要新建</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;3、新建一个目录存放站点，如：<span style="color: blue">d:"web </span><span style="color: black">并在其中新建一个 </span><span style="color: blue">ROOT</span><span style="color: black"> 目录，此目录作为站点的默认起始目录</span></span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;4、打开 IIS 控制台，新建一个站点，如果自己有域名的话可以在主机头中输入自己的域名，</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; 如：</span> <span style="font-size: 10pt; color: blue; font-family: 宋体">www.oksonic.cn </span><span style="font-size: 10pt; color: black; font-family: 宋体">这样就不会和原来的默认网站冲突了，现在需要将默认网关停止后再新建</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;5、新建一个虚拟目录，名称为：jakarta 这个名称不能改变，路径为 </span><span style="font-size: 10pt; color: blue; font-family: 宋体">TOMCAT_HOME/iis</span> <span style="font-size: 10pt; color: black; font-family: 宋体">，也就是放 </span><span style="font-size: 10pt; color: blue; font-family: 宋体">dll </span><span style="font-size: 10pt; color: black; font-family: 宋体">文件的</span> <span style="font-size: 10pt; font-family: 宋体">目录</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; 打开站点属性窗口，进入</span> <span style="font-size: 10pt; color: blue; font-family: 宋体">ISAPI</span> <span style="font-size: 10pt; color: black; font-family: 宋体">筛选器，点击添加铵钮，在筛选器名称中输入</span> <span style="font-size: 10pt; color: blue; font-family: 宋体">jakarta</span> <span style="font-size: 10pt; color: black; font-family: 宋体">，这个名字也不能修改，所以要注意是否正确，</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; 在可执行文件中选择 </span><span style="font-size: 10pt; color: blue; font-family: 宋体">TOMCAT_HOME/iis/isapi_redirector2.dll </span><span style="font-size: 10pt; color: black; font-family: 宋体">文件</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; 进入主目录选项卡，在弹出窗口中选择添加，这里对 </span><span style="font-size: 10pt; color: blue; font-family: 宋体">jsp </span><span style="font-size: 10pt; color: black; font-family: 宋体">文件和 </span><span style="font-size: 10pt; color: blue; font-family: 宋体">struts </span><span style="font-size: 10pt; color: black; font-family: 宋体">的 </span><span style="font-size: 10pt; color: blue; font-family: 宋体">do </span><span style="font-size: 10pt; color: black; font-family: 宋体">访问方式进行映射配置，点击添加铵钮，</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; 可执行文件选择&nbsp;</span><span style="font-size: 10pt; color: blue; font-family: 宋体">TOMCAT_HOME/iis/isapi_redirector2.dll </span><span style="font-size: 10pt; color: black; font-family: 宋体">，扩展名为 </span><span style="font-size: 10pt; color: blue; font-family: 宋体">jsp </span><span style="font-size: 10pt; color: black; font-family: 宋体">，同样对 </span><span style="font-size: 10pt; color: blue; font-family: 宋体">do </span><span style="font-size: 10pt; color: black; font-family: 宋体">也进行配置</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;6、新增一个 Web 服务扩展，扩展名随意填，如：</span> <span style="font-size: 10pt; color: blue; font-family: 宋体">Tomcat</span> <span style="font-size: 10pt; color: black; font-family: 宋体">，要求的文件选择</span> <span style="font-size: 10pt; color: blue; font-family: 宋体">TOMCAT_HOME/iis/isapi_redirector2.dll </span><span style="font-size: 10pt; color: black; font-family: 宋体">，</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; 选中设置扩展状态为充许项，然后确定</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;7、拷贝</span> <span style="font-size: 10pt; color: blue; font-family: 宋体">jk2.properties</span> <span style="font-size: 10pt; color: black; font-family: 宋体">、</span> <span style="font-size: 10pt; color: blue; font-family: 宋体">workers2.properties </span><span style="font-size: 10pt; color: black; font-family: 宋体">两个文件到 </span><span style="font-size: 10pt; color: blue; font-family: 宋体">TOMCAT_HOME/conf </span><span style="font-size: 10pt; color: black; font-family: 宋体">目录中</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">jk2.properties 文件内容如下：</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">request.tomcatAuthentication=false</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">workers2.properties 文件内容如下：(</span> <span style="font-size: 10pt; color: red; font-family: 宋体">以下第二行的文件路径需要根据自己的配置进行修改</span> <span style="font-size: 10pt; color: black; font-family: 宋体">)</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">[shm]</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">file= </span><span style="font-size: 10pt; color: green; font-family: 宋体">d:/Tomcat/logs/jk2.log</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">size=1048576</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体"># Example socket channel, override port and host.</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">[channel.socket:localhost:8009]</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">port=8009</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">host=127.0.0.1</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体"># define the worker</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">[ajp13:localhost:8009]</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">channel=channel.socket:localhost:8009</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体"># Uri mapping</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">[uri:/*.jsp]</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">[uri:/*.do]</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">[uri:/do/*]</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">worker=ajp13:localhost:8009</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体"># define the worker</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">[status:status]</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体"># Uri mapping</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">[uri:/jkstatus/*]</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">worker=status:status</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: red; font-family: 宋体">注意 # Uri mapping 部份，现在已经开通了对jsp文件和struts的两种访问方式，如果还有其它的文件访问需要转到Tomcat来处理的话都在此进行配置</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;8、现打开注册表文件，</span> <span style="font-size: 10pt; color: red; font-family: 宋体">修改绿色字体部份，注意路径表示符</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">文件内容如下：</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">Windows Registry Editor Version 5.00</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">[HKEY_LOCAL_MACHINE"SOFTWARE"Apache Software Foundation"Jakarta Isapi Redirector"2.0]</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">"serverRoot"="</span> <span style="font-size: 10pt; color: green; font-family: 宋体">D:""Tomcat</span> <span style="font-size: 10pt; color: blue; font-family: 宋体">"</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">"extensionUri"="/jakarta/isapi_redirector2.dll"</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">"workersFile"="</span> <span style="font-size: 10pt; color: green; font-family: 宋体">D:""Tomcat""conf""workers2.properties</span> <span style="font-size: 10pt; color: blue; font-family: 宋体">"</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">"logLevel"="DEBUG"</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; 修改完成后将导入注册表（双击此文件）</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;9、修改 </span><span style="font-size: 10pt; color: blue; font-family: 宋体">tomcat </span><span style="font-size: 10pt; color: black; font-family: 宋体">的配置文件 </span><span style="font-size: 10pt; color: blue; font-family: 宋体">server.xml</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: black; font-family: 宋体">使用以下内容替换原来的</span> <span style="font-size: 10pt; color: blue; font-family: 宋体">&lt;host&gt;...&lt;/host&gt; </span><span style="font-size: 10pt; color: black; font-family: 宋体">内容，</span> <span style="font-size: 10pt; color: red; font-family: 宋体">绿色字体为需要修改的内容</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&lt;Host name="</span> <span style="font-size: 10pt; color: green; font-family: 宋体">localhost</span> <span style="font-size: 10pt; color: blue; font-family: 宋体">" debug="0" appBase="</span> <span style="font-size: 10pt; color: green; font-family: 宋体">d:"web</span> <span style="font-size: 10pt; color: blue; font-family: 宋体">" unpackWARs="true" autoDeploy="true"&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Logger className="org.apache.catalina.logger.FileLogger" directory="logs"&nbsp;prefix="</span> <span style="font-size: 10pt; color: green; font-family: 宋体">oksonic_log.</span> <span style="font-size: 10pt; color: blue; font-family: 宋体">" suffix=".txt" timestamp="true"/&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"&nbsp;prefix="</span> <span style="font-size: 10pt; color: green; font-family: 宋体">oksonic_access_log.</span> <span style="font-size: 10pt; color: blue; font-family: 宋体">" suffix=".txt" pattern="common" resolveHosts="false"/&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;/Host&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&nbsp;拷贝 Tomcat_Home/webapps/ROOT 下的文件到 web/ROOT 中</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">重启IIS和Tomcat服务</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&nbsp;&nbsp; </span><span style="font-size: 10pt; color: black; font-family: 宋体">打开浏览器输入</span> <span style="font-size: 10pt; color: blue; font-family: 宋体">http://localhost/index.jsp </span><span style="font-size: 10pt; color: black; font-family: 宋体">进行测试，正常的话可以显示 </span><span style="font-size: 10pt; color: blue; font-family: 宋体">Tomcat </span><span style="font-size: 10pt; color: black; font-family: 宋体">默认的首页</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp; 这时再进入到 </span><span style="font-size: 10pt; color: blue; font-family: 宋体">IIS </span><span style="font-size: 10pt; color: black; font-family: 宋体">的管理工具中查看ISAPI筛选器，这时应该显示一个绿色向上的箭头，如果没有绿色箭头的话应该是有一个红色的向下的箭头，这表明是配置有问题，请检查，如果一个箭头也没有的话应该是没有使用浏览进行测试，只要有一遍测试的话就应该有箭头了</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp; 这里配置完成后有一个问题，就是无法使用 http://localhost 直接打开 index.jsp ，</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp; 即使是配置了IIS6的默认首页也不行，我采用的方法是使用一个 </span><span style="font-size: 10pt; color: blue; font-family: 宋体">index.htm </span><span style="font-size: 10pt; color: black; font-family: 宋体">文件来进行跳转，文件内容如下：</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">"http://www.w3.org/TR/html4/loose.dtd";&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&lt;html&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&lt;head&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&lt;meta http-equiv="refresh" content="0; url=/index.jsp"&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&lt;/head&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&lt;body&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&lt;/body&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&lt;/html&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">整个配置基本完成，现在需要解决乱码的问题，如果有遇到乱码问题的话</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">这里使用的全是 </span><span style="font-size: 10pt; color: blue; font-family: 宋体">UTF-8</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">在项目中要使用 </span><span style="font-size: 10pt; color: blue; font-family: 宋体">UTF-8 </span><span style="font-size: 10pt; color: black; font-family: 宋体">的编码，并配置了过滤器，过滤编码也是 </span><span style="font-size: 10pt; color: blue; font-family: 宋体">UTF-8</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">修改 </span><span style="font-size: 10pt; color: blue; font-family: 宋体">Tomcat </span><span style="font-size: 10pt; color: black; font-family: 宋体">的配置文件 </span><span style="font-size: 10pt; color: blue; font-family: 宋体">server.xml </span><span style="font-size: 10pt; color: black; font-family: 宋体">，在端器配置的地方加入 </span><span style="font-size: 10pt; color: blue; font-family: 宋体">URIEncoding="UTF-8"</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">如： </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&lt;Connector </span><span style="font-size: 10pt; color: green; font-family: 宋体">URIEncoding="UTF-8"</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">port="8080"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxHttpHeaderSize="8192"</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxThreads="150" minSpareThreads="25" maxSpareThreads="75"</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableLookups="false" redirectPort="8443" acceptCount="100"</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connectionTimeout="20000" disableUploadTimeout="true" /&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">这里是Tomcat使用的编码，还要配置集成时使用的编码，因为集成时使用的端口为 8009 所以在配置8009端口的地方也要加入&nbsp;URIEncoding="UTF-8"</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">如：</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&lt;Connector </span><span style="font-size: 10pt; color: green; font-family: 宋体">URIEncoding="UTF-8"</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">port="8009" </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableLookups="false" redirectPort="8443" protocol="AJP/1.3" /&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 宋体">&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">好了，重启 </span><span style="font-size: 10pt; color: blue; font-family: 宋体">IIS </span><span style="font-size: 10pt; color: black; font-family: 宋体">服务和 </span><span style="font-size: 10pt; color: blue; font-family: 宋体">Tomcat </span><span style="font-size: 10pt; color: black; font-family: 宋体">服务，整个集成工作就完成了</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">在这里我无法对乱码问题进行测试，这是我在开发时所发现并已经解决的方法，希望对大家有用。</span> </p>
<img src ="http://www.blogjava.net/CrazyJava/aggbug/178570.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2008-01-30 18:00 <a href="http://www.blogjava.net/CrazyJava/articles/178570.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>win2003+IIS6+Tomcat5+jk整合</title><link>http://www.blogjava.net/CrazyJava/articles/178328.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Tue, 29 Jan 2008 03:09:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/178328.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/178328.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/178328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/178328.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/178328.html</trackback:ping><description><![CDATA[&nbsp;
<p><span style="font-family: 宋体">整合环境：</span>Win2003<span style="font-family: 宋体">下的</span>IIS6.0,jdk1.5,Tomcat5.5, Apache Tomcat Connector JK 1.2.20</p>
<p><span style="font-family: 宋体">整合步骤：</span></p>
<p style="margin-left: 18pt; text-indent: -18pt">1、&nbsp;<span style="font-family: 宋体">确保</span>IIS<span style="font-family: 宋体">和</span>Tomcat<span style="font-family: 宋体">能独立运行。</span>(<span style="font-family: 宋体">设</span>Tomcat<span style="font-family: 宋体">安装在</span><span style="color: #000000">D:\Tomcat5.5)</span></p>
<p style="margin-left: 18pt; text-indent: -18pt">2、&nbsp;<span style="font-family: 宋体">为要整合进</span>IIS<span style="font-family: 宋体">的</span>Web<span style="font-family: 宋体">应用建立<span style="color: #000000">网站</span></span><span style="color: #000000">(<span style="font-family: 宋体">以</span><span style="color: #000000">zjt.costnet.cn</span><span style="font-family: 宋体">为例</span>)</span></p>
<p style="margin-left: 18pt; text-indent: 0cm"><span style="color: #000000"><span style="font-family: 宋体">在</span>IIS<span style="font-family: 宋体">管理器左侧网站一栏新建网站</span>zjt.costnet.cn<span style="font-family: 宋体">，其目录指向要整合进</span>IIS<span style="font-family: 宋体">的</span>Web<span style="font-family: 宋体">应用，与</span>Tomcat<span style="font-family: 宋体">中部署的</span>Web<span style="font-family: 宋体">应用最好保持一致，让网站有执行</span>(<span style="font-family: 宋体">如</span>ISAPI<span style="font-family: 宋体">应用程序或</span>CGI)<span style="font-family: 宋体">的权限。</span></span></p>
<p style="margin-left: 18pt; text-indent: -18pt"><span style="color: #000000">3、&nbsp;<span style="font-family: 宋体">为</span>jk<span style="font-family: 宋体">建立物理目录</span></span></p>
<p style="margin-left: 18pt; text-indent: 0cm"><span style="color: #000000"><span style="font-family: 宋体">到</span>Apache<span style="font-family: 宋体">下载</span>Tomcat Connector JK1.2.20,<span style="font-family: 宋体">在这里只需要下载</span>isapi_redirect.dll<span style="font-family: 宋体">即可<span style="color: #000000"><span style="font-family: 宋体">。在目录</span>D:\Tomcat5.5\bin<span style="font-family: 宋体">下</span></span></span><span style="font-family: 宋体">新建名为</span>jakarta<span style="font-family: 宋体">的目录，将</span>isapi_redirect.dll<span style="font-family: 宋体">复制过去。</span></span></p>
<p style="margin-left: 18pt; text-indent: -18pt"><span style="color: #000000">4、&nbsp;<span style="font-family: 宋体">为</span>jk<span style="font-family: 宋体">建立虚拟目录</span></span></p>
<p style="margin-left: 18pt; text-indent: 0cm"><span style="color: #000000"><span style="font-family: 宋体">选中网站</span>zjt.costnet.cn,<span style="font-family: 宋体">新建虚拟目录，别名为</span>jakarta<span style="font-family: 宋体">，路径<span style="color: #000000"><span style="font-family: 宋体">为</span>D:\Tomcat5.5\bin\jakarta</span></span><span style="font-family: 宋体">，使其有执行</span>(<span style="font-family: 宋体">如</span>ISAPI<span style="font-family: 宋体">应用程序或</span>CGI)<span style="font-family: 宋体">的权限。</span></span></p>
<p style="margin-left: 18pt; text-indent: -18pt"><span style="color: #000000">5、&nbsp;<span style="font-family: 宋体">新建</span>Web<span style="font-family: 宋体">服务扩展</span><br />
<span style="font-family: 宋体">在</span>IIS<span style="font-family: 宋体">管理器左侧网站下面选中</span>Web<span style="font-family: 宋体">服务扩展，添加一个新的</span>Web<span style="font-family: 宋体">服务扩展，扩展名为</span>jakarta,<span style="font-family: 宋体">添加要求的文件为</span><span style="color: red"><span style="color: #000000">D:\Tomcat5.5\bin\jakarta\isapi_redirect.dll,</span></span><span style="font-family: 宋体">并设置扩展状态为允许。</span></span></p>
<p style="margin-left: 18pt; text-indent: -18pt"><span style="color: #000000">6、&nbsp;<span style="font-family: 宋体">设置筛选器</span></span></p>
<p style="margin-left: 18pt; text-indent: 0cm"><span style="color: #000000"><span style="font-family: 宋体">在网站</span>zjt.costnet.cn<span style="font-family: 宋体">上右键选择属性</span>,<span style="font-family: 宋体">在</span>ISAPI<span style="font-family: 宋体">筛选器标签页添加筛选器，名字为</span>jakarta<span style="font-family: 宋体">，路径为</span>isapi_redirect.dll<span style="font-family: 宋体">的路径名，即</span><span style="color: red"><span style="color: #000000">D:\Tomcat5.5\bin</span></span>\jakarta\isapi_redirect.dll<span style="font-family: 宋体">。重新进入属性页，如果成功则该新建的筛选器会有一个绿色向上箭头，优先级为高，这说明</span>jk<span style="font-family: 宋体">模块加载成功。</span></span></p>
<p style="margin-left: 18pt; text-indent: -18pt"><span style="color: #000000">7、&nbsp;<span style="font-family: 宋体">在网站</span>zjt.costnet.cn<span style="font-family: 宋体">上右键选择属性</span>-<span style="font-family: 宋体">主目录</span>-<span style="font-family: 宋体">配置</span>-<span style="font-family: 宋体">映射</span>-<span style="font-family: 宋体">添加</span>-<span style="font-family: 宋体">可执行文件</span><span style="color: red"><span style="color: #000000">D:\Tomcat5.5\bin\jakarta</span></span>\isapi_redirect.dll,<span style="font-family: 宋体">扩展名：</span>.jsp.</span></p>
<p style="margin-left: 18pt; text-indent: -18pt"><span style="color: #000000">8、&nbsp;<span style="font-family: 宋体">为</span>IIS<span style="font-family: 宋体">写注册表</span></span></p>
<p style="margin-left: 18pt; text-indent: 0cm"><span style="color: #000000"><span style="font-family: 宋体">新建文本文件</span>,<span style="font-family: 宋体">输入以下内容</span>,<span style="font-family: 宋体">保存并更名为</span>jakarta.reg<span style="font-family: 宋体">文件</span>,<span style="font-family: 宋体">双击导入注册表</span></span></p>
<p style="margin-left: 18pt; text-indent: 0cm"><span style="color: #000000">Windows Registry Editor Version 5.00</span></p>
<p style="margin-left: 18pt; text-indent: 0cm"><span style="color: #000000">[HKEY_LOCAL_MACHINE"SOFTWARE"Apache Software Foundation]</span></p>
<p style="margin-left: 18pt; text-indent: 0cm"><span style="color: #000000">[HKEY_LOCAL_MACHINE"SOFTWARE"Apache Software Foundation"Jakarta Isapi Redirector]</span></p>
<p style="margin-left: 18pt; text-indent: 0cm"><span style="color: #000000">[HKEY_LOCAL_MACHINE"SOFTWARE"Apache Software Foundation"Jakarta Isapi Redirector"1.0]</span></p>
<p style="margin-left: 18pt; text-indent: 0cm"><span style="color: #000000">"extension_uri"="/jakarta/isapi_redirect.dll"</span></p>
<p style="margin-left: 18pt; text-indent: 0cm"><span style="color: #000000">"worker_file"="<span style="color: red"><span style="color: #000000"> D:\\Tomcat5.5\\conf\\workers.properties"</span></span></span></p>
<p style="margin-left: 18pt; text-indent: 0cm"><span style="color: #000000"><span style="color: #000000">"worker_mount_file"="<span style="color: red"> <span style="color: #000000">D:\\Tomcat5.5\\conf\\uriworkermap.properties"</span></span></span></span></p>
<p style="margin-left: 18pt; text-indent: 0cm"><span style="color: #000000"><span style="color: #000000">"log_file"="<span style="color: #000000"> D:\\Tomcat5.5\\logs\\isapi.log"</span></span></span></p>
<p style="margin-left: 18pt; text-indent: 0cm"><span style="color: #000000">"log_level"="info"</span></p>
<p><span style="color: #000000">&nbsp;9<span style="font-family: 宋体">、建立配置文件</span></span></p>
<p style="margin-left: 18pt; text-indent: 0cm"><span style="color: #000000"><span style="font-family: 宋体">按照注册表里所写的，在</span><span style="color: red"><span style="color: #000000">D:\\Tomcat5.5\\conf</span></span><span style="font-family: 宋体">目录下建立两个配置文件，</span>workers.properties<span style="font-family: 宋体">和</span>uriworkermap.properties<span style="font-family: 宋体">其内容分别为</span>:</span></p>
<p style="margin-left: 18pt; text-indent: 0cm"><span style="color: #000000">========================================================================</span></p>
<p style="margin-left: 18pt; text-indent: 0cm"><span style="color: #000000">workers.properties<span style="font-family: 宋体">的内容：</span></span></p>
<p style="margin-left: 18pt; text-indent: 0cm"><span style="color: #000000">========================================================================</span></p>
<p style="margin-left: 18pt; text-indent: 0cm"><span style="color: #000000">worker.list=ajp13</span></p>
<p style="margin-left: 18pt; text-indent: 0cm"><span style="color: #000000">worker.ajp13.type=ajp13</span></p>
<p style="margin-left: 18pt; text-indent: 0cm"><span style="color: #000000">worker.ajp13.host=<span style="color: #000000">zjt.costnet.cn</span></span></p>
<p style="margin-left: 18pt; text-indent: 0cm"><span style="color: #000000">worker.ajp13.port=8009</span></p>
<p style="margin-left: 18pt; text-indent: 0cm"><span style="color: #000000">========================================================================</span></p>
<p style="margin-left: 18pt; text-indent: 0cm"><span style="color: #000000">uriworkermap.properties<span style="font-family: 宋体">的内容：</span></span></p>
<p style="margin-left: 18pt; text-indent: 0cm"><span style="color: #000000">=========================================================================</span></p>
<p style="margin-left: 18pt; text-indent: 0cm"><span style="color: #000000">/*.jsp=ajp13</span></p>
<p style="margin-left: 18pt; text-indent: 0cm"><span style="color: #000000">/*.do=ajp13</span></p>
<p><span style="color: #000000">10</span><span style="font-family: 宋体"><span style="color: #000000">、测试<br />
在此提供详细文档和相关文件打包下载：<span style="font-size: 14pt"><a href="http://www.blogjava.net/Files/CrazyJava/iis与tomcat整合.rar"><span style="font-size: 14pt">IIS</span><span style="font-size: 14pt; font-family: 宋体">与</span><span style="font-size: 14pt">Tomcat</span><span style="font-size: 14pt; font-family: 宋体">的整合</span></a></span></span></span></p>
 <img src ="http://www.blogjava.net/CrazyJava/aggbug/178328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2008-01-29 11:09 <a href="http://www.blogjava.net/CrazyJava/articles/178328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Tomcat 5.5连接池的配置问题  </title><link>http://www.blogjava.net/CrazyJava/articles/162650.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Fri, 23 Nov 2007 07:36:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/162650.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/162650.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/162650.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/162650.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/162650.html</trackback:ping><description><![CDATA[<div class="posttext">目前网上关于Tomcat 5.5的数据库连接池的配置比较少，仅有的一篇 http://blog.csdn.net/nethermit/archive/2004/11/26/194451.aspx 还被到处拷贝粘贴，而且还不能用。<br />
现在介绍一下真正的配置，以PostgreSQL数据库为例（MySQL配置是一样的）。<br />
1、从http://jakarta.apache.org/commons/dbcp/下载commons-dbcp-1.2.1.jar，然后拷贝放到Tomcat 5.5/common/lib下<br />
2、从http://jdbc.postgresql.org/download.html下载PostgreSQL的JDBC驱动程序，MySQL的JDBC驱动从http://dev.mysql.com/downloads/connector/j/3.1.html下载，然后把相应的JDBC的驱动程序（jar文件）拷贝到Tomcat5.5/common/lib下<br />
2、编辑Tomcat 5.5/conf/tomcat-users.xml，配置如下<br />
&lt;tomcat-users&gt;<br />
&lt;role rolename="tomcat"/&gt;<br />
&lt;role rolename="role1"/&gt;<br />
&lt;role rolename="manager"/&gt;<br />
&lt;role rolename="admin"/&gt;<br />
&lt;user username="tomcat" password="tomcat" roles="tomcat,manager,admin"/&gt;<br />
&lt;/tomcat-users&gt;<br />
3、编辑Tomcat 5.5/conf/server.xml，在<br />
&lt;Host name="localhost" appBase="webapps"<br />
unpackWARs="true" autoDeploy="true"<br />
xmlValidation="false" xmlNamespaceAware="false"&gt;后添加连接描述<br />
&lt;Context path="/mytest" docBase="mytest" debug="5" reloadable="true" crossContext="true"&gt;<br />
&lt;Resource name="mytest_ds" auth="Container"<br />
type="javax.sql.DataSource" driverClassName="org.postgresql.Driver"<br />
url="jdbc:postgresql://127.0.0.1:5432/mytest_db"<br />
username="postgres" password="" maxActive="20" maxIdle="10" maxWait="-1"/&gt;<br />
&lt;/Context&gt;说明：mytest是你的war包名称或者是你在webapps/创建的目录名称<br />
mytest_ds是连接数据源名称<br />
mytest_db是数据库名称<br />
至此Tomcat部分配置完成，下面是JSP部分程序<br />
&lt;%@page contentType="text/html; charset=GBK"%&gt;<br />
&lt;%@ page import="java.sql.*"%&gt;<br />
&lt;%@ page import="javax.naming.*"%&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;<br />
&lt;title&gt;Test of connection pool&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;%<br />
out.print("Start&lt;br/&gt;");<br />
try{<br />
InitialContext ctx = new InitialContext();<br />
javax.sql.DataSource connectionPool = (javax.sql.DataSource) ctx.lookup("java:comp/env/mytest_ds");<br />
Connection conn = connectionPool.getConnection();<br />
out.print("DB connection pool run OK!");<br />
conn.close();<br />
}<br />
catch(Exception ex){<br />
out.print(ex.getMessage());<br />
ex.printStackTrace();<br />
}<br />
%&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</div>
 <img src ="http://www.blogjava.net/CrazyJava/aggbug/162650.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-11-23 15:36 <a href="http://www.blogjava.net/CrazyJava/articles/162650.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat 6连接池设置</title><link>http://www.blogjava.net/CrazyJava/articles/162647.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Fri, 23 Nov 2007 07:29:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/162647.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/162647.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/162647.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/162647.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/162647.html</trackback:ping><description><![CDATA[<p>
<table style="table-layout: fixed">
    <tbody>
        <tr>
            <td>
            <div class="cnt">
            <p>前两天安装的Tomcat&nbsp;6，今天配置了连接池，可是运行总是报&nbsp;<span class="ArticleTitleText"><strong>Cannot&nbsp;create&nbsp;JDBC&nbsp;driver&nbsp;of&nbsp;class&nbsp;''&nbsp;for&nbsp;connect&nbsp;URL&nbsp;'null'</strong>&nbsp;的错误，以为是URL写错了，可是反复检查几遍，又改了另一种写法，还是一样的问题。上网查了下，Tomcat&nbsp;6的配置和以前的不同了，不推荐在server.xml中进行配置，而是在context.xml中进行配置才是更好的方法。是站点目录下的context.xml文件，不是tomcat_home\conf下的。<font size="2">tomcat_home\webapps\yourApp\META-INF\context.xml，我的网站目录中没有context.xml，于是创建一个，这样可以在不同的网站下单独配置连接池了，并且不需要重启Tomcat，Tomcat会自动重载。</font></span></p>
            <p><span class="ArticleTitleText"><font size="2">context.xml例：</font></span></p>
            <p><span class="ArticleTitleText">&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;<br />
            &lt;Context&nbsp;reloadable="true"&nbsp;crossContext="true"&gt;<br />
            &nbsp;&lt;!--&nbsp;Default&nbsp;set&nbsp;of&nbsp;monitored&nbsp;resources&nbsp;--&gt;<br />
            &nbsp;&lt;WatchedResource&gt;WEB-INF/web.xml&lt;/WatchedResource&gt;<br />
            &nbsp;&lt;!--&nbsp;Uncomment&nbsp;this&nbsp;to&nbsp;disable&nbsp;session&nbsp;persistence&nbsp;across&nbsp;Tomcat&nbsp;restarts&nbsp;--&gt;<br />
            &nbsp;&lt;!--<br />
            &nbsp;&nbsp;&lt;Manager&nbsp;pathname=""&nbsp;/&gt;<br />
            &nbsp;--&gt;<br />
            &nbsp;&lt;Resource&nbsp;<br />
            &nbsp;name="jdbc/nickol"&nbsp;<br />
            &nbsp;auth="Container"<br />
            &nbsp;type="javax.sql.DataSource"<br />
            &nbsp;driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"<br />
            &nbsp;url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=blog"<br />
            &nbsp;username="sa"<br />
            &nbsp;password="root"<br />
            &nbsp;maxActive="20"<br />
            &nbsp;maxIdle="10"<br />
            &nbsp;maxWait="-1"/&gt;<br />
            &lt;/Context&gt;</span></p>
            <p><span class="ArticleTitleText">重新打开页面，一切OK</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
</p>
<img src ="http://www.blogjava.net/CrazyJava/aggbug/162647.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-11-23 15:29 <a href="http://www.blogjava.net/CrazyJava/articles/162647.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>