java 如何遠程控制tomcat啟動關機
最近我在考慮如何遠程控制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正在運行的項目以及它們的狀態(tài)。
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代表狀態(tài)為正常(其他為異常)。
分析好我們就可以用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:狀態(tài) 2:0 狀態(tài) 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;
/**
* 運行狀態(tài) "成功" 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>
這樣就可以遠程控制了,前臺寫的比較簡單,還可以繼續(xù)優(yōu)化,當然那不是重點,這里就不寫了。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關文章
spring data jpa @Query注解中delete語句報錯的解決
這篇文章主要介紹了spring data jpa @Query注解中delete語句報錯的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
SpringBoot如何優(yōu)雅的整合Swagger Api自動生成文檔
在多人協作的開發(fā)過程中,API文檔不僅可以減少等待,也能保證開發(fā)的持續(xù)進行,這篇文章主要給大家介紹了關于SpringBoot如何優(yōu)雅的整合Swagger Api自動生成文檔的相關資料,需要的朋友可以參考下2021-07-07
在Linux上搭建一個Java部署環(huán)境的詳細步驟
這篇文章主要介紹了在Linux上搭建一個Java部署環(huán)境,安裝jdk有很多種方式,但是我們這里推薦的是使用yum直接安裝openjdk,本文給大家介紹的非常詳細,需要的朋友可以參考下2023-01-01
form-data與x-www-form-urlencoded的區(qū)別以及知識延伸
這篇文章主要給大家介紹了關于form-data與x-www-form-urlencoded的區(qū)別以及知識延伸,form-data和x-www-form-urlencoded都是HTTP請求中用于傳輸表單數據的編碼格式,需要的朋友可以參考下2023-11-11

