深入Tomcat的Manager

关心Tomcat,使用过Tomcat的朋友,一定使用过它的管理应用,就是webapps目录下的manager。

默认启动Tomcat后,Tomcat 7.0之前版本的,通过点击位于Tomcat的ROOT应用主界面的左侧链接,可以进入manager应用,Tomcat7.0之后,界面变成了下面的这个样了。通过点击Manager App可以访问manager应用。


无论哪个版本,要使用manager应用有一个前提:

是需要用户名密码的。

因为manager app设置了BASIC的登录验证方式,所以使用前需要先配置conf/tomcat-users.xml文件。

在其中增加:

<user username="tomcat" password="tomcat" roles="tomcat,manager-gui"/>

其中,username和password可以随意改,那roles中用于设置该用户属于哪个角色,如果要使用manager应用,就需要给其赋予manager-gui这个角色。

为什么是这个角色呢?

看这里:

位于webapps/manager/WEB-INF/web.xml文件中,有如下定义:


<!-- Define the Login Configuration for this Application -->
<login-config>
  <auth-method>BASIC</auth-method>
  <realm-name>Tomcat Manager Application</realm-name>
</login-config>
<!-- Security roles referenced by this web application -->
<security-role>
  <role-name>manager-gui</role-name>
</security-role>

就是我们上面提到使用的校验方式为BASIC,而具体的角色定义是manager-gui。

配置好tomcat-users.xml中的用户和角色后,就可以使用其管理Tomcat了。

进入manager应用,进入视线的是应用的列表


注意红框中的内容,大图如下


可以控制应用的启动停止,重新加载,卸载。可以使Session失效等。

这里我们能和Tomcat开发者学到的一个好的实践

可以用来操作已部署应用生命周期的管理级别的应用,默认情况下是不允许使用的,只有配置过用户才能使用,从而避免一些线上的应用被黑。我们可以想像一下,如果默认就可以随便使用,那如果这个配置没有更改,情况就不容乐观了。

在列表块下,是用于应用部署的模块


这里支持两种形式的部署

  • 使用配置文件直接部署

  • 通过选择具体的WAR文件进行部署

再向下则是系统分析的接口,以及获取Server信息的接口,如下图:

做为一个严肃的IT公众号(:,我们的口号是, Picture is cheap, show you the code.

我们再摘选一段源码,分析下manager应用。

manager应用的源码位于Tomcat源码的org.apache.catalina.manager包下。

主类为ManagerServlet这个类。以列所有部署的应用为例,我们看下具体实现

由于默认输出的是html格式的内容,最终定向到的类是HTMLManagerServlet,这是ManagerServet的一个子类。

其中,输出应用列表的代码如下:

// Apps Row Section

// Create sorted map of deployed applications by context name.

Container children[] = host.findChildren();

String contextNames[] = new String[children.length];

for (int i = 0; i < children.length; i++)

contextNames[i] = children[i].getName();

Arrays.sort(contextNames);

for (String contextName : contextNames) {

Context ctxt = (Context) host.findChild(contextName);

if (ctxt != null) {

// Bugzilla 34818, alternating row colors

String contextPath = ctxt.getPath();

String displayPath = contextPath;

if (displayPath.equals("")) {

displayPath = "/";

} }}

注意标红的几行代码,manager应用是通过Host这个组件,来获取该组件下所有的应用信息,先获取所有应用的名称,再通过名称,再获取其对应的具体信息,并将其接成HTML内容输出。

从上面的代码,我们可以和Tomcat开发者学到的一个不错的实践,是将对应修改BUG的标号和代码对应起来,在其它人维护系统时,可以更方便。

在部署一个应用时,首先需要检查下该应用的前缀(ContextRoot)是否已经存在,因为不允许应用存在重名的情况,这个名称检测,用的就是JMX的实现

代码如下:

/**
 * Invoke the isDeployed method on the deployer.
 */
protected boolean isDeployed(String name)
    throws Exception {
    String[] params = { name };
    String[] signature = { "java.lang.String" };
    Boolean result =
        (Boolean) mBeanServer.invoke(oname, "isDeployed", params, signature);
    return result.booleanValue();
}

通过MBeanServer执行指定MBean上的方法。不了解JMX,可以查看上一篇文章,了解其在Tomcat中的实现方式。

感觉文章有用,请转发到朋友圈,让更多人看到。欢迎关注,获取更多内容。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值