验证网络套接字Handshake-Play scala中的url参数



我正在Play Framework 2.3中使用scala语言开发一个web套接字方法。我有下面的代码来验证web套接字中的用户。

   def speak = WebSocket.tryAcceptWithActor[JsValue, JsValue] { request =>
    Future.successful(request.session.get("user") match {
      case None    => Left(Forbidden)
      case Some(_) => Right(SpeakWs.props _)
    })
  }

但我想验证从web套接字URL传递的数据库中的"session_id"。我的网络套接字调用如下。

ws://localhost:9000/speak?session_id=dsf76asdfasdeqrweqr34

我可以从web套接字中的URL获取session_id,如下所示。

   def speak = WebSocket.tryAcceptWithActor[JsValue, JsValue] { request =>
    var session_id = getSessionIdFromURL(request.uri)
    ...
  }
  def getSessionIdFromURL(url: String) = {
    var splitedPath: Array[String] = new Array[String](2)
    splitedPath = url.split("=")
    val session_id: String = splitedPath(1)
  }

如何验证数据库中的session_id,并在其有效的情况下进行握手?

(即)如何验证session_id而不是"request.seession.get("user")match"?

我是新开发的。所以我不知道该怎么做。。。

有人帮我做这个吗?

尝试

def speak = WebSocket.tryAcceptWithActor[JsValue, JsValue] { request =>
    Future.successful(request.session.get("user") match {
      case None    => Left(Forbidden)
      case Some(_) => 
        validateSessionId(request.uri) match {
            case true => Right(SpeakWs.props _)
            case false => Left(Forbidden)
        }
    })
  }

还添加另一个方法来验证数据库中的会话id。

def validateSessionId(uri: String): Boolean = {
    val sessionId = getSessionIdFromUrl(uri)
    databaseConnector.findSessionById(sessiondId).map {
        case true => true
        case false => false
    }
}

你还没有指定你正在使用的驱动程序,所以恐怕你必须自己弄清楚实现。如果你把这些细节放在你的问题中,我也可以帮忙。

您也不需要在getSessionFromUrl方法中初始化splittedPath变量,您可以执行类似于下面的操作,编译器将推断类型:

def getSessionIdFromURL(url: String) = {
    val splitedPath = url.split("=")
    splitedPath(1)
}

相关内容

  • 没有找到相关文章

最新更新