【问题标题】:Using ScalaInterceptors to catch HTTPS in Play! 2.2?在 Play 中使用 ScalaInterceptors 捕获 HTTPS! 2.2?
【发布时间】:2014-04-24 20:14:15
【问题描述】:

我正在尝试制作一个查找 X-Forwarded-Proto 标头的 ScalaInterceptor,所以基本上如果它在生产中或在代理后面,那么 Play!自动重定向到 SSL。

我在编译这段代码时遇到了问题,我也不确定这是否适用于 SecureSocial 插件。我们没有在 SecureSocial.conf 中设置 SSL=true 的具体原因我不会在此详述。

这是我的 Global.scala 中的内容

  def WithHttpsRedirect[A](action: Action[A]): Action[A] = {
    Action(action.parser) { request =>
      val result = action(request)
      request.headers.get("X-Forwarded-Proto").collect {
        case "https" =>
          result

        case "http" =>
          val url = "https://"+request.host+request.uri
          Redirect(url)

      } getOrElse {
        result
      }
    }
  }

  override def onRouteRequest(request: RequestHeader): Option[Handler] = {
    super.onRouteRequest(request).map { handler =>
      handler match {
        case a: Action[_] => WithHttpsRedirect(a)
        case _ => handler
      }
    }
  }

getOrElse 之后出现编译器错误:

[error]  found   : scala.concurrent.Future[play.api.mvc.SimpleResult]
[error]  required: play.api.mvc.Result
[error]         result
[error]         ^

非常感谢您的帮助!

【问题讨论】:

    标签: scala playframework playframework-2.2 securesocial


    【解决方案1】:

    替换:

    Action(action.parser) { request =>
    

    与:

    Action.async(action.parser) { request =>
    

    您还需要替换:

    Redirect(url)
    

    与:

    Future.successful(Redirect(url))
    

    【讨论】:

    • 我实际上只是制作了一个扩展过滤器,我会发布它:)
    【解决方案2】:

    改变了我的攻击方法,而是实现了一个过滤器而不是覆盖onRouteRequest

    Global.scala 中:

    object Global extends WithFilters(HttpsFilter) with GlobalSettings

    然后HttpsFilter.scala

    import play.api.mvc.Results._
    import play.api.mvc.{SimpleResult, RequestHeader, Filter}
    import scala.concurrent._
    import ExecutionContext.Implicits.global
    
    object HttpsFilter extends Filter {
    
      def apply(next: (RequestHeader) => Future[SimpleResult])(request: RequestHeader): Future[SimpleResult] = {
        request.headers.get("X-Forwarded-Proto").collect {
          case "https" =>
            next(request)
    
          case "http" =>
            val url = "https://"+request.host+request.uri
            Future{ Redirect(url) }
    
        } getOrElse {
          next(request)
        }
      }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-22
      • 1970-01-01
      • 1970-01-01
      • 2014-10-01
      相关资源
      最近更新 更多