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
猜你喜欢
- java 计算同比增长工具类为了数据的严谨性,统一装换为BigDecimal,话不多说,看代码。package com.pig4cloud.
- springboot + docker + jenkins自动化部署项目,jenkins、mysql、redis都是docker运行的,并且
- 一.解析概念StringUtils概念StringUtils 方法的操作对象是 Java.lang.String 类型的对象,是 JDK 提
- 一、问题定义:问下有一个数组,这些数组中的值都有自己的权重,怎样设计才能高效的优先取出权重高的数??例如:权重: 8 2&nbs
- 实现的效果图:自定义Fragment继承BottomSheetDialogFragment重写它的三个方法:onCreateDialog()
- 什么是ServletContext?根据字面意思即Servlet上下文服务器会为每一个工程创建一个对象,这个对象就是ServletConte
- SSM Mapper查询出返回数据查不到个别字段原因开启了驼峰命名法则,Bean里的字段不识别_注释掉或者把实体类里的字段_去掉换位大写SS
- 本文实例讲述了java实现列表、集合与数组之间转化的方法。分享给大家供大家参考。具体实现方法如下:package test; i
- 目录为什么要实现调用链跟踪?如何实现?第一步,看图、看场景,用户浏览器的一次请求行为所走的路径是什么样的第二步,实现。不想看代码可直接拉最后
- SharedPreferences是Android中最容易理解的数据存储技术,实际上SharedPreferences处理的就是一个key-
- 建造者模式概述建造者模式(Builder Pattern)属于创建型模式。它是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同
- 一、spring-boot-devtools在pom中直接引入依赖<dependency> <groupId&
- 本文实例讲述了Android之复选框对话框用法。分享给大家供大家参考。具体如下:main.xml布局文件<?xml version=&
- 借用@Caching实现入参是基本类型的:@Caching(evict={@CacheEvict(value = Cache.CONSTAN
- SpringMvc中普通类注入Service为null场景:使用Quartz定时器时,普通的java类需要注入spring的service类
- 在分支较多的时候,switch的效率比if高,在反汇编中我们即可看到效率高的原因一、switch语句1、在正向编码时,switch语句可以看
- 简介方案对比本处列举表示类型或状态的常用方法的对比。法1:使用数字表示(不推荐)//1:支付宝支付;2:微信支付;3:银行卡支付privat
- 上帝之火本系列讲述的是开源实时监控告警解决方案Prometheus,这个单词很牛逼。每次我都能联想到带来上帝之火的希腊之神,普罗米修斯。而这
- springboot 多个filter的执行顺序以及配置当项目中有多个filter时,为了便于管理,可以创建一个配置文件,对所有的filte
- 本文实例为大家分享了MapReduce实现决策树算法的具体代码,供大家参考,具体内容如下首先,基于C45决策树算法实现对应的Mapper算子