最近我在考虑如何远程控制tomcat的启动和关机,最后是有友好的界面,能够实现一键式操作的,这样会肯定是会很方便的,网上找了半天,没找到,有说使用sheel脚本的,有在tomcat服务器上面安装个客户端的,这些都不是我所需要的,后来不经意在网上找到一篇文章稍微讲述了下,但是他写的不完整,一些关键的地方没提到,还有一些地方写错了,我重新整理了下,在这里分享给大家。
首先,我下载了一个崭新的tomcat,我选择的是7版本的。
解压后的界面如下图所示:
这里我们先来说2个需要注意的问题:
1. webapps下面有个文件夹叫**manager**,很多时候我们会把webapps下面的东西都删了,然后再放我们的工程,其实这个文件夹是用来做tomcat管理的,我们要留着。
2. conf文件夹下面有个文件叫tomcat-users.xml,它是来做tomcat管理的用户权限的
我们就是利用这两块内容来实现对tomcat的远程控制的。
tomcat提供的manager项目提供了一些api,我们用到的有下面四个:
1. http://localhost:9000/manager/text/list:可以得到此tomcat正在运行的项目以及它们的状态。
2. http://localhost:9000/manager/text/reload?path=/ROOT:重新部署一个项目ROOT项目
3. http://localhost:9000/manager/text/start?path=/ROOT:启动ROOT项目
4. http://localhost:9000/manager/text/stop?path=/ROOT:关闭ROOT项目
ROOT是我们控制的项目名称,你可以根据你实际需要去改为你的项目名。
首先,我们通过http://localhost:9000/manager/text/list得到正在运行的项目列表,得到的结果大概如下:
我们来分析下这段结果,第一行我们忽略,代表的是tomcat在运行,下面有一些项目在正常运行。
我们来项目看看下面这些,以/examples:running:0:examples为例子,它有三个:号,第一个:前的内容我们忽略,running为正在运行中(若为stopped则代表已经停止),0代表状态为正常(其他为异常)。
分析好我们就可以用java代码来操作这些了。
具体代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
package com.baibin.utils; import sun.misc.BASE64Encoder; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.List; public class TomcatHTMLUtil { public static String message(String operateURL) { StringBuffer dataResult = new StringBuffer(); URL url = null ; try { url = new URL(operateURL); URLConnection conn = (URLConnection) url.openConnection(); /** * 这里的用户名和密码是由tomcat的%tomcat_home%/conf/tomcat-users.xml里所配置的用户 */ String username = "tomcat" ; String password = "tomcat" ; String configuration = username + ":" + password; // manager角色的用户 String encodedPassword = new BASE64Encoder().encode(configuration.getBytes()); conn.setRequestProperty( "Authorization" , "Basic " + encodedPassword); InputStream is = conn.getInputStream(); BufferedReader bufreader = new BufferedReader( new InputStreamReader(is)); String line = null ; while ((line = bufreader.readLine()) != null ) { dataResult.append(line); } } catch (Exception e) { e.printStackTrace(); } return dataResult.toString(); } /** * 获取tomcat正在运行的webApp的参数 * * @return */ public List<WebApp> getTomcatWebAppData() { List<WebApp> webAppArrayList = new ArrayList<WebApp>(); String data = TomcatHTMLUtil.message( "http://localhost:9000/manager/text/list" ); String[] oldDataStrs = data.split( "/" ); if (oldDataStrs[ 0 ].startsWith( "OK" )) { for ( int i = 1 ; i < oldDataStrs.length; i++) { String[] names = oldDataStrs[i].split( ":" ); //长度为4 0 :忽略 1:状态 2:0 状态 3:名称 WebApp webApp = new WebApp(); webApp.setName(names[ 3 ]); if (names[ 1 ].equals( "running" )) { if (oldDataStrs[i].split( ":" )[ 2 ].equals( "0" )) { webApp.setStatus( "运行" ); } else { webApp.setStatus( "异常" ); } } else if (names[ 1 ].equals( "stopped" )) { if (oldDataStrs[i].split( ":" )[ 2 ].equals( "0" )) { webApp.setStatus( "停止" ); } else { webApp.setStatus( "异常" ); } } else { webApp.setStatus( "异常" ); } webAppArrayList.add(webApp); } //} } return webAppArrayList; } /** * 重新部署一个项目 * * @param webAppName * @return */ public boolean reloadWebApp(String webAppName) { String data = TomcatHTMLUtil.message( "http://localhost:9000/manager/text/reload?path=/" + webAppName); if (data.startsWith( "OK" )) { return true ; } else { return false ; } } /** * 停止一个项目 * * @param webAppName * @return */ public boolean stopWebApp(String webAppName) { String data = TomcatHTMLUtil.message( "http://localhost:9000/manager/text/stop?path=/" + webAppName); if (data.startsWith( "OK" )) { return true ; } else { return false ; } } /** * 开始一个项目 * * @param webAppName * @return */ public boolean startWebApp(String webAppName) { String data = TomcatHTMLUtil.message( "http://localhost:9000/manager/text/start?path=/" + webAppName); if (data.startsWith( "OK" )) { return true ; } else { return false ; } } } package com.baibin.utils; /** * Created by ibm on 2017/3/22. */ public class WebApp { /** * 项目名称 */ private String name; /** * 运行状态 "成功" or "停止" */ private String status; @Override public String toString() { return "WebApp{" + "name='" + name + '\ '' + ", status='" + status + '\ '' + '}' ; } public String getName() { return name; } public String getStatus() { return status; } public void setName(String name) { this .name = name; } public void setStatus(String status) { this .status = status; } } |
调用方式如下:
1
2
3
4
5
6
7
8
9
|
<body> <% TomcatHTMLUtil util = new TomcatHTMLUtil(); /*启动ROOT项目*/ util.startWebApp("ROOT"); /*关闭ROOT项目*/ util.stopWebApp( "ROOT" ); %> </body> |
这样就可以远程控制了,前台写的比较简单,还可以继续优化,当然那不是重点,这里就不写了。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。如有错误或未考虑完全的地方,望不吝赐教。
原文链接:https://blog.csdn.net/baibinboss/article/details/65435466