仅使用ServletContext查找应用程序的URL

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

如何通过服务器名称和上下文path派生我的应用程序的完全限定URL? 我没有访问HttpServletRequest中的任何方法,因为我将此作为后台进程运行,而不是响应Web请求。 我能做的最好的就是访问ServletContext。

目前,我将基本URL放入configuration文件并在启动时读取,但是这个应用程序将被许可并部署到客户的应用程序服务器,如果可能的话,我希望他们不必手动configuration。

不build议在运行时dynamic准备URL,特别是基于ServletRequest。 这主要是因为您不知道用户将用于访问应用程序的URL – 应用程序服务器可能位于Web服务器,防火墙或负载均衡器之后。 为了保持简短,不能预测networking拓扑。

目前从属性文件中获取URL的技术足以解决上述问题。 也许你应该考虑提供一个pipe理控制台来pipe理出现在邮件中的URL,特别是如果有一个pipe理控制台,或者有相关的选项应该进入一个。

编辑:我的最后一点回应了托尼所说的。

如果configuration文件不存在(例如,在WEB-INF文件夹中),为什么没有第一次运行应用程序的安装网页?使用ServletContext,可以调用getRealPath并获取文件的真实path,看看它是否存在(),如果是的话,redirect到应用程序的开始页面,如果没有,打开pipe理页面)。

使用ServletContext所做的最好的select是从web.xml读取一些设置,并获取上下文path,只有HttpRequest可以为您提供FQ URL。

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

更多信息:

  • 从Spring Web应用程序中检索servlet上下文path
  • Web上下文根是否有一个内置的Spring环境variables?
  • 如何在Servlet 2.4的init()方法中获取ContextPath

我想你可以使用像这样的东西:

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

用ServletContext的port和contextPath。

如果你的ServletContext不是HttpServletContext的一个实例,你用debugging器检查过吗? 如果是的话,投它,并从那里获取信息。