我正在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)
}