0

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

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

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

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

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

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

4

3 回答 3

2

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

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

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

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

于 2009-12-04T23:18:43.657 回答
1

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

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

于 2009-12-21T04:29:01.250 回答
0

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

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

于 2009-12-27T06:38:31.820 回答