7

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

这个答案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 永远不应该run在 prod 中运行。那么start命令的等价物是什么,没有更好,更安全的方法吗?(我对 Java 版本感兴趣,但其他人可能也想了解 Scala。)

4

4 回答 4

3

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

play -Dhttp.port=80 "run 80"

不幸的是,您必须对默认端口执行相同的操作

play -Dhttp.port=9000 "run 9000"

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

于 2013-02-20T05:52:17.147 回答
0

我正在使用这个 Scala 片段来确定 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。)

于 2014-01-25T17:21:16.107 回答
0

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

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.
    ...
} }
于 2015-03-02T06:03:18.160 回答
0

从 play2.8.x 开始,看起来我们可以使用 RequestHeader.host https://www.playframework.com/documentation/2.8.x/api/java/play/mvc/Http.RequestHeader.html#host-- 并且与另一个问题play framework2 中的 RequestHeader.secure 一起:找出应用程序是在 http 还是 https 上运行,我们甚至还可以确定它是 https 还是 http

于 2021-12-02T09:54:57.147 回答