java 如何远程控制tomcat启动关机

 更新时间:2021年04月19日 10:28:53   作者:白彬2017  
这篇文章主要介绍了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正在运行的项目以及它们的状态。

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>

这样就可以远程控制了,前台写的比较简单,还可以继续优化,当然那不是重点,这里就不写了。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

相关文章

  • Spring控制bean加载顺序使用详解

    Spring控制bean加载顺序使用详解

    在使用spring框架开发过程中,我们可能会遇到某个bean被另一个bean依赖,也就是bean-b的创建必须依赖bean-a等问题,类似这样的场景还有很多,总结来说,这就涉及到bean的加载顺序问题,如何解决呢,本文将给大家列举出几种常用的解决方案,需要的朋友可以参考下
    2023-09-09
  • spring data jpa @Query注解中delete语句报错的解决

    spring data jpa @Query注解中delete语句报错的解决

    这篇文章主要介绍了spring data jpa @Query注解中delete语句报错的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 五个很实用的IDEA使用技巧分享

    五个很实用的IDEA使用技巧分享

    IntelliJ IDEA 是一款优秀的 Java 集成开发环境,它提供了许多强大的功能和快捷键,可以帮助开发者提高编码效率和质量,本文就在为你介绍博主常用的五个IntelliJ IDEA使用技巧,希望能够给你带来一些工作效率上的提升
    2023-10-10
  • SpringBoot如何优雅的整合Swagger Api自动生成文档

    SpringBoot如何优雅的整合Swagger Api自动生成文档

    在多人协作的开发过程中,API文档不仅可以减少等待,也能保证开发的持续进行,这篇文章主要给大家介绍了关于SpringBoot如何优雅的整合Swagger Api自动生成文档的相关资料,需要的朋友可以参考下
    2021-07-07
  • 在Linux上搭建一个Java部署环境的详细步骤

    在Linux上搭建一个Java部署环境的详细步骤

    这篇文章主要介绍了在Linux上搭建一个Java部署环境,安装jdk有很多种方式,但是我们这里推荐的是使用yum直接安装openjdk,本文给大家介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • Java字母加数字组合比较大小

    Java字母加数字组合比较大小

    这篇文章主要通过实现Comarable接口来比较(如"a20"和"a9"这种)字符串的大小,希望能给大家做一个参考。
    2016-06-06
  • 使用synchronized关键字实现信号量的方法

    使用synchronized关键字实现信号量的方法

    在Java中,信号量(Semaphore)是一种常用的同步工具,它可以用来控制对共享资源的访问数量,下面,我们将使用Synchronized关键字来实现一个简单的信号量,我们的目标是实现一个计数信号量,其中信号量的计数指示可以同时访问某一资源的线程数,需要的朋友可以参考下
    2024-04-04
  • form-data与x-www-form-urlencoded的区别以及知识延伸

    form-data与x-www-form-urlencoded的区别以及知识延伸

    这篇文章主要给大家介绍了关于form-data与x-www-form-urlencoded的区别以及知识延伸,form-data和x-www-form-urlencoded都是HTTP请求中用于传输表单数据的编码格式,需要的朋友可以参考下
    2023-11-11
  • SpringBoot参数验证的几种方式小结

    SpringBoot参数验证的几种方式小结

    在日常的接口开发中,为了防止非法参数对业务造成影响,经常需要对接口的参数进行校验,例如登录的时候需要校验用户名和密码是否为空,所以本文介绍了SpringBoot参数验证的几种方式,需要的朋友可以参考下
    2024-07-07
  • Java中调用第三方接口的几种方法详细指南

    Java中调用第三方接口的几种方法详细指南

    在Java开发中调用第三方接口是常见需求,本文介绍如何使用Java进行接口调用,重点讲解HttpURLConnection类、OkHttp库和ApacheHttpClient的使用,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-10-10

最新评论