关于java:仅使用ServletContext查找应用程序的URL

Finding your application's URL with only a ServletContext

我正在使用Spring MVC编写Java Web应用程序。我有一个后台进程,该进程遍历数据库并找到必须通过电子邮件发送给我的用户的通知。这些电子邮件需要包含指向应用程序的超链接。这似乎是Web应用程序的一种相当常见的模式,但是我遇到了麻烦。

如何使用服务器名称和上下文路径导出应用程序的标准URL?我无权访问HttpServletRequest中的任何方法,因为我将其作为后台进程运行,而不是响应Web请求。我能做的最好的就是访问ServletContext。

当前,我将基本URL放入配置文件中,并在启动时读取它,但是此应用程序将获得许可并部署到客户的应用程序服务器,如果可能的话,我希望他们不必进行配置手动操作。


不建议在运行时动态准备URL,尤其是基于ServletRequest时。这主要是因为您不知道用户将用于访问应用程序的URL-应用程序服务器可能位于Web服务器,防火墙或负载平衡器之后。为了简短起见,人们无法预测网络拓扑。

您当前从属性文件中获取URL的技术足以解决上述问题。也许您应该考虑提供一个管理控制台来管理邮件中显示的URL,尤其是在存在管理控制台的情况下,或者应该将相关选项整合到其中时。

编辑:我的最后一点与托尼所说的相呼应。


如果配置文件不存在(例如,在WEB-INF文件夹中),为什么没有首次运行应用程序的安装程序网页(例如,在WEB-INF文件夹中。使用ServletContext,您可以调用getRealPath并获取以下内容的真实路径)一个文件,然后查看它是否存在()。如果存在,则重定向到应用程序开始页面,如果不存在,则打开管理页面)。

您对ServletContext所做的最好的工作是从web.xml中读取一些设置,并获取上下文路径,只有HttpRequest才能为您提供FQ URL。


我认为您可以使用以下内容:

1
2
String host = InetAddress.getLocalHost().getCanonicalHostName();
String appUrl = String.format("http://%s:%s%s", host, port, contextPath);

带有来自ServletContext的端口和contextPath。


Servlet 2.5将getContextPath()添加到了ServletContext。更新EE依赖版本肯定可以解决您的问题。

更多信息在这里:

  • 从Spring Web应用程序检索Servlet上下文路径
  • Web上下文根是否有内置的Spring环境变量?
  • 如何在Servlet 2.4版的init()方法中获取ContextPath