【问题标题】:Can a Wicket application trigger a restart of itself without a manager password?Wicket 应用程序可以在没有管理员密码的情况下触发自身重启吗?
【发布时间】:2009-12-04 22:39:22
【问题描述】:

我是 Wicket 的新手,希望使用某种维护管理页面从内部维护 Web 应用程序,以运行清理、数据库更新、恢复等。由于我计划使用 Hibernate 或类似的工具进行数据绑定,因此我想从内部触发应用程序的完全重启,而无需向能够运行这些操作的每个人提供随附的 Tomcat 管理器密码。

据我所知,似乎没有一种简单的方法可以在没有管理员密码的情况下触发 Java Web 应用程序的真正重启?但是,由于许多 Java webapp 在其管理面板中具有此类重启功能,我认为应该可以在特定的 servlet 容器或某些 web 框架中触发重启。他们必须以某种方式解决问题? (或者也许他们并没有真正从头开始重新启动,而只是在没有干净重启的情况下重新初始化?)

我找不到任何关于 Wicket 或 Tomcat 能够通过关闭并从其应用程序重新启动来触发的信息,尽管 Wicket 中有一些内部方法可能能够做到这一点? (可以公开访问,但 JavaDoc 建议不要这样做,因为它们仅供内部使用)

从安全的角度来看,我真的不明白为什么应用程序不能从自己的代码中请求重新启动。

可以这样做吗?如果可以,我必须在我的应用程序中做什么才能重新启动它?

编辑:只是为了让我的问题更准确:用户和应用程序都不应该有任何可用于访问 Tomcat 管理器界面的密码。我正在考虑调用一些方法或设置一些标志,以触发 servlet 容器以重新启动该特定应用程序,而无需授权。我的想法是,由于应用程序在 servlet 容器中运行,它应该有某种方式来关闭和重新启动。如果 Java 应用程序服务器通常无法做到这一点,则可能有某种方法可以在应用程序级别通过调用底层框架(在本例中为 Wicket)来结束所有正在运行的线程,尽可能清理并重新启动使用框架的应用程序;类似于应用堆栈的“软重启”。

【问题讨论】:

    标签: java tomcat servlets wicket


    【解决方案1】:

    您的应用正在使用 Wicket 与您的问题几乎无关。这是一个使用 Wicket 框架的 Java Web 应用程序。像这样的措辞,您正在寻找如何使用 Tomcat 容器重新启动 Web 应用程序。如果您选择另一个 Web 应用程序容器(码头等),那么您需要更改程序。

    您可以点击此 URL 来启动应用程序:http://localhost:8080/manager/start?path=/myapphttp://localhost:8080/manager/stop?path=/myapp 来停止您的应用程序。将 /myapp 更改为您的应用程序上下文,您可以控制启动/停止。

    然后您可以在代码内部处理密码问题。

    根据您的说明,您可能会查看 this tomcat documentation 并使用 JMX。但是,即使 JMX 也受密码保护。从您的 Web 应用程序获取容器控件没有标准。

    【讨论】:

    • 但这需要用户拥有管理员密码(以及访问管理员界面的第二个帐户,因为我阻止了对端口 8080 的直接访问并通过具有 HTTP 身份验证的 Apache 代理它)。问题标题可能不够精确:用户应该能够重新启动应用程序,但应用程序本身和用户都不应该使用任何管理员密码以这种方式访问​​管理员。我在想像 getServletContext().restartApplication(); 这样的东西(显然不存在这样的名字)
    • 使用 HttpClient 之类的东西,以及这些 URL,您可以为用户输入密码,因此用户永远看不到它,也永远不必输入它。无法从 Web 应用程序访问容器控件。
    • 一个 cron 作业和 wget 会很好地解决这个问题。一个快速的 bash 脚本,例如: wget --save-cookies cookies.txt \ --post-data 'user=admin&password=mypassword' \ localhost:8080/manager/stop?path=/myapp 使脚本只有 root 可读,您不必担心失去对密码的控制。 wget --load-cookies cookies.txt \ -p localhost:8080/manager/start?path=/myapp
    【解决方案2】:

    我正在尝试思考是否/还有哪些其他 Web 框架真正支持这一点。我认为吉姆正在指出解决方案的正确水平。无论使用什么框架,Web 容器都应该允许重新启动包含的 Web 应用程序。 Tomcat 将要求管理器应用程序可用。看来(从我的谷歌搜索)Jetty 通过 JMX MBeans 公开了这个功能。因此重启功能可能无法在容器之间移植。

    为了使这个可移植,在任何框架中,我认为你必须隔离重启所需的东西。如果它是休眠的,则重新初始化会话工厂。如果是 spring 配置,这肯定会更具侵入性,但替换或重新配置 beans 似乎是要走的路。如果是 i18n 或标记资源检票口,我相信已经可以提供帮助。

    【讨论】:

      【解决方案3】:

      我还鼓励您看看 JMX。您可以关闭 JMX 的身份验证,在这种情况下,请确保无法从 Internet 访问 JMX 端口(过滤基于主机的防火墙上的端口,或仅将其绑定到本地 IP 地址)。 JMX 旨在标准化 Java EE 世界中应用程序和容器的远程监视和控制,因此它或多或少地提供了您正在寻找的基础架构。

      或者使用另一个 Web 容器(最好是嵌入式容器)并处理从您的 Java 代码重新启动的容器。

      【讨论】:

        猜你喜欢
        • 2017-03-18
        • 1970-01-01
        • 2023-03-09
        • 2018-08-13
        • 1970-01-01
        • 2015-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多