我正在使用Spring MVC编写Java Web应用程序。我有一个后台进程通过数据库查找必须通过电子邮件发送给我的用户的通知。这些电子邮件消息需要包含应用程序的超链接。对于网络应用来说,这似乎是一种相当普遍的模式,但我遇到了麻烦。
如何使用服务器名称和上下文路径派生应用程序的完全限定URL?我无法访问HttpServletRequest中的任何方法,因为我将其作为后台进程运行,而不是响应Web请求。我能做的最好的就是访问ServletContext。
目前我正在将基本URL放入配置文件并在启动时读取它,但是此应用程序将获得许可并部署到客户的应用程序服务器,如果可能的话,我希望他们不必配置这是手动。
答案 0 :(得分:32)
建议不要在运行时动态准备URL,尤其是基于ServletRequest。这主要是因为您不知道用户将用于访问应用程序的URL - 应用程序服务器可能位于Web服务器,防火墙或负载平衡器之后。为了简短起见,我们无法预测网络拓扑结构。
您目前从属性文件中获取URL的技术足以解决上述问题。也许你应该考虑提供一个管理控制台来管理邮件中出现的URL,特别是如果有一个管理控制台,或者有相关的选项应该放在一个。
编辑:我的最后一点与Tony所说的相呼应。
答案 1 :(得分:9)
如果配置文件不存在,为什么没有第一次运行应用程序时出现的设置网页(例如在WEB-INF文件夹中。使用ServletContext,您可以调用getRealPath并获取真实路径一个文件并查看它是否存在()。如果存在,重定向到应用程序开始页面,如果没有,请打开管理页面。
您最好使用ServletContext来读取web.xml中的一些设置,并获取上下文路径,只有HttpRequest可以为您提供FQ URL。
答案 2 :(得分:2)
Servlet 2.5将getContextPath()添加到ServletContext
。更新EE依赖版本肯定应该解决您的问题。
更多信息:
答案 3 :(得分:2)
我认为你可以使用类似的东西:
String host = InetAddress.getLocalHost().getCanonicalHostName();
String appUrl = String.format("http://%s:%s%s", host, port, contextPath);
使用来自ServletContext的port和contextPath。
答案 4 :(得分:0)
如果您的ServletContext不是HttpServletContext的实例,您是否使用调试器进行了检查?如果是这样,投下它,并从那里获取信息。