Grails:WAR 文件部署:查找端口

Grails: WAR file deployment : Finding the port

我有一个 Grails 2.3.6 应用程序 运行ning 作为服务器中的 WAR 文件。目前 运行 宁 Tomcat 7.

将来我们可能也会在其他服务器上安装该应用程序 运行。

现在我面临的问题是独一无二的。在其中一个服务 groovy 文件中,我需要获取 运行ning 应用程序的端口号。

对于 Tomcat,端口号设置在 server.xml 中,一种可能的获取方法是从那里读取。

但我正在寻找更通用的解决方案。这样即使 WAR 文件部署在其他类型的服务器上,我也可以获得端口号。

欢迎提出任何建议!

端口(单数)不一定定义明确,例如您可以将 Tomcat 配置为多个连接器,这些连接器侦听不同的端口,或者同时提供 http 和 https。在特定请求的上下文中,您可以谈论 "the port" 收到该请求,但是如果您的应用位于反向代理或负载平衡器之后会发生什么...

唯一可靠的方法是在配置文件中手动指定适当的端口 number/URL/whatever(例如 grails.config.locations 外部端口)。

您可能需要将 grails.serverURL 配置 属性 设置为应用程序的根目录。在 development 环境中,这通常类似于

grails.serverURL = "https://localhost:8080/example"

并且在 production 环境中

grails.serverURL = "https://example.org"

如果您没有正确设置,某些功能将无法使用,例如生成绝对 URL。如果此 属性 设置正确,那么获取服务中的端口就像:

class MyService {

  def grailsApplication

  Integer getPort() {
    String basePath = grailsApplication.config.grails.serverURL
    // parse out the path (exercise for reader)
  }
}

如果您需要服务中的端口,您可以从 HttpServletRequest 中获取,如下所示:

HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest()
def port = request.getServerPort()