2015-10-28 53 views
0

我正在開發一個在Play Framework 2.3中使用scala語言的web套接字方法。我有下面的代碼來驗證Web套接字中的用戶。驗證web套接字中的url參數握手 - 玩scala

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) 
    } 

如何驗證在DB的SESSION_ID並做握手,如果它是有效的?

(即)而不是 「request.session.get(」 用戶 「)相匹配」 的,我怎麼驗證SESSION_ID?

我是新來的發展。所以我不知道該怎麼做...

有人幫我做這個嗎?

回答

1

嘗試

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) 
} 
+0

謝謝。我會試試看。 – SKK