Spring Boot整合WebSocket 消息点对点发送

打印 上一主题 下一主题

主题 806|帖子 806|积分 2418

Spring Boot整合WebSocket 消息群发

 
添加依赖:
  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-security</artifactId>
  4. </dependency>
复制代码
 
配置Spring Security:

对Spring Security进行配置,添加两个用户,同时配置所有地址都认证后才能访问
  1. @Configuration
  2. public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
  3.     @Bean
  4.     PasswordEncoder passwordEncoder() {
  5.         return new BCryptPasswordEncoder();
  6.     }
  7.     @Override
  8.     protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  9.         auth.inMemoryAuthentication()
  10.                 .withUser("admin")
  11.                 .password("$2a$10$RMuFXGQ5AtH4wOvkUqyvuecpqUSeoxZYqilXzbz50dceRsga.WYiq")
  12.                 .roles("admin")
  13.                 .and()
  14.                 .withUser("sang")
  15.                 .password("$2a$10$RMuFXGQ5AtH4wOvkUqyvuecpqUSeoxZYqilXzbz50dceRsga.WYiq")
  16.                 .roles("user");
  17.     }
  18.     @Override
  19.     protected void configure(HttpSecurity http) throws Exception {
  20.         http.authorizeRequests()
  21.                 .anyRequest().authenticated()
  22.                 .and()
  23.                 .formLogin().permitAll();
  24.     }
  25. }
复制代码
  
改造WebSocket配置:
  1. @Configuration
  2. @EnableWebSocketMessageBroker // 开启WebSocket消息代理
  3. public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
  4.     @Override
  5.     public void configureMessageBroker(MessageBrokerRegistry config) {
  6.         /*
  7.          * 表示设置消息代理的前缀,即如果消息的前缀是“/topic”,就会将消息转发给消息代理(broker),再由消息代理将消息广播给当前连接的客户端。
  8.          */
  9.         config.enableSimpleBroker("/topic", "/queue");
  10.         /*
  11.          * 表示配置一个或多个前缀,通过这些前缀过滤出需要被注解方法处理的消息
  12.          * 例如,前缀为“/app”的destination可以通过@MessageMapping注解的方法处理,
  13.          * 而其他destination(例如“/ topic”“/ queue”)将被直接交给broker处理。
  14.          */
  15.         config.setApplicationDestinationPrefixes("/app");
  16.     }
  17.     @Override
  18.     public void registerStompEndpoints(StompEndpointRegistry registry) {
  19.         /*
  20.          * 表示定义一个前缀为“/chat”的endPoint,并开启sockjs支持,
  21.          * sockjs可以解决浏览器对WebSocket的兼容性问题,
  22.          * 客户端将通过这里配置的URL来建立WebSocket连接。
  23.          */
  24.         registry.addEndpoint("/chat").withSockJS();
  25.     }
  26. }
复制代码
这里的修改是在config.enableSimpleBroker("/topic");方法的基础上又增加了一个broker前缀“/queue”,方便对群发消息和点对点消息进行管理。
 
配置Controller:

对WebSocket的Controller进行改造
  1. @Controller
  2. public class GreetingController {
  3.     @Autowired
  4.     SimpMessagingTemplate messagingTemplate;
  5.     @MessageMapping("/hello") // 用来接收“/app/hello”路径发送来的消息 在注解方法中对消息进行处理后,再将消息转发到@SendTo定义的路径上
  6.     @SendTo("/topic/greetings") // @SendTo路径是一个前缀为“/topic”的路径,因此该消息将被交给消息代理broker,再由broker进行广播。
  7.     public Message greeting(Message message) {
  8.         return message;
  9.     }
  10.     /**
  11.      * 点对点的消息发送
  12.      *
  13.      * @param principal 用来获取当前登录用户的信息
  14.      * @param chat      客户端发送来的消息
  15.      */
  16.     @MessageMapping("/chat") // 注解表示来自“/app/chat”路径的消息将被chat方法处理
  17.     public void chat(Principal principal, Chat chat) {
  18.         String from = principal.getName(); // 首先获取当前用户的用户名
  19.         chat.setFrom(from); // 设置给chat对象的from属性
  20.         /*
  21.          * 再将消息发送出去,发送的目标用户就是chat对象的to属性值
  22.          * 消息发送使用的方法是convertAndSendToUser,该方法内部调用了convertAndSend方法,并对消息路径做了处理
  23.          * chat是一个普通的JavaBean,to属性表示消息的目标用户,from表示消息从哪里来,content则是消息的主体内容
  24.          */
  25.         messagingTemplate.convertAndSendToUser(chat.getTo(), "/queue/chat", chat);
  26.     }
  27. }
复制代码
  
创建在线聊天页面:

在resources/static目录下创建onlinechat.html页面作为在线聊天页面
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>单聊</title>
  6.    
  7.    
  8.    
  9.    
  10. </head>
  11. <body>
  12.    
  13.    
  14.    
  15.         请输入聊天内容:
  16.         <input type="text" id="content" placeholder="聊天内容">
  17.         目标用户:
  18.         <input type="text" id="to" placeholder="目标用户">
  19.         <button id="send" type="button">发送</button>
  20.    
  21. </body>
  22. </html>
复制代码
这个页面和chat.html页面基本类似,不同的是,为了演示方便,这里需要用户手动输入目标用户名。另外,还有一个chat.js文件
  1. var stompClient = null;
  2. function connect() {
  3.     var socket = new SockJS('/chat');
  4.     stompClient = Stomp.over(socket);
  5.     stompClient.connect({}, function (frame) {
  6.         // 连接成功后,订阅的地址为“/user/queue/chat”,该地址比服务端配置的地址多了“/user”前缀,这是因为SimpMessagingTemplate类中自动添加了路径前缀。
  7.         stompClient.subscribe('/user/queue/chat', function (chat) {
  8.             showGreeting(JSON.parse(chat.body));
  9.         });
  10.     });
  11. }
  12. function sendMsg() {
  13.     // 聊天消息发送路径为“/app/chat”
  14.     stompClient.send("/app/chat", {},
  15.         JSON.stringify({
  16.             'content': $("#content").val(),
  17.             'to': $("#to").val() // 发送的消息内容中有一个to字段,该字段用来描述消息的目标用户
  18.         }));
  19. }
  20. function showGreeting(message) {
  21.     $("#chatsContent")
  22.         .append("" + message.from + ":" + message.content + "");
  23. }
  24. $(function () {
  25.     connect();
  26.     $("#send").click(function () {
  27.         sendMsg();
  28.     });
  29. });
复制代码
  
测试:

接下来启动Spring Boot项目进行测试,在浏览器中输入http://localhost:8081/onlinechat.html
 
文章来源: Spring Boot+Vue全栈开发实战 - 11.3 Spring Boot整合WebSocket
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

罪恶克星

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表