2012-12-23 40 views
1

運行我試圖找出一個玩2(使用Scala)應用程序是在HTTP上運行或https發揮framework2:找出如果一個應用程序是在HTTP或HTTPS

我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轉變成一個請求,但我得到了以下錯誤

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

任何想法我怎麼能實現它?

回答

3

必須說,我很驚訝,在斯卡拉獲得絕對URL的問題,AFAIR在Java中它工作得很好,反正...我懷疑它是否能夠幫助您確定協議(編輯:作爲@MariusSoutier寫道: )

由於Play 2中有no built-in support for SSL很可能是您正在使用(或者您應該使用)某個HTTP服務器在您的應用程序前面,比方說Apache。有一些樣品和職位描述proccess:

  1. 看一看話題:How to config PlayFramework2 to support SSL?納西爾給有配置Apache作爲播放
  2. 代理的樣本也有不少世界configuring Apache as a proxy警告很好的說明職位描述播放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

首先,通過創建一個絕對URL,你無法找到,如果應用程序是在HTTP或HTTPS運行 - 看一看方法簽名:

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

這是正確的,你必須告訴這種方法是否需要安全。

我認爲這是因爲Play被設計用於使用加密請求透明的反向代理。這意味着Play不應該關心這一點。 absoluteURL只能強制使用https URL,例如以確保登錄頁面使用https。

根據你的反向代理,你可以設置一個自定義的http頭,告訴你使用了什麼。 RequestHeader沒有該信息。

相關問題