springboot websocket 如何根据用户id 离开后修改数据库 给出先后台代码
时间: 2024-03-27 14:41:16 浏览: 57
这里给出一个基于Spring Boot和Spring WebSocket的示例代码,实现了根据用户ID离开时更新数据库的功能。
首先,我们需要定义一个WebSocket处理器,用于处理WebSocket连接事件和消息:
```
@Component
public class MyWebSocketHandler extends TextWebSocketHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(MyWebSocketHandler.class);
private final Map<Long, WebSocketSession> sessionMap = new ConcurrentHashMap<>();
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
LOGGER.info("New connection: {}", session.getId());
Long userId = getUserId(session);
if (userId != null) {
sessionMap.put(userId, session);
LOGGER.info("User {} logged in", userId);
}
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
LOGGER.info("Connection closed: {}", session.getId());
Long userId = getUserId(session);
if (userId != null) {
sessionMap.remove(userId);
LOGGER.info("User {} logged out", userId);
updateUserStatus(userId, false);
}
}
private Long getUserId(WebSocketSession session) {
Long userId = (Long) session.getAttributes().get("userId");
return (userId != null && sessionMap.containsKey(userId)) ? userId : null;
}
private void updateUserStatus(Long userId, boolean online) {
// 更新数据库中相应的用户状态
}
}
```
在这个处理器中,我们定义了一个Map来保存用户ID和WebSocketSession之间的关系。在WebSocket连接建立时,我们将其ID与WebSocketSession关联起来,并更新数据库中相应的用户状态为在线。在WebSocket连接关闭时,我们获取用户ID并从Map中移除其WebSocketSession,并更新数据库中相应的用户状态为离线。
然后,我们需要定义一个拦截器,用于在用户登录时将其ID添加到WebSocketSession中:
```
@Component
public class WebSocketInterceptor implements HandshakeInterceptor {
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
Map<String, Object> attributes) throws Exception {
if (request instanceof ServletServerHttpRequest) {
HttpServletRequest servletRequest = ((ServletServerHttpRequest) request).getServletRequest();
Long userId = getUserIdFromServletRequest(servletRequest);
if (userId != null) {
attributes.put("userId", userId);
}
}
return true;
}
@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
Exception ex) {
}
private Long getUserIdFromServletRequest(HttpServletRequest servletRequest) {
// 根据请求中的参数或头部信息获取用户ID
}
}
```
在这个拦截器中,我们从请求中获取用户ID,并将其添加到WebSocketSession的属性中。需要注意的是,这里我们使用了HttpServletRequest来获取请求信息。
最后,我们需要配置WebSocket和拦截器,并启动应用:
```
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Autowired
private MyWebSocketHandler webSocketHandler;
@Autowired
private WebSocketInterceptor webSocketInterceptor;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(webSocketHandler, "/ws")
.setAllowedOrigins("*")
.addInterceptors(webSocketInterceptor);
}
}
```
在这个配置类中,我们注册了WebSocket处理器和拦截器,并将其映射到“/ws”路径上。需要注意的是,这里我们设置了允许所有来源的跨域请求。
至此,我们就完成了基于Spring Boot和Spring WebSocket实现根据用户ID离开时更新数据库的功能。需要注意的是,更新数据库时需要使用事务和并发控制来保证数据的一致性和正确性。
阅读全文