我正在使用
TextWebSocketHandler
并覆盖 handleTextMessage
构建用于 Web 套接字连接的 Spring Boot 应用程序。
但我有一个要求,当用户尝试连接到此端点时,我想使用一些令牌进行验证。现在我知道我可以重写
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 的新手,无法找到方法,请帮助!
您可以实现WebSocketConfigurer并重写registerWebSocketHandlers方法 定义您的端点,然后检索并放入属性。
public void registerWebSocketHandlers(WebSocketHandlerRegistry registery) {
logger.info("websocketHanlder registering Socket Handler .");
registery.addHandler(new SocketTextHandler(), "ss/{token}").addInterceptors(getInter);
}
private HandshakeInterceptor getInter() {
return new HandshakeInterceptor() {
@Override
public boolean beforeHandshake(ServerHttpRequest serverHttpRequest,
ServerHttpResponse serverHttpResponse,
WebSocketHandler webSocketHandler,
Map<String, Object> map) {
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;
}
@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {}
};
}
将其放在地图上后,可以从会话属性中检索它。
您可以使用ApplicationContext事件。有关更多信息,请参阅 http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html#websocket-stomp-appplication-context-events。
并且这里我解释了如何实现事件监听器来捕获特定事件。