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

2022-08-31 20:39:11

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

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

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


答案 1

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

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

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


答案 2

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

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


推荐