homie 匹配 websocket 聊天部分

WebSocketConfigHttpSessionConfig

  1. WebSocketConfig 类:

    • 这是一个 Spring 的配置类,通过 @Configuration 注解标记,用于配置 WebSocket 相关的 bean。
    • 在该类中,通过 @Bean 注解创建了一个 ServerEndpointExporter 的 bean,用于注册 WebSocket endpoint。ServerEndpointExporter 是 Spring 提供的用于在 Spring 容器中注册 WebSocket endpoint 的类。
    • 通过将 ServerEndpointExporter 注册为 bean,Spring 将会自动扫描并注册标有 @ServerEndpoint 注解的 WebSocket endpoint。这样就可以在应用中使用 WebSocket 了。
  2. 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渲染聊天消息气泡。