spring boot(学习笔记第十六课)

news2025/1/14 0:52:42

spring boot(学习笔记第十六课)

  • Spring boot的websocket(点对点)

学习内容:

  • Spring boot的websocket(点对点)spring boot(学习笔记第十六课)

1. Spring boot的websocket(点对点)

  1. 前面练习了websocket的广播模式。
    在这里插入图片描述

  2. 接下来练习websocket的点对点模式
    在这里插入图片描述
    这里主要使用spring security,进行login,让spring boot认识到每个用户的存在,之后SimpMesssagingTemplateconvertAndSendToUser进行最终的发送。

    • 使用spring security进行login
    • 使用SimpMesssagingTemplateconvertAndSendToUser进行单独想单独用户发送。
      是和websocket广播最大的不同。
  3. 开始结合代码websocket的点对点模式

    • 导入spring security的认证

      @Configuration
      public class SecurityConfig {
          @Bean
          PasswordEncoder passwordEncoder() {
              return NoOpPasswordEncoder.getInstance();
          }
      
          @Bean
          UserDetailsService userDetailsService() {
              InMemoryUserDetailsManager users =
                      new InMemoryUserDetailsManager();
              users.createUser(User.withUsername("finlay_admin")
                      .password("123456")
                      .roles("ADMIN")
                      .build());
              users.createUser(User.withUsername("finlay_dba")
                      .password("123456")
                      .roles("DBA")
                      .build());
              users.createUser(User.withUsername("finlay_super")
                      .password("123456")
                      .roles("ADMIN", "DBA")
                      .build());
              return users;
          }
      
          @Bean
          SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {
              httpSecurity.authorizeHttpRequests(
                              auth ->
                                      auth.requestMatchers("/admin/**")//匹配所有/** url
                                              .hasRole("ADMIN")//只能对于admin的role,才能访问
                                              .requestMatchers("/user/**")//匹配/user/**
                                              .hasRole("USER")//只有对于user的role,才能访问
                                              .requestMatchers("/db/**")//配置/db/**
                                              .hasRole("DBA")//只有对于dba的role,才能访问
                                              .anyRequest()
                                              .authenticated()//设定任何访问都需要认证
                      )
                      .formLogin(form -> form.loginProcessingUrl("/login")//这里对于前后端分离,提供的非页面访问url
                              .usernameParameter("username")//页面上form的用户名
                              .passwordParameter("password"))//页面上form的密码
                      .csrf(csrf -> csrf.disable())//csrf跨域访问无效
                      .sessionManagement(session -> session.maximumSessions(1).maxSessionsPreventsLogin(true));
              return httpSecurity.build();
          }
      
    • 导入spring security的需要的依赖

       <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-security</artifactId>
              </dependency>
      
    • 导入spring security的需要的依赖

      @Configuration
      @EnableWebSocketMessageBroker
      public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
          @Override
          public void configureMessageBroker(MessageBrokerRegistry messageBrokerRegistry) {
              messageBrokerRegistry.enableSimpleBroker("/topic","/private_chat");
              messageBrokerRegistry.setApplicationDestinationPrefixes("/app");
          }
          @Override
          public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry){
              stompEndpointRegistry.addEndpoint("/chat").withSockJS();
          }
      }
      
      
      • /private_chat是设置的点对点聊天的时候,从web server发送到浏览器时候使用的url
      • /app是从浏览器发送到的web server时候,使用的url的前缀。
      • /chat是浏览器和web server建立连接时候的endPoint
    • 定义WebSocketController

      @Controller
      public class WebSocketController {
          @Autowired
          SimpMessagingTemplate simpMessagingTemplate;
      
          @MessageMapping("/hello")
          @SendTo("/topic/greetings")
          public Message greeting(Message message) throws Exception {
              return message;
          }
      
          @MessageMapping("/chat")
          public void chat(Principal principal, Chat chat) throws Exception {
              String from = principal.getName();
              chat.setFrom(from);
              simpMessagingTemplate.convertAndSendToUser(chat.getTo()
              ,"/private_chat/chat",chat);
          }
      }
      
      • SimpMessagingTemplate这个bean就是点对点发送的关键对象。
      • @MessageMapping("/chat")定义了之后,可以通过/app/chat进行从浏览器到web server的点对点发送。
      • 其中,点对点的发送请求时候,浏览器会指定to用户的名称,也就是spring security的登录用户名字。
      • 之后利用SimpMessagingTemplate这个beanconvertAndSendToUser进行指定名字的点对点发送。
      • from就是spring securityPrincipal获得的当前session的用户名。
    • 定义点对点聊天的html页面(chatOnline.html)

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>点对点聊天</title>
          <script src="/webjars/jquery/jquery.min.js"></script>
          <script src="/webjars/sockjs-client/sockjs.min.js"></script>
          <script src="/webjars/stomp-websocket/stomp.min.js"></script>
          <script src="/chats.js"></script>
      </head>
      <body>
      <div id="chat">
          <div id="chatsContent">
          </div>
          <div>
              请输入聊天内容
              <input type="text" id="content" placeholder="聊天内容">
              目标用户:
              <input type="text" id="to" placeholder="目标用户">
              <button id="send" type="button">发送</button>
          </div>
      </div>
      
      </body>
      </html
      
    • 定义点对点聊天的javascript处理

      var stompClient = null;
      function connect(){
          var socket = new SockJS('/chat');
          stompClient = Stomp.over(socket);
          stompClient.connect({},function (frame){
              stompClient.subscribe('/user/private_chat/chat',function(chat){
                  showGreeting(JSON.parse(chat.body));
              });
          });
      }
      function sendMessage(){
          stompClient.send("/app/chat",{},
          JSON.stringify({'to':$("#to").val(),'content':$("#content").val()}));
      }
      function showGreeting(message){
          $("#chatsContent").append("<div>" + message.from+
          ":" + message.content + "</div>");
      }
      $(function(){
          connect();
          $("#send").click(function(){
              sendMessage();
          });
      }
      
    • 接下来既可以测试点对点的聊天
      在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1968427.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1.GPIO

理论说明 输入 上拉输入&#xff1a;拉高电平 下拉输入&#xff1a;拉低电平 浮空输入&#xff1a;不拉高也不拉低电平 输出 开漏输出&#xff1a;不能输出高电平&#xff08;P-MOS不可用&#xff0c;则只能低电平&#xff09; 推挽输出&#xff1a;可输出高低电平 输出速率…

informer中DeltaFIFO机制的实现分析与源码解读

informer中的DeltaFIFO机制的实现分析与源码解读 DeltaFIFO作为informer中重要组件&#xff0c;本文从源码层面了解是如何DelatFIFO是实现的。 DeltaFIFO的定义 找到delta_fifo.go的源码&#xff0c;位于client-go/tools/cache/delta_fifo.go 代码结构大致如下: store定义…

【priority_queue的模拟实现】

priority_queue的模拟实现 小杨 容器适配器&#xff1a;priority_queue priority_queue即优先级队列是一种容器适配器&#xff0c;根据严格的弱排序标准(即排序规则可以更改),他的第一个元素总是它所包含的元素中最大的。优先队列将特定容器类封装作为其底层容器类。标准容器类…

ElasticSearch优化实战:打造高性能搜索引擎的秘籍

在当今这个大数据时代&#xff0c;信息的海量增长对搜索技术提出了前所未有的挑战。用户不仅需要快速准确地从数以亿计的数据中找到所需信息&#xff0c;还希望搜索引擎能够提供个性化和智能化的搜索体验。ElasticSearch作为市场上领先的搜索引擎&#xff0c;因其强大的全文搜索…

Typora2024最新版破解方法(亲测可用)

此方法非常简单&#xff0c;无需安装dll补丁&#xff0c;无需修改注册表&#xff0c;无需使用老版本。仅需修改部分文件内容即可 方法步骤 步骤一 下载并安装Typora 安装Typora 打开官网 下载并安装最新版即可 点击访问Typora官网 https://typoraio.cn/ 步骤二 修改文件 …

java面向对象重点总结

文章目录 java面向对象重点总结类与实例构造方法方法重载属性与修饰符封装继承多态重构抽象类接口抽象类和接口的区别&#xff1a;集合泛型 java面向对象重点总结 对象是一个自包含的实体&#xff0c;用一组可识别的特性和行为来标识。 面向对象编程&#xff0c;英文叫Object…

mcasttest-tool组播检测工具

作者&#xff1a;广大 检测组播 mcasttest-tool是oracle组播检测工具&#xff0c;组播是oracle 11.2.0.2开始的新功能。 1、上传mcasttest工具解压并授权 [rootrac1 soft]# cd /u01/soft/ [rootrac1 soft]# tar -xvf mcasttest.tgz[rootrac1 soft]# chown -R grid:oinstall…

Animate软件基础:“分散到图层”创建的新图层

FlashASer&#xff1a;AdobeAnimate2021软件零基础入门教程https://zhuanlan.zhihu.com/p/633230084 FlashASer&#xff1a;实用的各种Adobe Animate软件教程https://zhuanlan.zhihu.com/p/675680471 FlashASer&#xff1a;Animate教程及作品源文件https://zhuanlan.zhihu.co…

Pytorch实现线性回归Linear Regression

借助 PyTorch 实现深度神经网络 - 线性回归 - 第 2 周 | Coursera 线性回归预测 用PyTorch实现线性回归模块 创建自定义模块&#xff08;内含一个线性回归&#xff09; 训练线性回归模型 对于线性回归&#xff0c;特定类型的噪声是高斯噪声 平均损失均方误差函数&#xff1a…

Mallet:一款针对任意协议的安全拦截代理工具

关于Mallet Mallet是一款功能强大的协议安全分析工具&#xff0c;该工具支持针对任意协议创建用于安全审计的拦截代理&#xff0c;该工具本质上与我们所熟悉的拦截Web代理类似&#xff0c;只是通用性更强。 工具运行机制 Mallet建立在Netty框架之上&#xff0c;并且依赖于Net…

文案人的梦工场,网易入职指南!

网易云对于咱们一些有点文艺的文案策划来说&#xff0c;简直就是梦中情司。 在这里工作锻炼机会很多&#xff0c;也很开拓眼界&#xff0c;能获得相当于在别处3倍能力的成长速度&#xff0c;福利待遇也是很好的。 要进入网易云音乐做文案策划&#xff0c;你可以按照以下步骤进…

数据结构的基本概念与算法2

线性表 &#xff1a; 线性表 是具有相同数据类型的 n (n > 0) 个数据元素的有限序列&#xff0c;其中 n 为表长&#xff0c;当 n 0 时线性表是一个空表&#xff1b;若用 L 命名线性表&#xff0c;则其一般表示为&#xff1a;L (a1 , a2 , ... ai , ai1 , ... an) 上述中&a…

月木学途开发 2.项目架构

1.项目介绍 月木学途是一款it在线学习网站&#xff0c;项目采用前后端分离架构。前端开发主要使用vue.js&#xff0c;后端使用Spring Cloud Alibaba技术栈。项目包含学习网站的大部分功能&#xff0c;分为管理员端和用户端。管理员端有权限管理、课程管理、网站管理、求职模块管…

Shell函数和Shell 输入/输出重定向

LInux&#xff1a;Shell函数和Shell 输入/输出重定向 Shell函数 参数说明&#xff1a; 可以带function fun() 定义&#xff0c;也可以直接fun() 定义,不带任何参数。参数返回&#xff0c;可以显示加&#xff1a;return 返回&#xff0c;如果不加&#xff0c;将以最后一条命令运…

[Vue warn]: data functions should return an object:

仔细检查你的代码肯定有一个data()内忘记方return{}了

C语言程序设计23

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 例题2.11 从键盘输入B、O、Y三个字符&#xff0c;然后把他们输出到屏幕上 代码&#xff1a; //《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 //例题2.11 从键盘输入B、O、Y三个字符&#xff0c;然…

RabbitMQ:MQ的可靠性

MQ的可靠性 在默认情况下&#xff0c;RabbitMQ会将接收到的信息保存在内存中以降低消息收发的延迟。这样会导致两个问题: 一旦MQ宕机&#xff0c;内存中的消息会丢失 内存空间有限&#xff0c;当消费者故障或处理过慢时&#xff0c;会导致消息积压&#xff0c;引发MQ阻塞。 …

高效、安全、共享|济南市升级教育城域网,重塑教育网络生态

文/济南市电化教育馆 电教教研室主任 张承强 导语: 近年来,济南市教育局以前瞻性的视野,将教育数字化转型视为推动教育高质量发展的基石,全力加速教育现代化进程。在这一蓝图下,教育城域网的升级改造项目被赋予了基础性、先导性和战略性的重要意义,成为探索教育数字化转型新路…

一键搞定PDF翻译,这四款是职场达人常备翻译工具!!!

作为外贸搬砖人的一份子&#xff0c;虽说外语功底还说地过去&#xff0c;但是每天过目大量pdf文件的翻译&#xff0c;难免还有些吃力&#xff0c;这个时候如果有可以辅助翻译的工具那就再好不过了&#xff0c;今天给大家带来四款非常适合pdf文件翻译的工具&#xff0c;总有一款…

C#中的通信

上位机应用开发-串口通信1、基于C#的串口通信对象:SerialPort 2、字段属性 PortName:获取或设置通信端口 BaudRate:获取或设置串行波特率-DataBits:获取或设置每个字节的标准数据位长度 Parity:获取或设置奇偶校验检查协仪I-StopBits;获取或设置每个字节的标准停止位数 3、…