【问题标题】:Retrieving port number in Play Framework 2 app在 Play Framework 2 应用程序中检索端口号
【发布时间】:2013-02-20 01:17:11
【问题描述】:

问题是:我如何检索播放正在侦听的端口号,无论它是如何定义的(配置、命令行参数或根本没有)。

这个答案Retrieving port number in-application using Play Framework 必须适用于 Play v1,因为该代码无法编译。

在 Play 2 Java 中有:

Integer port = Play.application().configuration().getInt("http.port");

这不会返回实际的端口号,至少不是在所有情况下。如果 Play 运行为:

run 80 -Dhttp.address=example.com

然后它返回null

如果 Play 运行为

run -Dhttp.port 80 -Dhttp.address=example.com

然后在默认端口 (9000) 上开始播放。

正如 biesior 指出的那样,它通过两次提及端口来起作用:

play -Dhttp.port=80 "run 80"

这当然不是最优的,因为一个是 Play 实际使用的,另一个是它报告的。

但它会回答我关于开发模式的问题。但是,正如文档所述,Play 永远不应该在 prod 中使用 run 运行。那么start 命令的等价物是什么,没有更好、更安全的方法吗? (我对 Java 版本感兴趣,但其他人可能也想了解 Scala。)

【问题讨论】:

  • 请注意...您真的不应该在端口 80 上运行 Play(至少在 Unix 上)。因为这需要您以 root 身份运行 Play,而这样做并不安全。

标签: playframework-2.0


【解决方案1】:

在开发模式下运行你需要使用双符号

play -Dhttp.port=80 "run 80"

不幸的是,你必须对默认端口做同样的事情

play -Dhttp.port=9000 "run 9000"

所以我只是建议编写 shell 脚本(或 Windows 中的 .bat)以便从所有必需的参数开始。

【讨论】:

  • 在生产中,使用start 命令(无参数),我仍然得到null 而不是实际的9000
【解决方案2】:

我正在使用这个 Scala sn-p 来确定 Play 的监听端口。不幸的是,我不得不硬编码一些默认值,以防未指定 -Dhttp.port=...

val listenPort =
  if (!Play.isTest) {
    System.getProperty("http.port", "9000")
  }
  else {
    // Not on classpath: play.api.test.Helpers.testServerPort
    // Instead, duplicate its implementation here:
    System.getProperty("testserver.port", "19001")
  }

我也想知道是否没有更好的方法,例如Play.port 但我什么都没找到——除了你的问题 :-)

(在您的示例中,应该是-Dhttp.port=80 而不是-Dhttp.port 80。)

【讨论】:

    【解决方案3】:

    我刚刚找到了一种获取端口的方法,无论端口是如何指定的。使用反向路由获取 Call 对象,并使用 absoluteUrl() 方法获取您的操作的绝对 url,其中包含端口。代码sn-p:

    public class RouteController extends Controller {
    public  Promise<Result> getPortAction() {
        Call call = com.mycom.routes.RouteController.getPortAction();
        String absoluteUrl = call.absoluteURL(request());
        //Here absoluteUrl would be like http://localhost:9002/...., 9002 would be the port.
        ...
    } }
    

    【讨论】:

    • 如果您可以改进此代码示例,我将支持您的回复。正如您所暗示的,最好询问配置。在寻找端口号时。原则上,你的答案是理想的,但我无法让它发挥作用。
    • 这根本没有帮助,因为“absoluteURL()”方法实际上只计算 URI 的本地路径部分。服务器和端口要么被省略,要么被设置为“absoluteURL()”所包含的任何参数。
    【解决方案4】:

    从 play2.8.x 开始,看起来我们可以使用 RequestHeader.host https://www.playframework.com/documentation/2.8.x/api/java/play/mvc/Http.RequestHeader.html#host-- 与来自另一个问题play framework2: find out if an app is running on http or https 的 RequestHeader.secure 一起,我们甚至还可以确定它是 https 还是 http

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-14
      相关资源
      最近更新 更多