本文介绍了播放框架2:查看应用程序是在http上运行还是在HTTPS上运行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试找出Play 2(带有Scala)应用程序是否在http或HTTPS上运行

我尝试这样处理routes.Application.index.absoluteURL(request),

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转换为请求,但收到以下错误

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]]))

您知道我如何才能做到这一点吗?

推荐答案

我必须说,我对在Scala中获取绝对URL的问题感到惊讶,尽管在Java中它工作得很好,但无论如何……我怀疑它是否会帮助您确定协议(编辑:正如@MariusSoutier所写)

因为在实演2中有no built-in support for SSL,所以很可能您正在(或应该使用)某个HTTP服务器在您的应用程序前面,我们假设您使用的是Apache.有一些示例和帖子描述了这一过程:

  1. 查看主题:How to config PlayFramework2 to support SSL?纳斯尔给出了一个将阿帕奇配置为播放代理的示例
  2. configuring Apache as a proxy也有很好的描述(警告帖子描述了Play 1.x,但Apache部分将是相同的)
  3. 最后,您需要将proper headers which will be forwarded设置为您的应用

因此,在设置标头之后(如第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);
}

这篇关于播放框架2:查看应用程序是在http上运行还是在HTTPS上运行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-11 13:58