我正在使用TextWebSocketHandler
构建一个用于Web套接字连接的spring boot应用程序并覆盖handleTextMessage
。
但我要求当用户尝试连接到此端点时,我想使用某些令牌进行验证。现在我知道我可以覆盖afterConnectionEstablished
和afterConnectionClosed
方法但是在创建套接字连接时可以获得一些请求参数或路径参数,以便我可以存储该会话所属的用户的详细信息。
我能够使用JavaEE7注释执行此操作,但我被迫使用Spring:
@ServerEndpoint("/ss/{token}")
public class SocketServerEndpoint {
@Autowired
private SService ssService;
@OnOpen
public void open(Session session, @PathParam("token")String token) throws SSException {
ssService.processConnectionRequest(token, session);
}
@OnMessage
public String handleMessage(String message, Session session) {
ssService.processMessage(message);
return "message_received";
}
@OnClose
public void close(Session session) {
ssService.removeSession(session);
}
}
我是Spring Boot和Spring Web Sockets的新手,无法找到方法,请帮助!!!
答案 0 :(得分:0)
您可以使用ApplicationContext Events。有关详细信息,请参阅http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html#websocket-stomp-appplication-context-events。
here我解释了如何实现事件监听器来捕获特定事件。
答案 1 :(得分:0)
您可以实现WebSocketConfigurer并重写registerWebSocketHandlers方法 定义您的端点,然后检索并放入属性。
public void registerWebSocketHandlers(WebSocketHandlerRegistry registery) {
logger.info("websocketHanlder registering Socket Handler .");
registery.addHandler(new SocketTextHandler(), "ss/{token}").addInterceptors(get);
}
private HandshakeInterceptor getInter() {
return new HandshakeInterceptor() {
@Override
public boolean beforeHandshake(ServerHttpRequest serverHttpRequest,
ServerHttpResponse serverHttpResponse,
WebSocketHandler webSocketHandler,
Map<String, Object> map) throws Exception {
logger.info("Request ----------" + serverHttpRequest.getHeaders());
String path = serverHttpRequest.getURI().getPath();
logger.info("PATH " + path);
int index = path.indexOf("/ss");
String id = path.substring(index);
map.put("id", id);
return true;
}
}
将其放在地图上之后,可以从会话属性中检索它。