使用SpringBoot整合socket实现登录的推送
时间: 2024-03-06 16:48:47 浏览: 34
实现登录的推送,可以借助SpringBoot和WebSocket技术来完成。下面是整合WebSocket的步骤:
1. 添加依赖
在pom.xml中添加SpringBoot的WebSocket依赖:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
```
2. 配置WebSocket
创建WebSocket配置类,并使用@EnableWebSocket注解开启WebSocket支持:
```java
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(chatWebSocketHandler(), "/chat").setAllowedOrigins("*");
}
@Bean
public WebSocketHandler chatWebSocketHandler() {
return new ChatWebSocketHandler();
}
}
```
其中,ChatWebSocketHandler是自己实现的WebSocket处理器,用于处理WebSocket连接和消息的收发。
3. 实现WebSocket处理器
创建ChatWebSocketHandler类,并实现WebSocketHandler接口,重写onOpen、onClose和onMessage方法:
```java
public class ChatWebSocketHandler implements WebSocketHandler {
private static final List<WebSocketSession> sessions = new CopyOnWriteArrayList<>();
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
sessions.add(session);
session.sendMessage(new TextMessage("Connected"));
}
@Override
public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
// 处理消息
String username = (String) session.getAttributes().get("username");
String content = message.getPayload().toString();
sendMessage(username, content);
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
sessions.remove(session);
session.sendMessage(new TextMessage("Disconnected"));
}
private void sendMessage(String username, String content) throws IOException {
for (WebSocketSession session : sessions) {
if (session.isOpen()) {
session.sendMessage(new TextMessage(username + ": " + content));
}
}
}
}
```
该处理器包含一个sessions列表,用于存储所有连接到服务器的WebSocketSession对象。当有新的WebSocket连接时,将WebSocketSession对象添加到sessions列表中,并发送一条“Connected”消息。收到消息时,处理器会解析出发送该消息的用户和消息内容,并调用sendMessage方法将消息发送给所有连接的WebSocketSession对象。
4. 实现登录功能
在登录功能中,当用户输入用户名和密码,系统验证成功后,将用户名存储到WebSocketSession对象中,用于后续发送消息时标识用户身份。在登录成功后,向客户端发送一条“LoginSuccess”消息,客户端收到该消息后,在页面中显示聊天界面。
```java
@Controller
public class LoginController {
@Autowired
private SimpMessagingTemplate messagingTemplate;
@PostMapping("/login")
public String login(@RequestParam String username, @RequestParam String password, HttpSession session) {
// 验证用户名和密码
if (验证成功) {
session.setAttribute("username", username);
messagingTemplate.convertAndSendToUser(username, "/queue/message", "LoginSuccess");
return "chat";
} else {
return "login";
}
}
}
```
在ChatWebSocketHandler中,可以通过session.getAttributes().get("username")获取存储在WebSocketSession对象中的用户名,用于标识用户身份。
5. 实现消息推送
在客户端页面中,使用JavaScript连接WebSocket,并监听消息事件。当用户输入聊天内容并点击发送按钮时,将消息发送到服务器,服务器将收到的消息转发给所有连接的WebSocketSession对象,客户端收到消息后,在页面中显示该消息。
```javascript
var socket = new WebSocket('ws://' + window.location.host + '/chat');
socket.onopen = function(event) {
// WebSocket连接成功
console.log('WebSocket connected.');
};
socket.onmessage = function(event) {
// 收到消息
var message = event.data;
if (message === 'LoginSuccess') {
// 登录成功,显示聊天界面
$('#login').hide();
$('#chat').show();
} else {
// 显示聊天内容
$('#content').append('<p>' + message + '</p>');
}
};
$('#send').click(function() {
// 发送消息
var content = $('#input').val();
socket.send(content);
$('#input').val('');
});
```
以上就是使用SpringBoot整合WebSocket实现登录的推送的步骤。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)