51

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

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

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

4

4 回答 4

33

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

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

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

于 2009-03-24T01:51:26.790 回答
8

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

你可以用 ServletContext 做的最好的事情是从 web.xml 中读取一些设置,并获取上下文路径,只有 HttpRequest 可以给你 FQ URL。

于 2009-03-24T01:04:24.347 回答
2

我认为你可以使用类似的东西:

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

使用来自 ServletContext 的端口和 contextPath。

于 2016-07-05T12:57:10.037 回答
1

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

更多信息在这里:

于 2015-10-27T08:38:15.197 回答