homie 匹配 websocket 聊天部分
homie 匹配 websocket 聊天部分
WebSocketConfig
与 HttpSessionConfig
WebSocketConfig
类:- 这是一个 Spring 的配置类,通过
@Configuration
注解标记,用于配置 WebSocket 相关的 bean。 - 在该类中,通过
@Bean
注解创建了一个ServerEndpointExporter
的 bean,用于注册 WebSocket endpoint。ServerEndpointExporter
是 Spring 提供的用于在 Spring 容器中注册 WebSocket endpoint 的类。 - 通过将
ServerEndpointExporter
注册为 bean,Spring 将会自动扫描并注册标有@ServerEndpoint
注解的 WebSocket endpoint。这样就可以在应用中使用 WebSocket 了。
- 这是一个 Spring 的配置类,通过
HttpSessionConfig
类:- 这是一个用于配置 WebSocket 握手过程中 HttpSession 的类。
- 继承了
ServerEndpointConfig.Configurator
类,这个类是 WebSocket API 提供的用于配置 WebSocket endpoint 的配置器。 - 实现了
ServletRequestListener
接口,用于监听 ServletRequest 的生命周期事件。 - 在
modifyHandshake
方法中,WebSocket 握手期间会调用该方法,允许我们修改握手过程中的一些属性,比如添加 HttpSession。 - 在
modifyHandshake
方法中,通过request.getHttpSession()
获取 HttpSession,并将其设置到sec.getUserProperties()
中,以便后续 WebSocket endpoint 可以通过getUserProperties()
方法获取到 HttpSession。 requestInitialized
方法用于监听 ServletRequest 的初始化事件,在这里获取 HttpSession 的作用不大,因为 WebSocket 握手阶段并不会触发 ServletRequest 的初始化。
综上所述,WebSocketConfig
用于配置 WebSocket 相关的 bean,而 HttpSessionConfig
则用于在 WebSocket 握手过程中将 HttpSession 设置到 WebSocket 的配置中,以便在 WebSocket endpoint 中可以获取到 HttpSession。
onOpen -> sendAllUsers(给所有用户发送当前所有在线的用户) -> sendAllMessage(给所有人发送消息) -> userSession.getBasicRemote().sendText(message); -> onMessage (接受客户端向服务端发送的消息)-> sendOneMessage (向指定客户端发送消息)-> privateChat -> chatResult(封装聊天结果为 ChatMessageVO)-> 回到 privateChat -> sendOneMessage 向客户端发消息 -> saveChat(保存聊天消息到 MySQL)
客户端与服务端建立连接,触发 onopen 方法,通过 Endpoint 类获取用户的 httpsession 并存入会话池中,key为发送者id,并将session与httpsession 存入websocket类的变量中。当前端在输入框发送消息至后端时,会先构建发送的消息对象再将其序列化,在ws路径上带上发送者id,通过socket.send方法向服务端发送消息,后端的onmessage方法接收。然后通过@PathParam注解得到发送者id,对接收的消息进行反序列化,再将其消息进行封装带上发送者、接受者的用户信息,如用户名,头像,并标记这个消息是不是自己发送的等。紧接着根据toid得到session会话,再向客户端发送消息。客户端的onmessage方法接收消息后,根据chatmessagevo渲染聊天消息气泡。