2

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

どうすればそれを達成できますか?

4

2 に答える 2

4

とにかく、Scalaで絶対URLを取得する際の問題、JavaでAFAIRがうまくいくことに驚いていると言わなければなりません...プロトコルを決定するのに役立つかどうかは疑問です(編集:@MariusSoutierが書いたように)

Play 2には組み込みの SSL のサポートがないため、アプリケーションの前で HTTP サーバーを使用している (または使用する必要がある) 可能性が最も高いでしょう。Apache としましょう。プロセスを説明するいくつかのサンプルと投稿があります。

  1. トピックを見てください: SSL をサポートするように PlayFramework2 を構成する方法は? Nasir は、Play のプロキシとして Apache を設定するサンプルを提供しています。
  2. Apache をプロキシとして設定することについての素晴らしい説明もあります(投稿では Play 1.x について説明していますが、Apache の部分は同じです)
  3. 最後に、アプリに転送される適切なヘッダーを設定する必要があります

したがって、ヘッダーを設定した後 (ポイント 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);
}
于 2012-12-23T11:23:44.303 に答える
3

まず、絶対 URL を作成すると、アプリが http または https で実行されているかどうかを確認できません。メソッド シグネチャを見てください。

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

そうです、安全が必要かどうかをこのメソッドに伝える必要があります。

これは、暗号化されたリクエストを透過的に使用できるようにするリバース プロキシの背後で Play が動作するように設計されているためだと思います。これは、Play がこれを気にする必要がないことを意味します。absoluteURLたとえば、ログイン ページで確実に https が使用されるようにするために、https URL のみを適用できます。

リバース プロキシによっては、何が使用されているかを示すカスタム http ヘッダーを設定できます。RequestHeader情報を持っていません。

于 2012-12-23T11:08:52.627 に答える