java - 如何查询 servlet 容器以从 ServletContextListener 获取有效 URL?

标签 java url jetty port servlet-listeners

扩展到 this question有没有办法从 ServletContextListener 的范围获取同一容器中特定页面的有效 URL?

我需要这个的一些背景知识:

在一个相当复杂的系统中,我设置了一个简单的 servlet 以 JSON 格式显示当前信息,以便我可以根据需要轻松显示它。

现在我想更进一步,保留这方面的历史记录,以查看这些测量点随时间的演变。

我已经设置了一个简单的 ServletContextListener,它启动一个线程以设置的时间间隔轮询同一页面,我可以将数据保存到文件中,以便稍后读取。

一切正常,只是我必须通过配置手动指定目标页面的 URL。如果我能以编程方式获取这些数据,就会减少一个可能出错的配置点。我认为这不应该太难,因为一切都源于相同的背景,但事实证明这显然不是那么简单。由于一切都紧密联系在一起,并且该线程在服务器上运行,因此主机地址可以硬编码为 localhost。也就是说,我仍然需要获取 web 应用程序的端口和基本路径。我可以从那里接管,因为我知道 webapp 中的结构。

那么...我怎样才能以编程方式获取该信息,并使以后部署该应用程序的可怜的 sap 的生活更轻松!

最佳答案

这是可能的,但它并不漂亮,它会将您绑定(bind)到特定的容器。简而言之,这有点骇人听闻,YMMV。以下解决方案适用于 Jetty。

在 contextInitialize 中,您可以像这样访问 WebAppContext :

public void contextInitialized(ServletContextEvent sce) {
    WebAppContext ctx = (WebAppContext) sce.getServletContext();
    System.out.println("context Base Path" + ctx.getContextPath());
    System.out.println("Getting the port is a bit trickier");
    System.out.println("One valid Port = " + ctx.getServer().getConnectors()[0].getPort());
}

为了简洁起见,我删除了一些检查和验证,但这应该足以理解这个想法……根据您的口味添加调味料。

在这里,您可能会通过不同的执行得到不同的答案。由于目标是调用服务,因此我们是否获得原始声明或别名无关紧要,重要的是调用成功。

最后,由于目标 IP 地址是已知的 (localhost),因为工作线程与目标地址位于同一 JVM 中,一旦我进入正确的上下文,服务的路径是已知的,我们只需要知道端口和上下文根路径。

如果您尝试此操作但遇到问题,请编辑答案或发表评论,以便我们都能从您的体验中受益。

关于java - 如何查询 servlet 容器以从 ServletContextListener 获取有效 URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8472916/

相关文章:

java - Maven 依赖冲突 : org. w3c.dom.ElementTraversal

java - Jersey HK2 依赖性错误

http-headers - 使用 Jetty 和 Apache CXF 时如何消除重复的日期 header ?

Java 语言规范 - 无法理解 'BlockStatement'

php - 在 Laravel 中将变量插入 Redirect::to

java - 关于 Java 动态转换的大学任务

java - Thymeleaf 上下文 URL 处理 - 如何将语言代码添加到上下文相关 URL (Spring + Thymeleaf)

c# - 如何使用此策略更改 Silverlight 应用程序的 URL?

java - java中调用非静态消息传递函数

Java注解处理API访问import语句