java 如何远程控制tomcat启动关机
作者:白彬2017 发布时间:2023-04-10 03:21:47
最近我在考虑如何远程控制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代码来操作这些了。
具体代码如下:
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;
}
}
调用方式如下:
<body>
<%
TomcatHTMLUtil util = new TomcatHTMLUtil();
/*启动ROOT项目*/
util.startWebApp("ROOT");
/*关闭ROOT项目*/
util.stopWebApp("ROOT");
%>
</body>
这样就可以远程控制了,前台写的比较简单,还可以继续优化,当然那不是重点,这里就不写了。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。
来源:https://blog.csdn.net/baibinboss/article/details/65435466


猜你喜欢
- 在spring运行时,动态的添加bean,dapeng框架在解析xml的字段时,使用到了动态注册,注册了一个实现了FactoryBean类!
- 本文实例讲述了java中struts2实现文件上传下载功能实现方法。分享给大家供大家参考。具体分析如下:1.文件上传首先是jsp页面的代码在
- 发现问题需求很简单,大致就是要批量往数据库写数据,于是打算用Parallel并行的方式写入,希望能利用计算机多核特性加快程序执行速度。想的很
- 🍅1.注解JUnit提供了非常强大的注解功能,通过@Test注解修饰到方法上,该方法就变为了一个测试方法,执行当前类时,会自动的执行该类下所
- Android性能优化-布局优化今天,继续Android性能优化 一 编码细节优化。编码细节,对于程序的运行效率也是有很多的影响的
- 先上效果图源码 github.com/woshiwzy/Ca…实现原理:1.继承LinearLayout2.重写onL
- C#中using指令的用法1.using指令using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空
- 在安全卫生上,经常看到有圆形的进度条在转动,效果非常好看,于是就尝试去实现一下,具体实现过程不多说了,直接上效果图,先炫耀下。效果图:分析:
- java.nio.file.Files.walkFileTree是JDK7新增的静态工具方法。1.Files.walkFileTree的原理
- 目录一 前言二 压缩文件2.1 压缩多个文件2.2 压缩文件或文件树2.3 借助文件访问器压缩三 解压文件四 总结一 前言项目开发中,总会遇
- 异步log4j2的location信息打印问题背景:项目改造过程中将log4j2改成异步,发现行号没有打印,于是扒了下官方文档,大概陈述下:
- C/C++ 左移<<, 右移>>作用1. 左移 <<取两个数字,左移第一个操作数的位,第二个操作数决定要
- 要完成一个轮播图片,首先想到的应该是使用ViewPager来实现。ViewPager已经有了滑动的功能,我们只要让它自己滚动。再加上下方的小
- Druid是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好的
- 流读取导致StringBuilder.toString()乱码乱码问题StringBuilder sb = new StringBuilde
- 目录定义数据库表访问表中的数据插入数据查询数据创建数据库测试 DaoRoom 是 SQLite 的封装,它使 Android 对数据库的操作
- 今天在开发的过程中,遇到java.lang.ExceptionInInitializerError异常,百度查了一下,顺便学习学习,做个笔记
- 本文为大家分享了Android APP编写的简单答题器,此答题器可以通过Next按钮选择下一题,新写题目的类Question,有两个成员变量
- 常用,记录一下。效果图:首先新建xml文件 bg_gradient.xml<?xml version="1.0&
- Service翻译成中文是服务,熟悉Windows 系统的同学一定很熟悉了。Android里的Service跟Windows里的Servic