﻿<?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-cmd-文章分类-server</title><link>http://www.blogjava.net/cmd/category/7528.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 05:54:07 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 05:54:07 GMT</pubDate><ttl>60</ttl><item><title>Jetty 源码分析</title><link>http://www.blogjava.net/cmd/articles/42217.html</link><dc:creator>静夜思</dc:creator><author>静夜思</author><pubDate>Thu, 20 Apr 2006 12:06:00 GMT</pubDate><guid>http://www.blogjava.net/cmd/articles/42217.html</guid><wfw:comment>http://www.blogjava.net/cmd/comments/42217.html</wfw:comment><comments>http://www.blogjava.net/cmd/articles/42217.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cmd/comments/commentRss/42217.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cmd/services/trackbacks/42217.html</trackback:ping><description><![CDATA[
		<table align="center" border="0" width="70%">
				<tbody>
						<tr>
								<td>
										<font size="2">一、 总括</font>
								</td>
						</tr>
						<tr>
								<td>
										<div align="left">
												<font size="2">     你了解Jetty 吗，就像我们所熟知的Tomcat一样, Jetty是一个免费的开放源码的100%纯Java的Http服务器和Servlet容器。 </font>
										</div>
								</td>
						</tr>
						<tr>
								<td>
										<p align="justify">
												<font size="2">     Jetty具备以下特点：</font>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<div align="left">
												<font size="2">     快速高效 </font>
										</div>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<font size="2">     。Jetty是最快的Servlet服务器之一</font>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     。Jetty可以处理上千个并发连接 </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     小巧嵌入 </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     。Jetty的jar只有600多K </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     。可动态嵌入到应用程序，适合开发web2.0等应用 </font>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<font size="2">     应用广泛</font>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<font size="2">     。开源项目有<a href="http://geronimo.apache.org/">Geronimo</a>, <a href="http://sourceforge.net/projects/jboss/">JBoss</a>, <a href="http://www.objectweb.org/jonas/index.html">JOnAS</a>等</font>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<font size="2">     。商业项目有IBM Tivoli, Sonic MQ and Cisco SESM等</font>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<font size="2">     可到Jetty网站<a href="http://jetty.mortbay.org/jetty/"> http://jetty.mortbay.org/jetty/</a> 查看最新信息</font>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     本文将通过对Jetty最新稳定版 Jetty5.1.5RC2 源码的研究，向读者展示Jetty在设计方面使用的不同设计理念, 希望对广大开发者在设计自己的系统时有所帮助。 </font>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<font size="2">     Jetty按照功能可以分为四个主个主要的部分,HttpServer,HttpContext,HttpHandler,HttpListener,详见如下类图:</font>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">
												<img alt="" src="http://blog.csdn.net/images/postpics/Architecture.jpg" height="610" width="726" />
										</font>
								</td>
						</tr>
						<tr>
								<td>
										<p align="center">
												<font size="2">&lt;图 1-1&gt;</font>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<font size="2"> </font>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">二、HttpServer及配置</font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2"> 
   对于初次接触Jetty的人一定会对上图感到迷惑，其实在Jetty中HttpServer是一个服务器的核心控制类,
我们可以看到，其它的组件类都是由该类扩展开来，HttpServer的作用就是在一系列的监听器类和处理器类之间搭起了一个桥梁,有效的控制着消息在系
统内的传递,如下图: </font>
								</td>
						</tr>
						<tr>
								<td>
										<div align="center">
												<font size="2">
														<img alt="" src="http://blog.csdn.net/images/postpics/HttpServer_Sequence.jpg" height="55" width="431" />
												</font>
										</div>
								</td>
						</tr>
						<tr>
								<td>
										<div align="center">
												<font size="2">&lt;图 1-2 &gt; </font>
										</div>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2"> 
   HttpServer职责是接受从HttpListener传递过来的request(请求),HttpServer通过对request的
Host(主机)或Path(路径)进行匹配,然后分发给相应的HttpContext(可以理解为一个web application)。</font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     这里举个例子，假设我们现在要建立一个提供静态页面web服务,页面内容在c:\root\下,可以通过如此配置HttpServer: </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     HttpServer server = new HttpServer(); // 创建一个新的HttpServer </font>
								</td>
						</tr>
						<tr>
								<td height="25">
										<font size="2">     SocketListener listener = new SocketListener(); // 创建一个新监听器 </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     listener.setPort(8080);// 设置监听端口为8080 </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     server.addListener(listener);// 将监听类注册到server中 </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     HttpContext context = new HttpContext(); // 创建一个新HttpContext </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     context.setContextPath("/app/*"); // 设置访问路径 </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     context.setResourceBase("c:/root/"); // 设置静态资源路径 </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     context.addHandler(new ResourceHandler()); // 为这个HttpContext添加一个静态资源处理器 </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     server.addContext(context); // 将这个HttpContext注册到server中 </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     server.start();// 最后启动这个server </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     当我们要建立一个提供动态页面web服务时, 假设我们自己的 web 应用放在Jetty目录下的webapps下并打好包文件名为myapp.war, 可以通过如此配置HttpServer: </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     Server server = new Server(); // 创建一个新的HttpServer </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     SocketListener listener = new SocketListener();// 创建一个新监听器 </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     listener.setPort(8080); // 设置监听端口为8080 </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     server.addListener(listener ); // 将监听类注册到server中 </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     server.addWebApplication("myapp","./webapps/myapp/"); // 将这个web应用注册到这个Server中 </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     server.start(); // 最后启动这个server </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     短短数行代码就可创建一个web服务器并启动它,这有点类似于我们windows中的即插即用的概念,需要什么就添加什么,把这些类以HttpServer为核心组合在一起，就可以完成强大的功能。</font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2"> </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">三、Jetty Server </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     1.上面我们探讨了HttpServer的启动,读者一定还存在这样疑问,整个Jetty服务器是怎样启动的？ </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2"> 
   首先我们可以在图 1-1
看到左下角有一个Server类,这个类实际上继承了HttpServer,当启动Jetty服务器时，具体来说，在Jetty根目录下命令行下如输入
java -jar start.jar etc/demo.xml，注意这里有一个配置文件demo.xml做为运行参数,这个参数也可以是其它的配置
文件,也可是多个xml配置文件，其实这个配置文件好比我们使用struts时的struts-config.xml文件，将运行Server需要用到的
组件写在里面，比如上一节中HttpServer的配置需要的组件类都可以写在这个配置文件中。 </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     2.我们自己部署到Jetty的webapps目录下的web application,Jetty如何运行我们自己的web application? </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2"> 
   首先当我们按上述方法启动Jetty
Server时,就会调用Server类里面的main方法,这个入口方法首先会构造一个Server类实例(其实也就构造了一个
HttpServer),创建实例过程中就会构造XmlConfiguration类的对象来读取参数配置文件，之后再由这个配置文件产生的
XmlConfiguration对象来配置这个Server,配置过程其实是运用Java的反射机制调用Server的方法并传入配置文件中所写的参数
来向这个Server添加HttpListener,HttpContext,HttpHandler,web
application(对应我们自己部署的web应用)。 </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     添加我们自己的web
application过程中相应的就会读取我们所熟知的/WEB-INF/web.xml来创建一个WebApplicationContext(这个
类继承了HttpContext)的实例,同时也会创建WebApplicationContext自身的ServletHandler(实现了
HttpHandler接口),注意到ServletHandler中包含一组ServletHolder指向实际的Servlet,譬如说我们在
web.xml文件中配置了两个Filter和一个Servlet,这里就会有三个ServletHolder,实际处理请求时
ServeletHandler就会依次调用这三个ServletHolder传入request,response处理(实际最后交给这两个
Filter和Servlet处理),这样我们自己做好的一个
web应用就挂载到这个Server上了,可以接受客户端相应的request(请求)。 </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2"> </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">四、运行原理(请参考如下时序图) </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">
												<img alt="" src="http://blog.csdn.net/images/postpics/work_sequence.jpg" height="587" width="720" />
										</font>
								</td>
						</tr>
						<tr>
								<td>
										<p align="center">
												<font size="2">&lt;图 1-7 &gt;</font>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<font size="2"> 
   上图展示了一个request的处理过程,首先HttpListener监听到客户端发来的请求创建一个HttpConnection实例(封装了
连接细节,比如从Socket连接中获取的输入流和输出流),
HttpConnection对象构建过程中会创建Jetty内部自定义的HttpRequest和HttpResponse对象,接着
HttpListener会调用这个HttpConnection实例的handle方法,
HttpConnection实例就调用HttpRequest对象的read()方法读取信息,调用HttpServer的service方法以
HttpRequest,HttpResponse为参数传给HttpServer,HttpServer又将HttpRequest和
HttpResponse分发给相应的HttpCotext,HttpContext最后将HttpRequest和HttpResponse交给自身的
HttpHandler
处理,在这里HttpRequest,HttpResponse被再次封装为ServletHttpRequest和
ServletHttpResponse,其实这两个类实现了我们所熟知的HttpServletRequest和
HttpServletResponse接口。</font>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2"> </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">五、高级性能 </font>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<font size="2">     1.HttpHandler:</font>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     该接口的实现类用于处理HttpContext分发过来的reqeust,不同的实现类的有不同的处理功能,这里介绍几常用的HttpHandler实现类: </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     ReourceHandler:用于处理静态内容,如以扩展名为.html的文件 </font>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<font size="2">     SecurityHandler:提供基本的安全验证</font>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<font size="2">     ForwardHandler:转发一个request到另一个url</font>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     ServletHandler:用于将request交由具体的Servlet类进行处理 </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2"> 
   2.当你在看图 1-2
时候会注意到HttpServer和HttpListener,HttpServer与HttpContext，HttpContext与
HttpHandler存在一对多的关系,下面就介绍一下它们之间的这种关系如何通过程序来配置. </font>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<font size="2">     HttpListener &amp; HttpServer:</font>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<font size="2"> 
   HttpListener是所有监听器类的接口,如图中的SocketListener(基于传统的Socket技术)就实现了该接口,Jetty
