서블릿 세계에는 요청한 정보를 올바른 데이터로 라우팅하기 위해 내게 안성맞춤 인 서비스를 누리고있는 사람을 식별 할 수있는 쿠키와 HttpSession과 같은 것이 있습니다. Sec-WebSocket-Key를 클라이언트 연결을 식별하는 쿠키 인 것처럼 사용하는 것이 좋습니다.Secs-WebSocket-Key를 사용하여 websocket 클라이언트 연결을 식별하는 것이 좋습니다.
구체적으로 말하면 데크 응용 프로그램 (socko-examples)에서 시작하는 websocket 서버를 구현하기 위해 socko scala 라이브러리 (netty 기반 akka 웹 서버)를 사용하고 있습니다. Socko는 netty Channel을 래핑하고 WebSocketFrame을 애플리케이션 코드에 전달합니다. 그런 다음 이전에 최종 사용자 데이터 (예 : 쇼핑 바구니)에 연결된 클라이언트 연결에 대한 "일부 ID"를 기반으로 들어오는 데이터 프레임을 발송하려고합니다. 이렇게하려면 Secs-WebSocket-Key http 헤더를 원래 websocket 핸드 셰이크의 http 헤더를 파고 애플리케이션에 들어오는 객체의 최상위 속성 인 것처럼 확장 메소드를 작성했습니다.
package org.mashupbots.socko.examples.websocket
// pimp my library pattern to add extension method
object ChatWebSocketExtensions {
import org.mashupbots.socko.events.WebSocketFrameEvent
class WebSocketFrameEventWithSecWebSocketKey(wsFrame: WebSocketFrameEvent) {
def secWebSocketKey: String = {
wsFrame.initialHttpRequest.headers.get("Sec-WebSocket-Key").getOrElse("null")
}
}
implicit def webSocketFrameEventWithSecWebSocketKey(wsFrame: WebSocketFrameEvent) = new WebSocketFrameEventWithSecWebSocketKey(wsFrame)
import org.mashupbots.socko.events.WebSocketHandshakeEvent;
class WebSocketHandshakeEventWithSecWebSocketKey(event: WebSocketHandshakeEvent) {
def secWebSocketKey: String = {
val option = Option(event.nettyHttpRequest.getHeader("Sec-WebSocket-Key"))
return option.getOrElse("null");
}
}
implicit def webSocketHandshakeEventWithSecWebSocketKey(event: WebSocketHandshakeEvent) = new WebSocketHandshakeEventWithSecWebSocketKey(event)
}
그게 일부 문법 설탕 응용 프로그램 코드는 초 - 웹 소켓 - 키 헤더를 얻고 그것은 1 급 호텔 것처럼 그냥 액세스 할 낮은 수준의 객체에 주위 파고 갈 필요가 없습니다 않도록 :
val routes = Routes({
case WebSocketHandshake(wsHandshake) => wsHandshake match {
case GET(PathSegments("websocket" :: roomNumber :: Nil)) => {
log.info("Handsake to join room " + roomNumber)
wsHandshake.authorize(onComplete = Some((event: WebSocketHandshakeEvent) => {
val identity = event.secWebSocketKey;
log.info("Authorised connection:" + identity);
// do something with this identified user connection
}))
}
}
case WebSocketFrame(wsFrame) => {
// Once handshaking has taken place, we can now process frames sent from the client
val identity = wsFrame.secWebSocketKey;
log.info("chat from:" + identity);
// do something with this identified data frame
}
})
제 질문은 이것이 좋은 관행인지 또는 사용자 연결을 식별하는 더 나은 방법이 있습니까?
나는 코드가 아니라 문언을 읽었다. 나는 비슷한 해결책을 찾고있다. 궁금하네요, 세션 관리 Tomcat 등 HTTP 헤더를 통해 바로 이루어집니다? 어쩌면 그게 활용 될 수 있을까요? –
아직 socko에 대한 포럼이 없습니다. https://github.com/mashupbots/socko/issues/62의 문제 추적기에서이 질문을 지적하고 있습니다. – simbo1905