我正在尝试查看是否在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]]))
我知道如何实现它?
答案 0 :(得分:3)
必须说我对在Scala中获取绝对URL的问题感到惊讶,在Java中AFAIR它运行良好,无论如何......我怀疑它是否会帮助您确定协议(编辑:正如@MariusSoutier写的那样)
由于Play 2中有no built-in support for SSL,你可能正在使用(或者你应该使用)应用程序前面的某个HTTP服务器,比方说Apache。有一些描述过程的样本和帖子:
所以在设置标题后(如第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
没有这些信息。