还有其它的实现该接口类,如SocketChannelListener(基于NIO技术)类等,HttpListener职责主要是在服务器启动后监听
相应端口的来自客户端请求并建立连接(图 1-1
中所示用HttpConnection封装连接细节),监听器可在同个IP上开启多个端口为同一个HttpServer
进行监听,所以HttpListener和HttpServer是多对一的关系,如下图:</font>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<div align="center">
												<font size="2">
														<img alt="" src="http://blog.csdn.net/images/postpics/multi_listener.jpg" height="174" width="524" />
												</font>
										</div>
								</td>
						</tr>
						<tr>
								<td>
										<p align="center">
												<font size="2">&lt;图 1-3 &gt;</font>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     配置代码：</font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     HttpServer server = new HttpServer(); </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     HttpListenrer listener1 = new SocketChanneListener(); </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     Listener1.setPort(8080); </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     HttpListenrer listener1 = new SocketListener(); </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     Listener1.setPort(8443); </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     server.addListener(listener1); </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     server.addListener(listener2); </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2"> </font>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<font size="2">     HttpContext &amp; HttpHandler:</font>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<font size="2"> 
   HttpContext相当于对应客户端请求的URL或某个虚拟机, 其子类中包含若干个HttpHandler,
当接受到request(请求)时,HttpContext会依次(按某个预定的次序)把request交给这些HttpHandler处理,直到这个
request被标示处理过为止,
需要注意的是这个request可能被多个HttpHandler处理，但只能有一个HttpHandler能标示这个request已被处理过.</font>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     一个典型的HttpContext有用于安全处理、静态资源处理及Servlet类的HttpHandler,如下图: </font>
								</td>
						</tr>
						<tr>
								<td>
										<div align="center">
												<font size="2">
														<img alt="" src="http://blog.csdn.net/images/postpics/Typical_HttpContext.jpg" height="195" width="447" />
												</font>
										</div>
								</td>
						</tr>
						<tr>
								<td>
										<div align="center">
												<font size="2">&lt;图 1-4&gt; </font>
										</div>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     配置代码：</font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     HttpContext context = new HttpContext(); </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     context.setContextPath(“/myapp/*”); </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     HttpHandler securitHandler = new SecurityHandler(); </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     HttpHandler resourceHandler = new ResourceHandler(); </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     HttpHandler servletHandler = new ServletHandler(); </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     context.addHandler(securitHandler); </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     context.addHandler(resourceHandler); </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     context.addHandler(servletHandler); </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2"> </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     HttpServer &amp; HttpContext: </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     一般的HTTP服务器软件可以同时处理多个web application,同样一个HttpServer可以包含多个HttpContext,如下图可以通过同一个端口的监听类来映射多个HttpContext: </font>
								</td>
						</tr>
						<tr>
								<td>
										<div align="center">
												<font size="2">
														<img alt="" src="http://blog.csdn.net/images/postpics/one_port_multi_HttpContext.jpg" height="170" width="450" />
												</font>
										</div>
								</td>
						</tr>
						<tr>
								<td>
										<p align="center">
												<font size="2">&lt;图 1-5 &gt;</font>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     配置代码：</font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     HttpServer server = new HttpServer(); </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     HttpContext context1 = new HttpContext(); </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     context1.setContextPath(“/app1/*”); </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     HttpContext context2 = new HttpContext(); </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     context2.setContextPath(“/app2/*”); </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     server.addContext(context1); </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">  </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     HttpServer &amp; HttpLister &amp; HttpContext: </font>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<font size="2">     另外Jetty对多网卡（多个IP地址,不同的主机名）的服务器也提供了很好的支持,每个HttpContext都有自身的HttpServer:</font>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<div align="center">
												<font size="2">
														<img alt="" src="http://blog.csdn.net/images/postpics/multi_hosts_multi_context.jpg" />
												</font>
										</div>
								</td>
						</tr>
						<tr>
								<td>
										<p align="center">
												<font size="2">&lt;图 1-6 &gt;</font>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     配置代码：</font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     HttpServer server1 = new HttpServer(); </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     SocketListener listener1 = new SocketListener(); </font>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<font size="2">     listener1.setHost(“www.app1.com”);//orListener1.setHost(“www.app2.com”)</font>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<font size="2">     listener2.setPort(80);</font>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<font size="2">     HttpContext context1 = new HttpContext();</font>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<font size="2">     context1.setContextPath(“/”);</font>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     server1.addListener(listener1); </font>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<font size="2">     server1.addContext(context1);</font>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">  </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">     3.Jetty对高并发的支持 </font>
								</td>
						</tr>
						<tr>
								<td>
										<div align="center">
												<font size="2">
														<img alt="" src="http://blog.csdn.net/images/postpics/jetty_ThreadPool.jpg" height="168" width="378" />
												</font>
										</div>
								</td>
						</tr>
						<tr>
								<td>
										<div align="center">
												<font size="2">&lt;图 1-8&gt; </font>
										</div>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2"> 
   如果多用户请求服务就会涉及到多线程的管理，如图
1-8,Jetty中主要由ThreadPool负责管理多线程，注意其中Pool.PondLife是Pool的一个内部接口,
ThreadPool.PoolThread是ThreadPool的一个内部线程类,我们看到Pool.PondLife和Pool存在一个聚集的关
系，实际上Pool对象中存放在是一个个ThreadPool.PoolThread线程对象，当有新用户连接上Server时，ThreadPool就
从Pool中取一个空闲的线程为当前用户连接服务。 </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2"> </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">六、小结 </font>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<font size="2"> 
   本文通过图示简要介绍了Jetty整个体系架构和主要的组件类及服务器的启动执行过程,其实Jetty 通常被用来做为内嵌的Web
Server来使用，一些常见的服务器软件，如Apache Cocoon、JBoss
,JOnAs等都会采用Jetty作为Web解決方案；另外由于Jetty在性能及稳定性要优于同类HTTP
Server的原因，Jetty已在国外已很流行,鉴于这一点,本文作者可以预测在不久的将来Jetty同样也会在国内流行开来。</font>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2"> </font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">附：</font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">作者联系方式：陈应刚 <a href="mailto:dycyg@yahoo.com">dycyg@yahoo.com</a> 熊红阳 <a href="mailto:eastbear@126.com">eastbear@126.com</a></font>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/cmd/aggbug/42217.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cmd/" target="_blank">静夜思</a> 2006-04-20 20:06 <a href="http://www.blogjava.net/cmd/articles/42217.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IBM Websphere Portal 主题与皮肤开发</title><link>http://www.blogjava.net/cmd/articles/32106.html</link><dc:creator>静夜思</dc:creator><author>静夜思</author><pubDate>Thu, 23 Feb 2006 07:37:00 GMT</pubDate><guid>http://www.blogjava.net/cmd/articles/32106.html</guid><wfw:comment>http://www.blogjava.net/cmd/comments/32106.html</wfw:comment><comments>http://www.blogjava.net/cmd/articles/32106.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cmd/comments/commentRss/32106.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cmd/services/trackbacks/32106.html</trackback:ping><description><![CDATA[<font size="2"><span class="bright-message-list"><span class="bright-message-list">内容简介：<br>Portal
的主题与皮肤开发说穿了还是普通jsp的开发，只不过大量使用了ibm自带的标签库，开发起来显得比较麻烦。但是，如果您深刻洞悉了与主题、皮肤相关的这
几个文件之间的调用关系，使用起来就能运用自如了。这里是作者从大量的项目经验中总结出的几点体会，贡献出来，希望与大大家分享。<br>在这篇文章里我想从以下几个方面来介绍websphere portal的主题与皮肤开发：<br>1、初级入门：什么是Portal的主题与皮肤开发？<br>2、中级开发：如何更换Portal系统的logo图标；<br>3、中级进阶：开发个性化的主题；<br>4、高级探索：开发自适应分辨率的主题与皮肤；<br>5、高手过招：更改Portal系统的登录方式；<br>6、Portal的皮肤开发简介。<br><br>一、初级入门：Portal的主题与皮肤开发：<br><br>要
了解如何开发portal的主题，首先要了解websphere portal的显示流程。IBM WebSphere Portal 使用不同的
Java Server Page（JSP）、级联样式表（Cascading Style
Sheet，CSS）和图像来显示门户页面。它使用位于X:\WebSphere\AppServer\installedApps\
YourComputerName \wps.ear\wps.war 目录下 themes、skins 和 screens 目录中的 JSP
来构造门户页面。这些目录中的每一个都包含 html、wml 和 chtml 子目录，WebSphere Portal
将它们用于服务不同客户机，例如桌面浏览器和移动设备。我们这里以通常使用的html方式下的主题开发为例，介绍Portal的主题开发。 <br><br>用
于显示门户页面的 JSP 流程：本文描述了缺省主题定义的 Default.jsp、Head.jsp
、AdminLinkBarInclude.jsp、
ToolBarInclude.jsp、PlaceBarInclude.jsp、PageBarInclude.js以及延伸出来的
PageBeginInclude.jsp、
PageEndInclude.jsp的内容和流程。下面简单介绍这几个jsp。注意：这部分内容属于最初级的开发，您要弄懂这些介绍，必须具备一定的
jsp基础、css基础和标签库的基础，最好做过相应的开发。<br>1、Default.jsp：<br>所有屏幕聚集都从 Default.jsp
开始。用于缺省主题的 Default.jsp 位于wp_root\app\wps.ear\wps.war\themes\html。这个 JSP
包含其它用于显示标题、公司徽标、工具栏的 JSP 以及用于往可用位置及页面植入内容的 JSP。在 Default.jsp
的末尾处，screenRender JSP 标记选择被请求的屏幕（例如 login 或
forgotpassword）。以下介绍的jsp是以这样的顺序先后调用的。<br>2、Head.jsp<br>Head.jsp
生成标题并嵌入指向样式表文件的链接。它还定义了支持 BIDI（双向）文本所需的变量。这个 JSP
的内容将在这里描述。您也可以通过&lt;title&gt;&lt;/title&gt;在这里定死portal网站的标题，这比IBM公布的以标签的
方式写来的容易，也更易使用。如果您开发了多套主题，而且这几套主题的page
title如果也一样的话（除了虚拟门户，一般是这样子），您可以把这几个文件放到themes/html的根目录下，其他主题的default.jsp
都来调用这个文件就可以了。<br><br>3、AdminLinkBarInclude.jsp<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AdminLinkBarInclude.jsp主要用来显示了“新建页面”、“编辑页面”、“分配页面许可权”三个标签<br>4、ToolBarInclude.jsp<br>ToolBarInclude.jsp
显示欢迎消息以及为用户提供的链接工具栏。门户网站上显示什么样的链接工具栏取决于用户上下文。例如，登录的用户看到“我的门户网站”、“管理”（尽管理
员可见）、“编辑我的‘概要文件’”、“注销”等之类的链接；而注销的用户看到 “忘记密码”、“登录”、“帮助” 之类的链接。<br>5、PlaceBarInclude.jsp<br>PlaceBarInclude.jsp
用来显示一级菜单，即“首页”、“文档管理器”、“公司概况”、“业务简介”等，属于最高层的目录，您在任何一个一级菜单上都可以通过“新建页面”来创建
二级菜单，你创建的内容将被存储到数据库（原始使用的是cloundscape），您也可以把它倒入到db2、oracle等任何一个portal所支持
的数据库中，此内容将在我的下一篇文章中详细论述，这里不再一一提及。<br><br>6、PageBarInclude.jsp<br>用来显示二级菜单，当您点击一级菜单中的任一标签时，系统会调用该文件，并检索出该菜单的所有子菜单，默认显示在PlaceBar的下面。<br><br>二、中级开发：如何更换Portal系统的logo图标；<br>1、Default.jsp的工作原理：<br> <br><br> 我们看这个例子，Default.jsp大致上将Portal系统的默认页面划分为这样一个表格：<br><br>表-1： Default.jsp总体调用效果<br><br>PageBegin: 用来显示页面生成以前的提示文字，例如：Portal系统正在加载，请稍候……<br>Portal系统主体部分：用来显示详细的Portal页面；<br>PageEnd.jsp用来显示页面生成以后的东西。例如公司版权信息等。<br><br>表-2：Portal系统正文部分的调用关系：<br>徽标部分，在default中调用	我的门户菜单，在ToolBar中调用<br>个性化菜单，在AdminLink中调用<br><br>Portal的Body部分，用来显示各个portlet以及高层次的三级菜单。<br>页面的结尾，用来显示公司版权信息等。<br>&nbsp;&nbsp; <br><br>2、换一个logo：<br>&nbsp; 打开Default.jsp，您会开到一个表格，在表格的左上角，有这样一段语句，用来显示默认主题的Logo徽标：<br><br>&lt;td&nbsp; width="100%" valign="top" align="&lt;%=bidiAlignLeft%&gt;" nowrap&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&lt;img align="absmiddle" alt='&lt;wps:text key="title"
bundle="nls.engine"&gt;Portal Title&lt;/wps:text&gt;'
title='&lt;wps:text key="title" bundle="nls.engine"/&gt;'
src='&lt;wps:urlFindInTheme file="logo.gif"/&gt;'&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&lt;a href="#wpsMainContent"&gt;&lt;img width="1" height="1" border="0"
src='&lt;%= wpsBaseURL %&gt;/images/dot.gif' alt='&lt;wps:text
key="link.skiptocontent" bundle="nls.engine"/&gt;' title='&lt;wps:text
key="link.skiptocontent" bundle="nls.engine"/&gt;'&gt;<br>&lt;/a&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/td&gt;<br>&nbsp;&nbsp;
上面已经介绍过，整个Portal系统的页面由Default.jsp分割成一个大的表格，用来显示或者调用不同的jsp。我们在这个大表格的最左上角化
出一个&lt;td&gt;,用来显示公司的徽标。这段语句就是在这个单元格内插入一个图片，叫做Logo.gif。<br>明白了吗？您可以将这个文件
名改称您想插入的任意一张图片的名字，只要将这张图片放到.war/images/目录下就可以了。这里支持几乎所有的图片格式，您可以任意摆放，大小、
位置等都有您说了算。到这里，您可能已经想到了：那么，我养插入一个Flash呢？别着急，下面将会提到这点。<br>3、用flash作logo：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
用Flash作徽标是个不错的注意，它可以使您的门户网站看起来更丰富、生动一些。但是，Flash，也就是.swf格式的文件，是不能直接通过这种方式
来插入的，因为我们的浏览器并不能识别它。要插入一个动画，必须位置制定相应的驱动。您可以用以下这段代码，为之生成：<br><br>&lt;td width="510"&nbsp; border="0" cellpadding="0" cellspacing="0" height="81" valign="middle" align="left"&gt;<br>&lt;object
classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"&nbsp;
codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0"&nbsp;
width="510" height="81"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name=movie value="&lt;%= wpsBaseURL&nbsp; %&gt;/images/firstpagelogo.swf"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name=quality value=high&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&lt;embed src="firstpagelogo.swf" quality=high&nbsp;
pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"&nbsp;
type="application/x-shockwave-flash" width="510" height="81"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/embed&gt;<br>&lt;/object&gt;<br>&lt;/td&gt;<br><br>这里在插入了一个名字为firstpagelogo.swf的影片做公司徽标，他的大小是 510*81，请将这个影片文件放在.war/images目录下，重启服务器，看看您的首页上，是不是已经出现了？<br><br>三、中级进阶：开发个性化的Portal主题<br>1、理解、开发各级菜单；<br>Default.jsp
调用PlaceBarInclude.jsp文件来显示一级菜单，如果一级菜单下面还有二级菜单，那么当您点击该一级菜单是，Default将调用
PageBarInclude.jsp来显示二级菜单。当然，您也可以不再调用该文件，那么系统将缺省调用Portlet的皮肤里面的
LayerContainer.jsp文件，用来以三级菜单代替二级菜单，这便是个性化的左侧管理菜单。<br>打开这两个文件，您会发现里面的内容非常简单。请看下面的清单：<br>l	首先由这样一个标签：<br>&lt;wps:if navigationAvailable="yes" screen="Home,LoggedIn,LoggedOut"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 意思是如果菜单时可用的，那么当您登录进去以后将执行如下操作。使用这句代码，必须引入Portal的标签库，具体的过程这里不再赘述。接下来绘制了一个表格，用来显示里面的操作。表格内的内容，下面将作介绍。<br>l
菜单的左右协调：如果您一共定义了十几个一级菜单，而一栏只能显示8个，剩下的菜单怎么办？我们在这里放置了两个三角形的小图标，如果右边还有更多的菜
单，小图标会自动出现，当您点击时，就会显示出剩余的菜单。&nbsp;
具体的代码是通用的，这里不再赘述。我们需要强调的是：菜单条在这里支划分为两种情况：一是选中的情况下，一是为选中的情况下，即：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wps:if nodeInSelectionPath="yes"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;table&gt;这里用来显示选中该菜单的情况下该菜单条的显示方式。&lt;/table&gt;<br>&lt;/wps:if&gt;<br>&lt;wps:if nodeInSelectionPath="no"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;table&gt;这里用来显示未选中该菜单的情况下该菜单条的显示方式。&lt;/table&gt;<br>&lt;/wps:if&gt;<br>例如：<br>&lt;td&nbsp; Background="&lt;%= wpsBaseURL %&gt;/images/title_back01.jpg" height="30"&gt;								<br>	&nbsp;&nbsp; &lt;img&nbsp; border="0" src='&lt;%= wpsBaseURL %&gt;/images/b01.jpg' alt=""&gt;<br>&lt;a href='&lt;%=wpsNavModelUtil.createSelectionChangeURL(wpsNavNode)%&gt;' class="wpsSelectedPlaceLink"&gt;<br>&lt;%=
com.ibm.wps.model.LocaleHelper.getTitle((com.ibm.portal.Localized)wpsNavNode,
com.ibm.wps.engine.RunData.from(
pageContext.getRequest()).getLocale())%&gt; <br>			&nbsp; &lt;/a&gt;<br>&lt;img&nbsp; border="0" src='&lt;%= wpsBaseURL %&gt;/images/b01.jpg' alt=""&gt;<br>&lt;/td&gt;<br> 我们首选添加一张背景图片，然后左侧放一张前缀，中间打印该菜单条的名字，后面又放一张图片做后缀，这样整个菜单条看起来就非常漂亮了。<br>l	接下来是显示工具栏的情况下：<br>&lt;wps:if
showTools="yes"&gt;这里的操作将使具有权限的用户通过点击这张图片，直接编辑相应的portal页面。不过据笔者的开发经验，大部分
的用户会隐藏掉这个入口，以免引起管理上的混乱，具体的开发内容将在以后的文章中提及，智利将不再详细介绍。<br>l	最后的代码用来显示系统收藏夹：<br>当您登录后，会发现在一级菜单的最右边多出一个“我的最爱”的东西，这是portal系统自带的收藏夹，您可以通过这个入口将自己喜欢的页面添加到您的收藏夹，然后您就可以通过点击这里直接进入到你收藏的页面了。<br> <br> <br>2、开发个性化工具栏<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要获得个性化的工具栏，您可以修改ToolBarInclude.jsp这个文件。这个文件提供了Portal管理员进到管理界面的入口。<br>在这里你可以编辑自己的“概要文件”，就个人的用户信息，修改自己的姓名、密码等。更深一层的话，您可以在这里显示欢迎信息，例如张三同志登录后，会打印出：“欢迎您，张三同志！”的语句。要实现这个功能实际上非常简单，请看：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;font color="#FF0000" size="5"&gt;&lt;strong&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wps:if loggedIn="yes" screen="Home,LoggedIn"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wps:text key="welcome" bundle="nls.engine"&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; &lt;wps:textParam&gt;&lt;wps:user attribute="givenName"/&gt;&lt;/wps:textParam&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; &lt;wps:textParam&gt;&lt;wps:user attribute="familyName"/&gt;&lt;/wps:textParam&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/wps:text&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/wps:if&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/font&gt;<br>当然，您需要引入相应的标签库，具体的应用属于普通的jsp开发，您可以参照平常的开发经验去实现。<br>3、开发个性化的管理标签<br>&nbsp;&nbsp;&nbsp;&nbsp; 所谓的个性化指的是，您可以删掉管理标签的一个或者多个，也可以根据喜好添加自己需要的标签。这需要您来修改AdminLinkBarInclude.jsp文件。例如：<br>&lt;td&nbsp; valign="middle" align="&lt;%=bidiAlignRight%&gt;" nowrap&gt;<br>			&nbsp;&nbsp;&nbsp; &lt;a href="&lt;% wpsURL.write(out); %&gt;" class="wpsLinkBarLink"&gt;<br>				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wps:text key="link.createpage" bundle="nls.engine"/&gt;<br>				&lt;/a&gt;<br>		&nbsp;&nbsp; &lt;/td&gt;<br>&nbsp;&nbsp;&nbsp; 这段代码用来显示“新建页面”的管理标签，通过电机这个标签，您可以为当前页面创建一个子页面。同理，您可以个性化“编辑页面”和“分配页面权限”，当然，您也可以之间隐藏掉这个入口。<br><br>四、高级探索：开发自适应分辨率的主题与皮肤<br>1、开发1024下的主题<br>&nbsp;&nbsp;&nbsp;&nbsp;
刚安装完Portal系统后，刚才介绍的几个jsp会在默认的.war/theme目录下，您可以新建一个文件夹，将这几个jsp文件拷贝至该目录下，然
后在管理界面下添加该主题。该主题默认下就是1024的。您可以开发多套主题，注意：请充分利用一些公共的资源，例如这些主题可能使用的是同样的版权信
息，这样，您可以将PageEnd.jsp页面放到themes/entention下，然后让所有的主题调用这个文件。<br>当然，为了保险起见，您可以在Default.jsp最外层的表格中这样写死：<br>&nbsp;&nbsp; &lt;table&gt;<br>&lt;tr&gt;<br>&lt;td width=”1024”&gt; <br>具体的调用！<br>&lt;/td&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/table&gt;<br><br>2、开发800分辨率下的主题<br>&nbsp;&nbsp;&nbsp;&nbsp; 开发800下的主题说穿了非常简单，您可以会出这么一个表格：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;table&gt;<br>&lt;tr&gt;<br>&lt;td&gt;&amp;nbsp;&lt;/td&gt;<br>&lt;td width=”800” align=”center” valign=”top”&gt;<br>&nbsp;&nbsp; 将Default.jsp中最外层的table里面所有的内容拷贝到这里！<br>&lt;/td&gt;<br>&lt;td&gt;&amp;nbsp;&lt;/td&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/table&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将这个表格覆盖到原来Default.jsp文件中最外层的表格就可以了。注意：在default.jsp中调用的各个文件中，可能都有表格存在，如果这些表格中有的宽度超过了800，或者两个并列一行的表格宽度超过了800，请适当调小。<br>3、开发1024和800下自适应得主题<br>&nbsp;&nbsp;&nbsp;&nbsp; 要开发自适应的主题就更简单了！请设定一个变量w,先写一个JavaScript，用来读取客户端的浏览器分辨率，如果是800的，则给给变量赋值w=800，反之如果是1024的，就给赋值为w=1024。剩下的事，不用我说了吧！<br>五、高手过招：更改Portal系统的登录方式；<br> 1、从首页上登录<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 您需要用wsad开发一个portlet，并在jsp中写一个代理，将用户凭证提交给系统自带的认证action中。这个portlet可以这样来设计：<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;wps:if loggedIn="no"&gt;&nbsp; //如果没有登陆的情况下，提醒用户输入它的用户名与密码：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/wps:if&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; 用户按下“登录“后，将用户名和密码提交到系统自带的action中：<br>&lt;form method="POST" action='/wps/portal/!ut/p/.cmd/li' enctype="application/x-www-form-urlencoded" name="LoginPage"&gt;<br>&nbsp;&nbsp;&nbsp; //在这里将用户名和密码付给系统自带的登录框。<br>&lt;/form&gt;<br>&lt;wps:if loggedIn="yes"&gt;&nbsp; //如果已经登陆了，可以显示用户的常用信息，比如，读取用户的Lotus邮箱，然后显示他哟年级封邮件等：<br>&nbsp;&nbsp; <br> 甚至，您可以利用url-mapping自定义几个页面，从首页上直接进入到您的业务系统（如上）。<br>&nbsp;
这样的话，您甚至可以封死portal页面右上角自带的“登录”标签，也许您会问我又想用系统自带的页面呢？没关系，您也可以在浏览器中输入：http:
//machinename:9081/wps/myportal，当然，干脆您直接输入一个错误的用户名和密码，系统自然后带您会带系统自带的页面了。<br> 2、拒绝从系统自带的登录界面<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但是在上面这种情况下，可能会出现这种情况：当用户名或者密码错误的时候，系统会返回到系统自带的登录框上面，为避免这种情况，您可以封死这个开关。这个非常简单，我在这里顺便一提：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 系统自带的登录页面是.war/screen/html下的login.jsp文件，您可以删掉该文件里的所有内容，然后加入这么一句：<br>&lt;script language="JavaScript"&gt;<br>&nbsp;&nbsp;&nbsp; alert("用户名或者密码输入有误，请重新输入！");<br>&nbsp;&nbsp;&nbsp; window.location='http://xxjsb-scdd2.portal.com:9081/wps/portal';<br>&lt;/Script&gt;<br> 呵呵，是不是带您又回到了首页呢？是的，确实如您所想，这样就封死了系统自带的登录页面。如果您的用户名和者密码错误，或者您通过myportal直接调用，都不起作用了吧！系统会带您回到首页的登录界面，请重新输入！&nbsp;&nbsp; <br><br> 3、遗留问题：<br>&nbsp;&nbsp; 在实际开发中，您也许会发现还有其他一些意想不到的问题，是的，这个地方确实有许多值得注意的地方，也许只有您亲自来试过了，才知道其中的玄机。我也希望在开发中大家相互交流，把发现的好地方贡献出来，大家一起分享。好吧，祝您成功！<br> <br>六．主体开发的调试<br>调试主题与皮肤一般采用两种方法，一是修改reload，一是复制法： <br><br>1、
修改reload法。我们知道，portal系统的主题一切都是从default.jsp聚焦的，在通常的应用服务器上都有一个reload开关，用以控
制服务器是否自动更新，ibm websphere
portal也不例外。如果我们打开这个开关（这个开关您可以打开was,在管理控制台里面设定，完了还有重启一下机器），并设定了reload的时间，
那么每个一个时间段，系统会自动读取主题与皮肤文件。换言之，只有我们把这个时间差设的足够小，就能立刻观察到我们的修改结果。（在这里要注意一种情况：
就是既然是从default.jsp开始聚焦，那么，如果您修改了由default.jsp调用的别的文件比如说BeginPage.jsp，而单单没有
修改default.jsp的话，系统会默认您没有做任何修改，所以也就没有任何改动了）同时我也想声明一点，这种做法带来的系统开销特别大，只可是用于
开发环境，在生产环境中是万万不可的！<br><br>2、复制主题或皮肤法：如果您对某一主题做了部分修改，可以复制一下这个文件夹并换个名字，然后添加这个主题到系统并配置给相应的页面。第一次安装的新主题，当然后重新编译了。看得出来这种方法比较不方便，只适用于特殊情况。 <br>我经常使用的就是这两种了，大家在开发中有什么好的注意，可以在这里交流。<br><br>七、Portal的皮肤开发简介<br>1、该改portlet的标题背景图片<br>&nbsp;&nbsp;&nbsp;&nbsp; 非常简单，请找到.war/skin/html下，发现系统已经呆了好几套皮肤，打开其中任意一个文件夹，您都能发现这个文件：<br>Control.jsp。
这里面也是一个table。该table有两行：第一行用来显示portlet的标题，后面是最大化、最小化、编辑按钮；第二行是portlet的
body，用来显示portlet的内容。要换掉portlet标题的背景图片其实非常简单：在第一个&lt;td&gt;里面加上这么一句代码：<br>&nbsp;&nbsp;&nbsp;
&lt;td width="100%" height="21" border="0" cellpadding="0"
cellspacing="0" background='&lt;wps:urlFindInSkin
file="wave.jpg"/&gt;'&gt;<br>&nbsp;&nbsp;&nbsp; 一切OK！<br>2、隐藏掉“最大化”、“最小化”、“还原”等图标。<br>&lt;wps:portletMinimize&gt;<br>					&nbsp; &lt;a href='&lt;%=wpsPortletMinimizeURL%&gt;'&gt;&lt;/a&gt;<br>			&nbsp;&nbsp;&nbsp; &lt;/wps:portletMinimize&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这段代码是用来显示“最小化”按钮，不用说，直接去掉就行了！同理，您可以对此做任何编辑。<br>3、高级：加入个性化的左侧管理菜单<br>在skin目录下看到这个文件了吗？LayeredContainer.jsp不错，就是它，它是一个表格：<br>&lt;table border="0" cellpadding="0" cellspacing="0" width="778" height="100%"&gt;<br>该
表格左侧就是三级菜单（您如果再Default.jsp中部调用PageBar的话，这就是二级菜单了）。右边呢，则是整个Portal系统得Body部
分，显示了所有的portlet。不晓得IBM为什么要这样安排，似乎有点不合理。不过，趋势是在这里修改的，可能是把它看作一个容器了吧！在左侧的表格
部分，您可以向编辑普通的网页一样，只要您稍微有些美工知识，就可以随心所欲的制作出个性化的管理菜单了。<br>4、高级：与CSS结合，开发出漂亮的效果。<br> <br><br>看上面的效果，是不是非常漂亮？其实这很简单，看LayeredContainer.jsp这个文件，下面是他的表格，稍微加一些CSS，就能实现这种效果了。如：<br>&lt;table border="2" bordercolor="#ffffff" cellpadding="0" cellspacing="0" &lt;%=tableHeight%&gt; width="100%" &gt;。<br>当然，这需要素质比较高的美工配合，也需要工程师在长期的开发中仔细琢磨。再次祝您在Portal开发中信手拈来、出神入化！<br> <br><br>参考资料：<br>1、
Sukumar Konduru 顾问软件工程师 达拉斯，IBM Developer Technical Support Center
先生的论文：了解 WebSphere 门户网站如何显示门户页面 — 第 I 部分：描述 Default.jsp、Head.jsp 和
ToolBarInclude.jsp<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、IBM系列红皮书。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>致谢：<br>作者在开发及写作中得到了赵建业先生的大力帮助，IBM公司李女士、王女士，曹先生、丁先生、陈先生、胡先生的大力帮助，在此一并鸣谢。<br><br>作
者简介：郑文平，北京东华合创数码科技公司软件工程师，Portal信息化专员，长期从事Portal（尤其是IBM Websphere
Portal）开发，曾参与并引领了北京驰普企业门户、山东新汶矿务局远程调度系统、中国石化齐鲁公司综合数据平台、北京供电局等多个Portal项目的
开发。</span></span></font><img src ="http://www.blogjava.net/cmd/aggbug/32106.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cmd/" target="_blank">静夜思</a> 2006-02-23 15:37 <a href="http://www.blogjava.net/cmd/articles/32106.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat配置技巧Top 10</title><link>http://www.blogjava.net/cmd/articles/31202.html</link><dc:creator>静夜思</dc:creator><author>静夜思</author><pubDate>Fri, 17 Feb 2006 06:57:00 GMT</pubDate><guid>http://www.blogjava.net/cmd/articles/31202.html</guid><wfw:comment>http://www.blogjava.net/cmd/comments/31202.html</wfw:comment><comments>http://www.blogjava.net/cmd/articles/31202.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cmd/comments/commentRss/31202.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cmd/services/trackbacks/31202.html</trackback:ping><description><![CDATA[<font size="2">
编者按：现在开发Java Web应用，建立和部署Web内容是一件很简单的工作。使用Jakarta Tomcat作为Servlet和JSP容器的人已经遍及全世界。Tomcat具有免费、跨平台等诸多特性，并且更新得很快，现在非常的流行。<br><br>
你所需要做的就是：按照你的需求配置Tomcat，只要你正确配置，Tomcat一般都能适合你的要求。下面是一系列关于Tomcat的配置技巧，这些技巧源自于我的书：《Tomcat权威指南》，希望对你有所帮助。—— Jason Brittain<br><br><b>
1．	配置系统管理（Admin Web Application）</b><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 文件中。你编辑这个文件，添加一个名叫“admin”的role 到该文件中，如下：<br><br>
&lt;role name="admin"/&gt;<br><br>
你同样需要有一个用户，并且这个用户的角色是“admin”。象存在的用户那样，添加一个用户（改变密码使其更加安全）：<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框架。一旦你作为“admin”角色的用户登录管理界面，你将能够使用这个管理界面配置Tomcat。<br><br><b>
2．配置应用管理（Manager Web Application）</b><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文件中。接下来，编辑这个文件，添加一个名为“manager”的角色到该文件中：<br><br>
&lt;role name=”manager”&gt;<br><br>
你同样需要有一个角色为“manager”的用户。像已经存在的用户那样，添加一个新用户（改变密码使其更加安全）：<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下，为了测试这个应用，我们可以这么做，在第一个文件框中输入“/hello”（作为访问时的path），在第二个文本框中输入“file:
/home/user/hello”（作为Config URL）。<br><br>
Manager
application还允许你停止、重新启动、移除以及重新部署一个web应用。停止一个应用使其无法被访问，当有用户尝试访问这个被停止的应用时，将
看到一个503的错误——“503 - This application is not currently available”。<br><br>
移除一个web应用，只是指从Tomcat的运行拷贝中删除了该应用，如果你重新启动Tomcat，被删除的应用将再次出现（也就是说，移除并不是指从硬盘上删除）。<br><br><b>
3．部署一个web应用</b><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目录下即可，文件必须以“.war”作
为扩展名。一旦Tomcat监听到这个文件，它将（缺省的）解开该文件包作为一个子目录，并以WAR文件的文件名作为子目录的名字。接下来，Tomcat
将在内存中建立一个context，就好象你在server.xml文件里建立一样。当然，其他必需的内容，将从server.xml中的
DefaultContext获得。<br><br>
部署web应用的另一种方式是写一个Context
XML片断文件，然后把该文件拷贝到CATALINA_BASE/webapps目录下。一个Context片断并非一个完整的XML文件，而只是一个
context元素，以及对该应用的相应描述。这种片断文件就像是从server.xml中切取出来的context元素一样，所以这种片断被命名为
“context片断”。<br><br>
举个例子，如果我们想部署一个名叫MyWebApp.war的应用，该应用使用realm作为访问控制方式，我们可以使用下面这个片断：<br><br>
&lt;!-- &nbsp;<br>
 &nbsp;Context fragment for deploying MyWebApp.war &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>
 &nbsp;&lt;Realm className="org.apache.catalina.realm.UserDatabaseRealm" &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>
把该片断命名为“MyWebApp.xml”，然后拷贝到CATALINA_BASE/webapps目录下。<br><br>
这种context片断提供了一种便利的方法来部署web应用，你不需要编辑server.xml，除非你想改变缺省的部署特性，安装一个新的web应用时不需要重启动Tomcat。<br><br><br><b>
4．配置虚拟主机（Virtual Hosts）</b><br>
关于server.xml中“Host”这个元素，只有在你设置虚拟主机的才需要修改。虚拟主机是一种在一个web服务器上服务多个域名的机制，对每个域
名而言，都好象独享了整个主机。实际上，大多数的小型商务网站都是采用虚拟主机实现的，这主要是因为虚拟主机能直接连接到Internet并提供相应的带
宽，以保障合理的访问响应速度，另外虚拟主机还能提供一个稳定的固定IP。<br><br>
基于名字的虚拟主机可以被建立在任何web服务器上，建立的方法就是通过在域名服务器（DNS）上建立IP地址的别名，并且告诉web服务器把去往不同域
名的请求分发到相应的网页目录。因为这篇文章主要是讲Tomcat，我们不准备介绍在各种操作系统上设置DNS的方法，如果你在这方面需要帮助，请参考
《DNS and Bind》一书，作者是Paul Albitz and Cricket Liu
(O'Reilly)。为了示范方便，我将使用一个静态的主机文件，因为这是测试别名最简单的方法。<br>
在Tomcat中使用虚拟主机，你需要设置DNS或主机数据。为了测试，为本地IP设置一个IP别名就足够了，接下来，你需要在server.xml中添加几行内容，如下：<br><br>
&lt;Server port="8005" shutdown="SHUTDOWN" debug="0"&gt;<br>
 &nbsp;&lt;Service name="Tomcat-Standalone"&gt;<br>
 &nbsp;&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;&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;&nbsp;&lt;Factory className="org.apache.coyote.tomcat4.CoyoteServerSocketFactory"<br>
			clientAuth="false" protocol="TLS" /&gt;<br>
 &nbsp;&nbsp;&nbsp;&lt;/Connector&gt;<br>
 &nbsp;&nbsp;&nbsp;&lt;Engine name="Standalone" defaultHost="localhost" debug="0"&gt;<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- This Host is the default Host --&gt;<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Host name="localhost" debug="0" appBase="webapps"<br>
	 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unpackWARs="true" autoDeploy="true"&gt;<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Context path="" docBase="ROOT" debug="0"/&gt;<br>
 &nbsp;&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;&nbsp;&lt;/Context&gt;<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Host&gt;<br><br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- This Host is the first "Virtual Host": www.example.com --&gt;<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Host name="www.example.com" appBase="/home/example/webapp"&gt;<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Context path="" docBase="."/&gt;<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Host&gt;<br><br>
 &nbsp;&nbsp;&nbsp;&lt;/Engine&gt;<br>
 &nbsp;&lt;/Service&gt;<br>
&lt;/Server&gt;<br><br>
Tomcat的server.xml文件，在初始状态下，只包括一个虚拟主机，但是它容易被扩充到支持多个虚拟主机。在前面的例子中展示的是一个简单的
server.xml版本，其中粗体部分就是用于添加一个虚拟主机。每一个Host元素必须包括一个或多个context元素，所包含的context元
素中必须有一个是默认的context，这个默认的context的显示路径应该为空（例如，path=””）。<br><br><b>
5．配置基础验证（Basic Authentication）</b><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>
 &nbsp;Define the Members-only area, by defining<br>
 &nbsp;a "Security Constraint" on this Application, and<br>
 &nbsp;mapping it to the subdirectory (URL) that we want<br>
 &nbsp;to restrict.<br>
 --&gt;<br>
&lt;security-constraint&gt;<br>
 &nbsp;&lt;web-resource-collection&gt;<br>
 &nbsp;&nbsp;&nbsp;&lt;web-resource-name&gt;<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Entire Application<br>
 &nbsp;&nbsp;&nbsp;&lt;/web-resource-name&gt;<br>
 &nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;/members/*&lt;/url-pattern&gt;<br>
 &nbsp;&lt;/web-resource-collection&gt;<br>
 &nbsp;&lt;auth-constraint&gt;<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;role-name&gt;member&lt;/role-name&gt;<br>
 &nbsp;&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>
 &nbsp;&lt;auth-method&gt;BASIC&lt;/auth-method&gt;<br>
 &nbsp;&lt;realm-name&gt;My Club Members-only Area&lt;/realm-name&gt;<br>
&lt;/login-config&gt;<br><br><b>
6．配置单点登录（Single Sign-On）</b><br>
一旦你设置了realm和验证的方法，你就需要进行实际的用户登录处理。一般说来，对用户而言登录系统是一件很麻烦的事情，你必须尽量减少用户登录验证的
次数。作为缺省的情况，当用户第一次请求受保护的资源时，每一个web应用都会要求用户登录。如果你运行了多个web应用，并且每个应用都需要进行单独的
用户验证，那这看起来就有点像你在与你的用户搏斗。用户们不知道怎样才能把多个分离的应用整合成一个单独的系统，所有他们也就不知道他们需要访问多少个不
同的应用，只是很迷惑，为什么总要不停的登录。<br><br>
Tomcat 4的“single sign-on”特性允许用户在访问同一虚拟主机下所有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><b>
7．配置用户定制目录（Customized User Directores）</b><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><b>
8．在Tomcat中使用CGI脚本</b><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><b>
9．改变Tomcat中的JSP编译器（JSP Compiler）</b><br>
在Tomcat
4.1（或更高版本，大概），JSP的编译由包含在Tomcat里面的Ant程序控制器直接执行。这听起来有一点点奇怪，但这正是Ant有意为之的一部
分，有一个API文档指导开发者在没有启动一个新的JVM的情况下，使用Ant。这是使用Ant进行Java开发的一大优势。另外，这也意味着你现在能够
在Ant中使用任何javac支持的编译方式，这里有一个关于Apache Ant使用手册的javac
page列表。使用起来是容易的，因为你只需要在&lt;init-param&gt;
元素中定义一个名字叫“compiler”，并且在value中有一个支持编译的编译器名字，示例如下：<br><br>
&lt;servlet&gt;<br>
 &nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;jsp&lt;/servlet-name&gt;<br>
 &nbsp;&nbsp;&nbsp;&lt;servlet-class&gt;<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.jasper.servlet.JspServlet<br>
 &nbsp;&nbsp;&nbsp;&lt;/servlet-class&gt;<br>
 &nbsp;&nbsp;&nbsp;&lt;init-param&gt;<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;logVerbosityLevel&lt;/param-name&gt;<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;WARNING&lt;/param-value&gt;<br>
 &nbsp;&nbsp;&nbsp;&lt;/init-param&gt;<br>
 &nbsp;&nbsp;&nbsp;&lt;init-param&gt;<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;compiler&lt;/param-name&gt;<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;jikes&lt;/param-value&gt;<br>
 &nbsp;&nbsp;&nbsp;&lt;/init-param&gt;<br>
 &nbsp;&nbsp;&nbsp;&lt;load-on-startup&gt;3&lt;/load-on-startup&gt;<br>
&lt;/servlet&gt;<br><br>
当然，给出的编译器必须已经安装在你的系统中，并且CLASSPATH可能需要设置，那处决于你选择的是何种编译器。<br><br><b>
10．限制特定主机访问（Restricting Access to Specific Hosts）</b><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>
 &nbsp;&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>
如果没有给出允许主机的指定，那么与拒绝主机匹配的主机就会被拒绝，除此之外的都是允许的。与之类似，如果没有给出拒绝主机的指定，那么与允许主机匹配的主机就会被允许，除此之外的都是拒绝的。</font>
































































<img src ="http://www.blogjava.net/cmd/aggbug/31202.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cmd/" target="_blank">静夜思</a> 2006-02-17 14:57 <a href="http://www.blogjava.net/cmd/articles/31202.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat中文手册</title><link>http://www.blogjava.net/cmd/articles/31201.html</link><dc:creator>静夜思</dc:creator><author>静夜思</author><pubDate>Fri, 17 Feb 2006 06:54:00 GMT</pubDate><guid>http://www.blogjava.net/cmd/articles/31201.html</guid><wfw:comment>http://www.blogjava.net/cmd/comments/31201.html</wfw:comment><comments>http://www.blogjava.net/cmd/articles/31201.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cmd/comments/commentRss/31201.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cmd/services/trackbacks/31201.html</trackback:ping><description><![CDATA[<font size="2">
Jakarta-Tomcat 简明中文版用户指南第一部分
<br><br></font>
<p><font size="2">本文档提供关于Tomcat的基础信息.主要内容如下:<br>Tomcat二进制版本安装<br>与Tomcat相关的脚本的主要内容<br>与server.xml相关的主要内容,Tomcat的主要配置文件<br>如何设置Tomcat与宿主web服务器一起工作的说明<br>如何应用Tomcat配置一个现实中的web站点<br>希望此文档足以使新用户可以开始使用Tomcat.如找不到某方面的内容请(按以下顺序)<br>查找Tomcat faq<br>查找Tomcat包清单<br>向Tomcat用户邮件列表发出问题<br>如此疑问的答案不存在,我们鼓励把对疑问的解答放入Tomcat faq或此文档.如对此文档有意见或建议,请发送到Tomcat的邮件列表.</font></p><p><font size="2">Getting Started<br>Tomcat是一个带有jsp环境的servlet容器.servlet容器是一个根据用户的行为可以管理和激活servlet的运行时的shell.<br>粗略地可以将servlet容器分为如下几类:</font></p><p><font size="2">独立的servlet容器<br>内置有web服务器的一部分.指当使用基于Java的web服务器的情形,例如servlet容器是JavaWebServer的一个部分. 独立的servlet容器是Tomcat的默认模式.<br>大多数的web服务器并非基于Java,因此,我们可以得出如下两种容器的模式.</font></p><p><font size="2"><br>进程内的servlet容器<br>servlet
容器作为web服务器的插件和Java容器的实现.Web服务器插件在内部地址空间打开一个JVM(java virtual
machine)使Java容器得以在内部运行.如有某个需要调用servlet的请求,,插件将取得对此请求的控制并将他传递(使用JNI)给Java
容器.进程内容器对于多线程,单进程的服务器非常合适并且提供很好的运行速度,但伸缩性有所不足.</font></p><p><font size="2"><br>进程外的servlet容器<br>servlet
容器运行于web服务器之外的地址空间且作为web服务器的插件和Java容器的实现的结合.web服务器插件和Java容器
JVM使用IPC机制(通常是TCP/IP)进行通讯.当一个调用servlet的请求到达时,插件将取得对此请求的控制并将其传递(使用IPC等)给
Java容器,进程外容器的反应时间或进程外容器引擎不如进程内容器,但进程外容器引擎在许多其他可比的范围内更好(伸缩性,稳定性等).<br>Tomcat既可作为独立的容器(主要是用于开发与调试)又可作为对现有服务器的附加(当前支持Apache,IIS和Netscape服务器).即任何时候配置Tomcat你都必须决定如何应用他,如选择第二或第三种模式,你还需要安装一个web服务器接口.<br>Tomcat与Jserv有何区别?Tomcat是Jserv吗?<br>这是个常见的误解.Jserv是Servlet API2.0兼容并与Apache一起使用的容器.Tomcat是一个完全重写的并与Servlet API2.2和JSP1.1兼容的容器.<br>Tomcat使用了一些为Jserv而写的代码,特别是Jserv的Apache接口,但这是唯一的相同之处.<br>怎样安装Tomcat的二进制版本?<br>非常简单,只需:<br>下载 zip/tar.gz 任何压缩文件,从http://jakarta.apche.org/download/binindex.html处.<br>解压缩此文件到某目录(如:foo).将会生成一子目录,名为”tomcat”.<br>转换到”tomcat”目录设置一新的环境变量(TOMCAT_HOME)指向你安装的tomcat的目录<br>WIN32平台,键入:<br>“set TOMCAT_HOME=foo\tomcat”<br>Unix平台:<br>如是bash/sh环境, 键入:”TOMCAT_HOME=foo/tomcat;export TOMCAT_HOME”<br>如是tcsh环境, 键入:”setenv TOMCAT_HOME foo/tomcat”<br>设置环境变量JAVA_HOME指向你JDK的目录,然后添加JAVA解释器到你的PATH环境变量.<br>好了!现在可以运行TOMCAT并作为一个独立的Servlet容器(模式一)<br>启动与关闭Tomcat<br>使用”bin”目录中的脚本启动与关闭Tomcat.<br>启动:<br>uinx:bin/startup.sh<br>win32:bin\startup<br>关闭:<br>unix:bin/shutdown.sh<br>win32:bin\shutdown<br>Tomcat目录结构<br>假设你已将Tomcat解压,你已得到下列目录结构:<br>目录名--描述 <br>bin <br>包含启动/关闭脚本 <br>conf <br>包含不同的配置文件,<br>包括 server.xml(Tomcat的主要配置文件)和为不同的Tomcat配置的web应用设置缺省值的文件web.xml<br>doc<br>包含各种Tomcat文档 <br>lib <br>包含Tomcat使用的jar文件.unix平台此目录下的任何文件都被加到Tomcat的classpath中 <br>logs <br>Tomcat摆放日志文件的地方 <br>src <br>ServletAPI源文件.先别高兴,这些只有些必须在Servlet容器内实现的空接口和抽象类 <br>webapps <br>包含web项目示例 <br>此外你可以Tomcat会创建如下目录:<br>work<br>Tomcat自动生成,放置Tomcat运行时的临时文件(如编译后的JSP文件).如在Tomcat运行时删除此目录.JSP页面将不能运行.<br>classes<br>你可以创建此目录来添加一些附加的类到类路径中.任何你加到此目录中的类都可在Tomcat的类路径中找到自身.<br>Tomcat的脚本<br>Tomcat是一个Java程序,因此在设置好几个环境变量后即可用命令行的方式运行.然而设置Tomcat使用的每个环境变量和如下的命令行参数乏味且易错.因此,Tomcat开发组提供了一些脚本使启动和关闭Tomcat变得轻松.<br>注意:这些脚本仅仅是个便利的方法去启动和关闭Tomcat.你可修改他们来定制CLASSPATH,环境变量如PATH,LD_LIBRARY_PATH,等等,只要是生成一个正确的命令行即可.<br>这些脚本是什么呢?下表列出对一般用户最重要的脚本.<br>tomcat <br>主脚本.设置合适的环境变量,包括CLASSPATH,TOMCAT_HOME和JAVA_HOME和用适合的命令行参数启动Tomcat </font></p><p><font size="2">startup </font></p><p><font size="2">在后台启动Tomcat.”tomcat start”命令的替换方式 </font></p><p><font size="2">shutdown </font></p><p><font size="2">关闭Tomcat.”tomcat stop”命令的替换方式 </font></p><p><font size="2"><br>对用户最重要的脚本是tomcat(tomcat.bat/tomcat.sh).其他Tomcat相关的脚本作为一个简单的面向单任务的指向Tomcat脚本(设置不同的命令行参数等)的入口.</font></p><p><font size="2"><br>仔细考察tomcat.bat/tomcat.sh,它按以下步骤运行:</font></p><p><font size="2">在Unix下的步骤：</font></p><p><font size="2">如未指定,推测 TOMCAT_HOME</font></p><p><font size="2">如未指定,推测 JAVA_HOME</font></p><p><font size="2">设置CLASS_PATH包含:</font></p><p><font size="2">1.${TOMCAT_HOME}/classes目录(如果存在)</font></p><p><font size="2">2.${TOMCAT_HOME}/lib的一切内容</font></p><p><font size="2">3.${JAVA_HOME}/lib/tools.jar(此jar文件包含工具javac,我们需要javac处理jsp文件.</font></p><p><font size="2"><br>运
行带有设定Java环境变量的命令行参数的java命令,调入tomcat.home,和
org.apache.tomcat.startup.Tomcat
作为启始类.同时也传递命令行参数到org.apache.tomcat.startup.Tomcat ,例如:</font></p><p><font size="2"><br>执行start/stop/run 等的操作</font></p><p><font size="2">此Tomcat进程使用指向server.xml的路径,</font></p><p><font size="2">例如server.xml放置于etc/server_1.xml并且用户意图在后台启动apache,键 入如下命令行:</font></p><p><font size="2">bin/tomcat.sh start –f /etc/server_1.xml</font></p><p><font size="2">在Win32下的步骤：(略)</font></p><p><font size="2"><br>由此可见,win32版的tomcat.bat与Unix版的几乎一致.尤其在它不推测TOMCAT_HOME和JAVA_HOME的值,并且不将所有的jar文件放入类路径中.</font></p><p><font size="2"><br>Tomcat的配置文件</font></p><p><font size="2">Tomcat的配置基于两个配置文件:</font></p><p><font size="2">1.server.xml - Tomcat的全局配置文件</font></p><p><font size="2">2.web.xml - 在Tomcat中配置不同的关系环境</font></p><p><font size="2"><br>这一部分将讲述如何使用这些文件.我们不会包含web.xml的内部机制,这些内部机制深入到了Servlet API的细节,因此,我们将讨论涵盖servler.xml内容及web.xml在Tomcat关系环境中的用法.</font></p><p><font size="2"><br>server.xml</font></p><p><font size="2">server.xml是Tomcat的主配置文件.完成两个目标:</font></p><p><font size="2">1 提供Tomcat组件的初始配置.</font></p><p><font size="2">2 说明Tomcat的结构,含义,使得Tomcat通过实例化组件完成起动及构建自身, 如在server.xml所指定的</font></p><p><font size="2">下表描述server.xml种的重要元素: </font></p><p>      <font size="2"><br></font>  
</p><p><font size="2">元素及其描述 </font></p><p><font size="2">Server<br>server.xml文件中最重要的元素.Server定义了一个Tomcat服务器.一般你不用对他担心太多.Server元素能包含Logger和ContextManager元素类型</font></p><p><font size="2">Logger<br>此
元素定义一个Logger对象,每个Logger都有一个名字去标识,也有一个纪录Logger的输出和冗余级别(描述此日志级别)和包含日志文件的路
径.通常有servlet的Logger(ServletContext.log()处),JSP和Tomcat运行时的Logger.</font></p><p><font size="2">ContextManager<br>ContextManager说明一套ContextInterceptor, RequestInterceptor , Context和他们的Connectors的配置及结构.ContextManager有几个随同提供的特性:<br>1. 用来纪录调试信息的调试级别 <br>2. webapps/,conf/,logs/和所有已定义的环境的基本位置.用来使Tomcat可以在TOMCAT_HOME外的其他目录启动. <br>3. 工作目录的名字</font></p><p><font size="2">ContextInterceptor&amp;RequestInterceptor<br>这
些侦听器(interceptors)侦听具体发生在ContextManager中的事件.例如,ContextInterceptor侦听
Tomcat的启动及终止事件,RequestInterceptor监视在它服务过程中用户请求需要通过的不同阶段.Tomcat的管理员不必知道太多
关于侦听器的知识;另外,开发者应该知道这是如何在Tomcat中实现一个”全局”型的操作(例如安全性及每个请求日志)</font></p><p><font size="2">Connector<br>Connector表示一个到用户的联接,不管是通过web服务器或直接到用户浏览器(在一个独立配置中).Connector负责管理Tomcat的工作线程和 读/写 连接到不同用户的端口的 请求/响应.Connector的配置包含如下信息:</font></p><p><font size="2">1.句柄类</font></p><p><font size="2">2.句柄监听的TCP/IP端口</font></p><p><font size="2">3.句柄服务器端口的TCP/IP的backlog.</font></p><p><font size="2">稍后我们将在此文档中描述如何配置Connector.</font></p><p><font size="2">Context<br>每个Context提供一个指向你放置你Web项目的Tomcat的下属目录。每个Context包含如下配置：</font></p><p><font size="2">1. Context放置的路径,可以是与ContextManager主目录相关的路径.</font></p><p><font size="2">2.纪录调试信息的调试级别</font></p><p><font size="2">3.
可重载的标志.开发Servlet时,重载更改后的Servlet,这是一个非常便利的特性,你可以调试或用Tomcat测试新代码而不用停止或重新启动
Tomcat.要打开重载,把reloadable设为真即可.这虽花费时间但可检测所发生的变化;更重要的事,鉴于,在一个装载类对象装入一个新的
servlet时,类装载触发器可能会掷出一些错误.为避免这些问题,你可以设置可重载为假,这将停止重载功能.</font></p><p><font size="2"><br>　 </font></p><p><font size="2">从另一个目录中启动Tomcat</font></p><p><font size="2">作为缺省值将使用TOMCAT_HOME/conf/server.xml作为配置文件.缺省配置将使用TOMCT_HOME作为关系环境的基础.</font></p><p><font size="2">使用 “-f/你的/目录/server.xml”选项你可改变这种情况,使用另一个服务器配置文件和设置关系环境管理器的目录属性你需要在主目录内设置以下几个文件:</font></p><p><font size="2">Ø 一个 webapps/目录(如果你已生成) – 所有war文件奖杯界压倒此目录而且所有子目录将作为关系环境添加.</font></p><p><font size="2">Ø conf/目录 - 你可保存一个特殊的web.xml文件和其他配置文件</font></p><p><font size="2">Ø logs/ - 所有日志文件将代替TOMCAT_HOME/logs/纪录到此目录中</font></p><p><font size="2">Ø work/ - 关系环境的工作目录</font></p><p><font size="2">如server.xml中的ContextManager.home属性有关联,将关联到到当前工作目录.</font></p><p><font size="2">web。xml</font></p><p><font size="2">关于web。xml和web项目结构（包括目录服务及配置）的详细描述可在Servlet API Spec的第9，10，14章中找到。</font></p><p><font size="2">然
而有一个与Tomcat有关的小“特性“与web.xml有关。Tomcat可以让用户通过将缺省的web.xml放入conf目录中来定义所有关系环境
的web.xml的缺省值.建立一个新的关系环境时,Tomcat使用缺省的web.xml文件作为基本设置和应用项目特定的web.xml(放在应用项
目的WEB-INF/web.xml文件)来覆盖这些缺省值.</font></p><p><font size="2">设置Tomcat与Apache Web 服务器</font></p><p><font size="2">服务器</font></p><p><font size="2">到现在为止,我们未讨论作为服务器扩展的Tomcat,只讨论了作为独立运行的服务器.但有一些问题需要说明:</font></p><p><font size="2">1. 当处理静态页面时,Tomcat不如Apache迅速.</font></p><p><font size="2">2. Tomcat不象Apache一样可配置.</font></p><p><font size="2">3. Tomcat不象Apache一样强壮.</font></p><p><font size="2">4. 有很多网站已在某一特定web server上投入了很长时间,例如,使用CGI脚本/Server API模组/perl/php…我们不能假设这些遗留下来的东西都会被丢弃.</font></p><p><font size="2">基于以上原因,一个现实的网站建议使用一个Web服务器,如Apache,为网站的静态页面请求提供服务,并使用Tomcat作为一个Servlet/JSP插件.</font></p><p><font size="2">我们不准备深入的讨论每个不同的配置,我们将:</font></p><p><font size="2">1. 涵盖Web服务器的基本行为</font></p><p><font size="2">2. 解释需要何种配置</font></p><p><font size="2">3. 在Apache上的实例</font></p><p><font size="2"><br>Web 服务器操作</font></p><p><font size="2"><br>简单说来，web服务器总是等待来自客户端的HTTP请求。当请求到达时，服务器会提供一切必要的内容来满足此请求。加入一个Servlet容器某种程度上会改变此行为。但服务器仍需处理如下因素：</font></p><p><font size="2">载入servlet容器接口库并初始化（处理请求之前）。</font></p><p><font size="2">当收到一个请求时，检查是否属于某Servlet，如是，则接口库接收此请求并处理。</font></p><p><font size="2">另一方面，接口库需要知道他将服务某种请求，通常是基于请求的URL的某种模式和将此请求导向何处。</font></p><p><font size="2">当用户想要设置使用虚拟主机的配置时，事情会变得更加复杂，或者想多个开发者在一个服务器上进行开发但使用不同的Servlet容器的JVMs。以下我们将讨论这两个问题。</font></p><p><font size="2"><br>必需进行的配置</font></p><p><font size="2"><br>应该考虑的是最明显的配置是servlet URL具有对servlet容器中的servlet具有表示的责任。很明显，你必须知道传递什么到Servlet容器。我们仍需提供附加的配置项目到web-server或servlet-container的结合体中.</font></p><p><font size="2">l 考虑到Tomcat进程是否可取得，我们仍需提供配置和Tomcat正在监听的TCP/IP 主机名/端口号。</font></p><p><font size="2">l 需要告知web服务器接口库的位置（因此我们可以在起始时装入）</font></p><p><font size="2">l 需要设置接口内部信息如将日志记录在何处和如何纪录，等等。</font></p><p><font size="2">所有此类信息必须出现在web服务器配置里或被接口使用的私有配置文件中。下面将讲述如何在Apache中如何实现这些配置。</font></p><p><font size="2"><br>Apache上的实现</font></p><p><font size="2">这一部分演示如何配置Apache与Tomcat一起工作；并试图解释深入到可能会用到的配置规范。在jserv 安装页上可找到其他信息。 </font></p><img src ="http://www.blogjava.net/cmd/aggbug/31201.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cmd/" target="_blank">静夜思</a> 2006-02-17 14:54 <a href="http://www.blogjava.net/cmd/articles/31201.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat安全验证</title><link>http://www.blogjava.net/cmd/articles/31200.html</link><dc:creator>静夜思</dc:creator><author>静夜思</author><pubDate>Fri, 17 Feb 2006 06:50:00 GMT</pubDate><guid>http://www.blogjava.net/cmd/articles/31200.html</guid><wfw:comment>http://www.blogjava.net/cmd/comments/31200.html</wfw:comment><comments>http://www.blogjava.net/cmd/articles/31200.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cmd/comments/commentRss/31200.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cmd/services/trackbacks/31200.html</trackback:ping><description><![CDATA[<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;"><font size="2"><span style="" lang="EN-US"><span style="">1.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">创建验证表单</span><span lang="EN-US">usercheck.jsp</span><span style="font-family: 宋体;">及错误处理页面</span><span lang="EN-US">error.jsp,</span><span style="font-family: 宋体;">表单的用户名文本框必须命名为</span><span style="color: red;" lang="EN-US">j_username</span><span lang="EN-US">,</span><span style="font-family: 宋体;">密码文本框必须命名为</span><span style="color: red;" lang="EN-US">j_password</span><span lang="EN-US">,</span><span style="font-family: 宋体;">表单的</span><span lang="EN-US">action</span><span style="font-family: 宋体;">必须为</span><span style="color: red;" lang="EN-US">j_security_check</span><span lang="EN-US">.</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;"><font size="2"><span style="" lang="EN-US"><span style="">2.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">在</span><span lang="EN-US">web.xml</span><span style="font-family: 宋体;">中的</span><span lang="EN-US">&lt;web-app&gt;&lt;/web-app&gt;</span><span style="font-family: 宋体;">添加如下代码：</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp; </span><span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;security-role&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;description&gt;Baron's role to log in administration application&lt;/description&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;role-name&gt;admin&lt;/role-name&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/security-role&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;security-constraint&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;display-name&gt;Baron security-constraint!&lt;/display-name&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;web-resource-collection&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;web-resource-name&gt;Baron Protected Area&lt;/web-resource-name&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style=""></span><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;url-pattern&gt;*.htm&lt;/url-pattern&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/web-resource-collection&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;auth-constraint&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;role-name&gt;admin&lt;/role-name&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/auth-constraint&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/security-constraint&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;login-config&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;auth-method&gt;<b><span style="color: red;">FORM</span></b>&lt;/auth-method&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;realm-name&gt;BaronRealm&lt;/realm-name&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;form-login-config&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;form-login-page&gt;/usercheck.jsp&lt;/form-login-page&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;form-error-page&gt;/error.jsp&lt;/form-error-page&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/form-login-config&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/login-config&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="font-family: 宋体;">如果对所有的</span><span lang="EN-US">web</span><span style="font-family: 宋体;">资源都进行保护，则作如下修改：</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US">&lt;url-pattern&gt;/*&lt;url-pattern&gt;</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="font-family: 宋体;">如果通过控制资源访问方法进行保护，则在</span><span lang="EN-US">&lt;web-resource-collection&gt;</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;"><font size="2"><span lang="EN-US">&lt;/web-resource-colleciont&gt;</span><span style="font-family: 宋体;">作如下修改：</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US">&lt;http-method&gt;DELETE&lt;/http-method&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US">&lt;http-method&gt;GET&lt;/http-method&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US">&lt;http-method&gt;POST&lt;/http-method&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US">&lt;http-method&gt;PUT&lt;/http-method&gt;</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="font-family: 宋体;">以上为基于表单的验证，如果改成基本验证（不<span class="hilite2">安全</span>），则作如下修改：</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US">&lt;login-config&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;auth-method&gt;<b><span style="color: red;">BASIC</span></b>&lt;/auth-method&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;realm-name&gt;BaronRealm&lt;/realm-name&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style=""></span>&lt;/login-config&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="font-family: 宋体;">如果改成摘要验证，则作如下修改：</span><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US">&lt;login-config&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;auth-method&gt;<b><span style="color: red;">DIGEST</span></b>&lt;/auth-method&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;realm-name&gt;BaronRealm&lt;/realm-name&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style=""></span>&lt;/login-config&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;"><font size="2"><span style="" lang="EN-US"><span style="">3.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US">1</span><span style="font-family: 宋体;">）通过内存域验证，即根据</span><span lang="EN-US"><span class="hilite1">tomcat</span>-user.xml</span><span style="font-family: 宋体;">文件中的定义来验证登陆信息</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;"><font size="2"><span style="font-family: 宋体;">在</span><span lang="EN-US"><span class="hilite1">tomcat</span>-users.xml</span><span style="font-family: 宋体;">中进行如下修改，添加角色及用户</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US">&lt;<span class="hilite1">tomcat</span>-users&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp; </span>&lt;role rolename="<span class="hilite1">tomcat</span>"/&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp; </span>&lt;role rolename="role1"/&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp; </span><span style="color: red;">&lt;role rolename="admin"/&gt;<o:p></o:p></span></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp; </span>&lt;user username="<span class="hilite1">tomcat</span>" password="<span class="hilite1">tomcat</span>" roles="<span class="hilite1">tomcat</span>"/&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp; </span>&lt;user username="role1" password="<span class="hilite1">tomcat</span>" roles="role1"/&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp; </span>&lt;user username="both" password="<span class="hilite1">tomcat</span>" roles="<span class="hilite1">tomcat</span>,role1"/&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp; </span><span style="color: red;">&lt;user username="baron" password="baron" roles="admin"/&gt;<o:p></o:p></span></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US">&lt;/<span class="hilite1">tomcat</span>-users&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;"><font size="2"><span style="font-family: 宋体;">在</span><span lang="EN-US">server.xml</span><span style="font-family: 宋体;">中的</span><span lang="EN-US">&lt;Context&gt;&lt;/Context&gt;</span><span style="font-family: 宋体;">中添加：</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US">&lt;Realm className="org.apache.catalina.realm.MemoryRealm"/&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;"><font size="2"><span lang="EN-US">2</span><span style="font-family: 宋体;">）通过</span><span lang="EN-US">DataSource</span><span style="font-family: 宋体;">域验证</span></font></p>
<ol style="margin-top: 0cm;" type="a"><li class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="2"><span style="font-family: 宋体;">建数据库，比如</span><span lang="EN-US">guard,</span><span style="font-family: 宋体;">然后建用户表</span><span lang="EN-US">users,</span><span style="font-family: 宋体;">字段</span><span lang="EN-US">user_name,user_password,</span><span style="font-family: 宋体;">建角色表</span></font></li></ol>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span lang="EN-US">user_roles,</span><span style="font-family: 宋体;">字段</span><span lang="EN-US">user_name,role_name</span></font></p>
<ol style="margin-top: 0cm;" start="2" type="a"><li class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="2"><span style="font-family: 宋体;">将</span><span lang="EN-US">SQLServer</span><span style="font-family: 宋体;">的</span><span lang="EN-US">JDBC</span><span style="font-family: 宋体;">驱动程序考到</span><span lang="EN-US">&lt;CATALINA_HOME&gt;/common/lib</span><span style="font-family: 宋体;">中</span></font></li><li class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="2"><span style="font-family: 宋体;">在</span><span lang="EN-US">server.xml</span><span style="font-family: 宋体;">中的</span><span lang="EN-US">&lt;GlobalNamingResource&gt;</span><span style="font-family: 宋体;">元素下加入</span><span lang="EN-US">&lt;Resource&gt;</span><span style="font-family: 宋体;">和</span><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><o:p></o:p></span></font></li></ol>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span lang="EN-US">&lt;ResourceParams&gt;</span><span style="font-family: 宋体;">元素</span><span lang="EN-US">:</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US">&lt;Resource auth="Container" name="jdbc/BaronDB" type="javax.sql.DataSource"/&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US">&lt;ResourceParams name="jdbc/BaronDB"&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;parameter&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;name&gt;factory&lt;/name&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;value&gt;org.apache.commons.dbcp.BasicDataSourceFactory&lt;/value&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/parameter&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;parameter&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;name&gt;url&lt;/name&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 11.95pt; text-indent: 24.05pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;value&gt;jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=guard&lt;/value&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/parameter&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;parameter&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;name&gt;password&lt;/name&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp; </span><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>&lt;value&gt;229&lt;/value&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/parameter&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;parameter&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;name&gt;maxWait&lt;/name&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;value&gt;10000&lt;/value&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/parameter&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;parameter&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;name&gt;maxActive&lt;/name&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;value&gt;100&lt;/value&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/parameter&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;parameter&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="">&nbsp;&nbsp;&nbsp;</span>&lt;name&gt;driverClassName&lt;/name&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;value&gt;com.microsoft.jdbc.sqlserver.SQLServerDriver&lt;/value&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/parameter&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;parameter&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;name&gt;username&lt;/name&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;value&gt;sa&lt;/value&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/parameter&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;parameter&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;name&gt;maxIdle&lt;/name&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;value&gt;30&lt;/value&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/parameter&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 33pt; text-indent: 3pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>&lt;/ResourceParams&gt;<o:p></o:p></span></font></p>
<ol style="margin-top: 0cm;" start="4" type="a"><li class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="2"><span style="font-family: 宋体;">在</span><span lang="EN-US">server.xml</span><span style="font-family: 宋体;">中</span><span lang="EN-US">web</span><span style="font-family: 宋体;">应用对应的</span><span lang="EN-US">&lt;Context&gt;</span><span style="font-family: 宋体;">元素中加入</span><span lang="EN-US">&lt;Realm&gt;</span><span style="font-family: 宋体;">元素</span><span lang="EN-US">:</span></font></li></ol>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US">&lt;Realm className="org.apache.catalina.realm.DataSourceRealm" <o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: 31.5pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US">debug="99" <o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: 31.5pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US">dataSourceName="jdbc/BaronDB"<span style="">&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><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 66pt; text-indent: 6pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US">userTable="b_users" userNameCol="user_name" userCredCol="user_password"<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 57pt; text-indent: 16.5pt;"><font size="2"><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US">userRoleTable="b_user_roles" roleNameCol="role_name"/&gt;<o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="2"><span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>*.</span><span style="font-family: 宋体;">在</span><span lang="EN-US">web.xml</span><span style="font-family: 宋体;">中无须加入</span><span lang="EN-US">&lt;resource-ref&gt;</span><span style="font-family: 宋体;">声明对</span><span lang="EN-US">DataSource</span><span style="font-family: 宋体;">的引用</span></font></p>
<font size="2"><span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>*.</span><span style="font-family: 宋体;">在页面中调用</span><b><span lang="EN-US">request.getRemoteUser()</span></b><span style="font-family: 宋体;">可得到当前访问的用户名</span></font><img src ="http://www.blogjava.net/cmd/aggbug/31200.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cmd/" target="_blank">静夜思</a> 2006-02-17 14:50 <a href="http://www.blogjava.net/cmd/articles/31200.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>