0

我们使用带有spring/hibernate的tomcat 9。显然它是一个生产代码并且tomcat管理器不存在。对于 tomcat 加固,我们试图通过代码动态关闭“autoDeploy”。我们可以在 server.xml 中这样做:

<Host appBase="webapps" autoDeploy="false" name="localhost" unpackWARs="true">

可以这样做吗?有没有办法以编程方式做到这一点?

编辑:代码尝试:

package test.servlet;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;

import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.tomcat.util.modeler.Registry;

public class TestServlet extends HttpServlet {
    ObjectName oname = null;
    MBeanServer mBeanServer = null;

    public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {

        String name = request.getParameter("app");

        PrintWriter writer = response.getWriter();

        try {
            oname = new ObjectName("Catalina:type=Deployer,host=localhost");
            mBeanServer = Registry.getRegistry(null, null).getMBeanServer();
            if (!isDeployed(name) && !isServiced(name)) {
                writer.println("deploying application -> " + name);
                addServiced(name);
                try {
                    // Perform new deployment
                    check(name);
                } finally {
                    removeServiced(name);
                }
            }

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    protected void check(String name) throws Exception {
        String[] params = { name };
        String[] signature = { "java.lang.String" };
        mBeanServer.invoke(oname, "check", params, signature);
    }

    protected void addServiced(String name) throws Exception {
        String[] params = { name };
        String[] signature = { "java.lang.String" };
        mBeanServer.invoke(oname, "addServiced", params, signature);
    }

    protected boolean isDeployed(String name) throws Exception {
        String[] params = { name };
        String[] signature = { "java.lang.String" };
        Boolean result = (Boolean) mBeanServer.invoke(oname, "isDeployed", params, signature);
        return result.booleanValue();
    }

    protected boolean isServiced(String name) throws Exception {
        String[] params = { name };
        String[] signature = { "java.lang.String" };
        Boolean result = (Boolean) mBeanServer.invoke(oname, "isServiced", params, signature);
        return result.booleanValue();
    }

    protected void removeServiced(String name) throws Exception {
        String[] params = { name };
        String[] signature = { "java.lang.String" };
        mBeanServer.invoke(oname, "removeServiced", params, signature);
    }
}

4

2 回答 2

0

不,它不能,因为您不能autoDeploy="false"从 Java 代码中设置。

配置它的唯一方法是在server.xml.

于 2020-07-30T13:56:52.233 回答
0

我想您必须同时禁用 deployOnStartup 和 autoDeploy 。

来自 Tomcat 9 文档的主机参考:

autoDeploy : 此标志值指示 Tomcat 是否应在 Tomcat 运行时定期检查新的或更新的 Web 应用程序。如果为 true,Tomcat 会定期检查 appBase 和 xmlBase 目录并部署任何新的 Web 应用程序或找到的上下文 XML 描述符。更新的 Web 应用程序或上下文 XML 描述符将触发 Web 应用程序的重新加载。该标志的值默认为 true。

deployOnStartup:此标志值指示是否应在 Tomcat 启动时自动部署来自该主机的 Web 应用程序。该标志的值默认为 true。

如果禁用 deployOnStartup 和 autoDeploy,则需要通过 server.xml 中的 Context 元素显式配置管理器应用程序,然后使用它来部署其他 WAR 文件/目录。

autodeploy="false"注意:您可以通过设置 -在您的server.xml文件中禁用自动部署。

阅读更多:Apache Tomcat 9 配置参考

于 2020-07-30T13:51:34.573 回答