gpt4 book ai didi

scala - 如何强制 Play framework 2 始终使用 SSL?

转载 作者:太空宇宙 更新时间:2023-11-03 12:39:02 26 4
gpt4 key购买 nike

我有一个在 Heroku 上运行的 Play Framework 应用程序,使用 Heroku 的 SSL 端点。

我想让所有页面仅通过 SSL 可用。

最好的方法是什么?

到目前为止,我最好的解决方案是在我的 GlobalSettings 中使用 onRouteRequest 并将 non-SSL 请求路由到一个特殊的重定向处理程序:

override def onRouteRequest(request: RequestHeader): Option[Handler] = {
if (Play.isProd && !request.headers.get("x-forwarded-proto").getOrElse("").contains("https")) {
Some(controllers.Secure.redirect)
} else {
super.onRouteRequest(request)
}
}

package controllers

import play.api.mvc._

object Secure extends Controller {

def redirect = Action { implicit request =>
MovedPermanently("https://" + request.host + request.uri)
}
}

有没有办法完全从 GlobalSettings 中做到这一点?或者更好的东西?

最佳答案

这是使用过滤器的另一种方式。这也使用严格的传输安全性来确保 future 的请求转到 https。

object HTTPSRedirectFilter extends Filter with Logging {

def apply(nextFilter: (RequestHeader) => Future[SimpleResult])(requestHeader: RequestHeader): Future[SimpleResult] = {
//play uses lower case headers.
requestHeader.headers.get("x-forwarded-proto") match {
case Some(header) => {
if ("https" == header) {
nextFilter(requestHeader).map { result =>
result.withHeaders(("Strict-Transport-Security", "max-age=31536000"))
}
} else {
Future.successful(Results.Redirect("https://" + requestHeader.host + requestHeader.uri, 301))
}
}
case None => nextFilter(requestHeader)
}
}
}

关于scala - 如何强制 Play framework 2 始终使用 SSL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19147147/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com