如何从 ServletContextListener 中查询 servlet 容器以获取有效 URL?
Posted
技术标签:
【中文标题】如何从 ServletContextListener 中查询 servlet 容器以获取有效 URL?【英文标题】:How to query the servlet container to obtain effective URL from a ServletContextListener? 【发布时间】:2012-01-18 08:44:39 【问题描述】:在this question 的扩展中,有没有办法从 ServletContextListener 的范围内获取同一容器中特定页面的有效 URL?
我需要这个的一些背景知识:
在一个相当复杂的系统中,我设置了一个简单的 servlet,以 JSON 格式显示当前信息,以便我可以轻松地按需显示。
现在我想更进一步,保持历史记录,看看这些测量点在时间上的演变。
我已经设置了一个简单的 ServletContextListener,它启动一个线程以在设定的时间间隔轮询同一页面,我可以将数据保存到文件中,以便以后读取。
一切正常,除了我必须通过配置手动指定目标页面的 URL。如果我能以编程方式获取这些数据,它将减少一个可能出错的配置点。我认为这应该不会太难,因为一切都源于相同的上下文,但事实证明这显然不是那么简单。由于一切都紧密联系在一起,并且该线程在服务器上运行,因此主机地址可以硬编码为 localhost。也就是说,我仍然需要获取 webapp 的端口和基本路径。从那里我可以接管,因为我知道 webapp 的结构。
那么...我怎样才能以编程方式获取这些信息,并让以后部署应用程序的可怜的 sap 生活更轻松!
【问题讨论】:
【参考方案1】:不确定如何通过 API 进行操作。
但是如果你能负担得起懒惰地,那么我的想法是安装一个过滤器来查看第一个进来的请求,检索使用的端口/服务器,然后该信息在应用程序范围内可用。
然后您的 ServletContextListener 可以从那里检索它吗?
但是 - 正如其他问题中的评论所述 - 您可能有任意数量的“外部” URL 或端口映射到您的实例。但是我想知道一个就足够了,那为什么不拿第一个呢?
【讨论】:
确实.. 一个就够了!为什么这么难得到我们的手!您提出的建议可行,但我必须以编程方式强制执行理想的查询,这只会取代问题。【参考方案2】:这是可能的,但它并不漂亮,它会将你绑定到一个特定的容器。简而言之,它有点像黑客,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 中,并且一旦我进入正确的上下文,服务的路径就已知,我们只需要知道端口和上下文根路径。
如果您尝试此操作并遇到问题,请编辑答案或离开 cmets,以便我们都能从您的经验中受益。
【讨论】:
啊,如果您允许自己使用容器特定的代码/配置,那是有意义的。而且更简单=更好。需要注意的是,对于包括 JBoss 和 WebLogic 在内的许多容器,您可以通过 JMX 获取相同的数据。幸运你有 Jetty :-) 试试这个我收到了javax.ws.rs.WebApplicationException
,因为org.mortbay.jetty.servlet.Context$SContext cannot be cast to org.mortbay.jetty.webapp.WebAppContext
以上是关于如何从 ServletContextListener 中查询 servlet 容器以获取有效 URL?的主要内容,如果未能解决你的问题,请参考以下文章
如何将数据从回收器适配器发送到片段 |如何从 recyclerview 适配器调用片段函数
如何从服务器获取和设置 android 中的 API(从服务器获取 int 值)?如何绑定和实现这个