play framework2:查看应用是否在http或https上运行

时间:2012-12-23 01:23:45

标签: url playframework-2.0 router

我正在尝试查看是否在http或https上播放了一个播放2(使用scala)应用

我尝试使用routes.Application.index.absoluteURL(请求),就像这样

def chatUri(username: String)(implicit request: RequestHeader): String = {

  val uri = routes.Application.index.absoluteURL(request)

但是我收到以下错误:

/home/sas/tmp/websocket-chat/app/controllers/Application.scala:51: overloaded method value absoluteURL with alternatives:
[error]   (secure: Boolean)(implicit request: play.api.mvc.RequestHeader)java.lang.String <and>
[error]   (play.mvc.Http.Request)java.lang.String
[error]  cannot be applied to (play.api.mvc.RequestHeader)
[error]     val rootUri = Uri(routes.Application.index.absoluteURL(request))

我尝试将RequestHeader转换为Request,但是我收到以下错误

val rootUri = Uri(routes.Application.index.absoluteURL(request.asInstanceOf[Request[Any]]))

(secure: Boolean)(implicit request: play.api.mvc.RequestHeader)java.lang.String <and>
[error]   (play.mvc.Http.Request)java.lang.String
[error]  cannot be applied to (play.api.mvc.Request[Any])
[error]     val rootUri = Uri(routes.Application.index.absoluteURL(request.asInstanceOf[Request[Any]]))

我知道如何实现它?

2 个答案:

答案 0 :(得分:3)

必须说我对在Scala中获取绝对URL的问题感到惊讶,在Java中AFAIR它运行良好,无论如何......我怀疑它是否会帮助您确定协议(编辑:正如@MariusSoutier写的那样)

由于Play 2中有no built-in support for SSL,你可能正在使用(或者你应该使用)应用程序前面的某个HTTP服务器,比方说Apache。有一些描述过程的样本和帖子:

  1. 看看主题:How to config PlayFramework2 to support SSL? Nasir给出了一个将Apache配置为Play代理的示例
  2. 还有configuring Apache as a proxy的好描述(警告 这些帖子描述了Play 1.x,但Apache部分将是相同的
  3. 最后,您需要将proper headers which will be forwarded设置为您的应用
  4. 所以在设置标题后(如第3点所示),您将能够在控制器中进行检查:

    def index = Action { request =>
        val proto = request.headers("X-FORWARDED-PROTO")
        Ok("Got request [" + request + "] with schema: " + proto )
    }
    

    或Java控制器中的相同内容:

    public static Result index() {
        String proto = request().getHeader("X-FORWARDED-PROTO");
        return ok("Got request [" + request() + "] with schema: " + proto);
    }
    

答案 1 :(得分:2)

首先,通过创建绝对URL,您无法确定应用程序是在http或https上运行 - 请查看方法签名:

def absoluteURL (secure: Boolean = false)(implicit request: RequestHeader): String

没错,您必须告诉此方法是否需要安全。

我认为这是因为Play旨在在反向代理之后工作,这使得使用加密请求变得透明。这意味着Play不应该关心这一点。 absoluteURL只能强制执行https网址,例如确保登录页面使用https。

根据您的反向代理,您可以设置一个自定义http标头,告诉您使用的是什么。 RequestHeader没有这些信息。