Java spring WebSocket介绍如何在打开连接时发送参数
我正在使用Java spring WebSocket介绍如何在打开连接时发送参数,java,spring,spring-boot,spring-websocket,java-websocket,Java,Spring,Spring Boot,Spring Websocket,Java Websocket,我正在使用TextWebSocketHandler和重写handleTextMessage为web套接字连接构建一个spring启动应用程序 但我有一个要求,当用户尝试连接到此端点时,我希望使用一些令牌进行验证。现在我知道我可以覆盖afterConnectionEstablished和afterConnectionClosed方法,但在创建套接字连接时是否可以获取一些请求参数或路径参数,以便存储此会话所属用户的详细信息 我可以用JavaEE7注释实现这一点,如下所示,但我不得不使用Spring:
TextWebSocketHandler
和重写handleTextMessage
为web套接字连接构建一个spring启动应用程序
但我有一个要求,当用户尝试连接到此端点时,我希望使用一些令牌进行验证。现在我知道我可以覆盖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不熟悉,无法找到解决方法,请帮助 您可以使用ApplicationContext事件。有关更多信息,请参阅
我还解释了如何实现事件侦听器来捕获特定事件。您可以实现WebSocketConfigurer并重写RegisterWebSocketHandler方法 定义端点,然后检索并放入属性
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;
}
}
公共无效注册表WebSocketHandler(WebSocketHandlerRegistry注册表){
info(“websocketholder注册套接字处理程序”);
addHandler(新的SocketTextHandler(),“ss/{token}”).addInterceptors(get);
}
私有握手interceptor getInter(){
返回新的握手interceptor(){
@凌驾
握手前公共布尔值(ServerHttpRequest ServerHttpRequest,
ServerHttpResponse服务器HttpResponse,
WebSocketHandler WebSocketHandler,
映射)引发异常{
info(“Request------”+serverHttpRequest.getHeaders());
字符串路径=serverHttpRequest.getURI().getPath();
logger.info(“路径”+路径);
int index=path.indexOf(“/ss”);
字符串id=路径子字符串(索引);
地图放置(“id”,id);
返回true;
}
}
将它放到映射上后,可以从会话属性中检索它
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;
}
}