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()添加到了
更多信息在这里:
- 从Spring Web应用程序检索Servlet上下文路径
- Web上下文根是否有内置的Spring环境变量?
- 如何在Servlet 2.4版的init()方法中获取ContextPath