websocket 安全

Websocket是客户端和服务器之间的全双工(持久)连接,因此两者可以彼此共享信息,而无需重复建立新的连接。 这消除了从客户端重复轮询以从服务器获取更新的需要。

并非所有浏览器都支持Websocket,因此我们利用SockJS javascript库创建WebSocket连接。 SockJS充当抽象层,首先检查是否存在对WebSocket的本机支持,如果不存在,它将尝试使用浏览器支持的协议模仿WebSocket之类的行为。

Spring使用STOMP协议提供了对Websocket的支持,因此我们将使用STOMP.js (用于STOMP协议的javascript实现)与服务器进行交互。

在本文中,客户端将与服务器建立Websocket连接,并调用在服务器应用程序中注册的Websocket端点以接收一些消息。 除此之外,服务器还会从服务器中触发的后台活动向客户端发送一些实时消息。

首先配置服务器。 首先进入start.spring.io并使用以下设置创建一个新的spring boot项目:

配置Websocket

基本的websocket配置包括:

  • 创建用于发布消息的主题地址( /topic/messages )
  • 客户端用于调用服务器( /ws )中的WebSocket端点的URL的可选前缀
  • 定义客户端用于与服务器建立WebSocket连接的URL。 ( /connect )
 @Configuration@EnableWebSocketMessageBrokerpublic class WebsocketConfiguration implements WebSocketMessageBrokerConfigurer {@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {registry.addEndpoint( "/connect" ).withSockJS();}@Overridepublic void configureMessageBroker(MessageBrokerRegistry registry) {registry.enableSimpleBroker( "/topic/messages" );registry.setApplicationDestinationPrefixes( "/ws" );}}

创建Websocket端点

我们将创建一个Spring控制器,它将具有两个WebSocket端点,如下所示。 这些端点中的一个将创建一个无限运行的任务,向客户端发送消息,而另一个端点将取消正在运行的任务。

 @Controllerpublic class WebsocketController { @Autowired SimpMessagingTemplate simpMessagingTemplate;String destination = "/topic/messages" ; ExecutorService executorService =Executors.newFixedThreadPool(1);Future<?> submittedTask;@MessageMapping( "/start" )public void startTask(){if ( submittedTask != null ){simpMessagingTemplate.convertAndSend(destination,"Task already started" );return ;}simpMessagingTemplate.convertAndSend(destination,"Started task" );submittedTask = executorService.submit(() -> {while ( true ){simpMessagingTemplate.convertAndSend(destination,LocalDateTime.now().toString()+ ": doing some work" );Thread.sleep(10000);}});}@MessageMapping( "/stop" )@SendTo( "/topic/messages" )public String stopTask(){if ( submittedTask == null ){return "Task not running" ;}try {submittedTask.cancel( true );} catch (Exception ex){ex.printStackTrace();return "Error occurred while stopping task due to: "+ ex.getMessage();}return "Stopped task" ;}}

我已经使用上面的两种方法将消息发送到配置中定义的主题URL:

  1. 通过注释为@MessageMapping的方法的返回值
  2. 使用SimpMessagingTemplate

Spring boot配置了一个SimpMessagingTemplate实例,我们可以利用它来向主题发送消息。

就像我们定义REST API端点或查看端点的方式一样,通过传递端点URL来使用@MessageMapping注释websocket端点。

用Javascript创建Websocket客户端

我们将首先创建一个HTML页面,其中包含用于启动连接的按钮,然后调用我们定义的websocket端点,如下所示:

 < div class = "content" id= "websocket" >< div > </ div >< div class = "row" >< div class = "col" ><button class = "btn btn-sm btn-info" @click= "connect" >Create connection</button><button class = "btn btn-sm btn-success" @click= "startTask" >Start Task</button><button class = "btn btn-sm btn-danger" @click= "stopTask" >Stop Task</button><button class = "btn btn-sm btn-primary" @click= "disconnect" >Close connection</button></ div ></ div >< div > </ div >< div class = "row" >< div class = "col" ><ul class = "list-group" style= "height: 500px; overflow:scroll;" ><li class = "list-group-item d-flex justify-content-between align-items-center"v- for = "(m,idx) in messages" :key= "'m-'+idx" >{{m}}</li></ul></ div ></ div ></ div >

重要的是要注意上面HTML中链接的sockjs和STOMP js库。

所有工作都在Javascript代码中进行,如下所示:

 var stompClient = null;$(function(){new Vue({el: "#websocket" ,data: {messages: []},methods: {connect: function(){var socket = new SockJS( '/connect' );stompClient = Stomp.over(socket);var that = this ;stompClient.connect({}, function(frame) {that.handleMessageReceipt( "Connected" );stompClient.subscribe( '/topic/messages' ,function(messageOutput) {that.handleMessageReceipt(messageOutput.body);});});},disconnect: function(){if (stompClient != null) {stompClient.disconnect();}this .handleMessageReceipt( "Disconnected" );},startTask: function(){if ( stompClient != null ){stompClient.send( "/ws/start" );} else {alert( "Please connect first" );}},stopTask: function(){if ( stompClient != null ){stompClient.send( "/ws/stop" );} else {alert( "Please connect first" );}},handleMessageReceipt: function (messageOutput) {this .messages.push(messageOutput);}}});});

connect方法使用/connect端点启动websocket连接。 开始任务方法和停止任务方法调用我们在WebsocketController定义的两个websocket端点

stompClient接收到的消息由`handleMessageReceipt`方法处理。

运行应用程序后,可以创建连接,启动任务,停止任务并获取如下所示的消息:

完整应用程序的代码可以在这里找到。

翻译自: https://www.javacodegeeks.com/2020/02/using-websocket-with-spring-framework-and-vuejs.html

websocket 安全

websocket 安全_将Websocket与Spring Framework和Vuejs结合使用相关推荐

  1. java websocket注解_【websocket】spring boot 集成 websocket 的四种方式

    集成 websocket 的四种方案 1. 原生注解 pom.xml org.springframework.boot spring-boot-starter-websocket WebSocketC ...

  2. 将Websocket与Spring Framework和Vuejs结合使用

    Websocket是客户端和服务器之间的全双工(持久)连接,因此两者可以彼此共享信息,而无需重复建立新的连接. 这消除了从客户端重复轮询以从服务器获取更新的需要. 并非所有浏览器都支持Websocke ...

  3. c++ websocket客户端_你要的websocket都在这,收好不谢~~~

    此号已经沉寂多时,似乎已经忘了上一次更新是什么时候了!这一次重拾旧爱,希望能够一直保持下去,坚持写作,快乐你我他 今天的主题是websocket,相信搞研发的兄弟对websocket并不陌生,都202 ...

  4. websocket 连接本地端口_聊聊 WebSocket,还有 HTTP

    还记得曾经风靡一时的 QQ 秀聊天室吗?那时,还在上初.高中的我们,QQ 是最常用的聊天交友工具:而 QQ 秀聊天室的出现打破了只能按条件查找好友的局限性,大家可以随意进入聊天室房间,进行在线聊天.怀 ...

  5. python websocket爬虫_详解python websocket获取实时数据的几种常见链接方式

    第一种, 使用create_connection链接,需要pip install websocket-client (此方法不建议使用,链接不稳定,容易断,并且连接很耗时) import time f ...

  6. socket分块接收_分块WebSocket传输

    小编典典 首先,您需要在 浏览器中 区分WebSocket 协议 和WebSocket API . __ WebSocket协议的帧大小限制为2 ^ 63个八位位组,但是WebSocket消息可以由无 ...

  7. 小马哥spring编程核心思想_求小马哥讲Spring栈核心编程思想 Spring IoC+Bean+Framework教程...

    这次搜集了下小马哥讲Spring栈核心编程思想 Spring IoC+Bean+Framework,最强Spring全面核心实战的视频教程,有需要的朋友可以自行下载学习. 课程简介: 小马哥出手的Sp ...

  8. Spring Framework 5.0.0.M4中文文档第3章

    文章目录 Part II. 核心技术 3. IoC容器 3.2 容器概述 3.2.1 配置元数据 3.2.2 实例化容器 3.2.3 使用容器 3.3 Bean概述 3.3.1 命名bean 3.3. ...

  9. 紧随Java 16,Spring Framework 5.3.5 发布:涵盖JDK 16的支持!

    昨天小编刚给大家介绍过最新的Spring Boot 2.4.4.Spring Cloud 2020.0.2 发布内容,还没看过的小伙伴点这里:Spring Boot 2.4.4.Spring Clou ...

最新文章

  1. CSS选择器笔记,element element和element element 的区别
  2. Hadoop入门(十八)Mapreduce的倒排索引程序
  3. NumPy常用属性及方法
  4. 字符串10进制、16进制、ASSIC的互转
  5. form表单上传文件
  6. Bundle Adjustment原理及应用
  7. 【Unity】在unity端读取SuperDog加密狗信息【Gemalto 金雅拓 超级狗】
  8. JS反转链表 - I
  9. PHP多功能Youngxj工具箱/在线站长工具箱源码
  10. USER_TAB_COLS,USER_TAB_COLUMNS,ALL_TAB_COLS,ALL_TAB_COLUMNS获取数据库元素的区别
  11. ipad pro能写python吗_这是一篇用 iPad Pro 写的 iPad Pro 评测
  12. FFmpeg将视频提取成帧
  13. postgres内存上下文
  14. [XDOJ]开灯问题
  15. 基于Altium Designer 20设计双层印刷电路板的详细步骤(待写)
  16. Android Studio模拟器打不开Emulator: emulator: ERROR: x86_64 emulation currently requires hardware accelera
  17. 安装HeidiSQL
  18. 计算机学院宋威教授,北方工业大学计算机技术(领域)研究生导师介绍:宋威
  19. 中新金盾信息安全管理系统存在默认密码
  20. 软件测试周刊(第07期):每个人都是天才

热门文章

  1. shell脚本重启tomcat
  2. 【python学习】模块random
  3. Web services 安全实践: 基于 HTTP Basic Authentication 为 Web services 配置传输层安全机制...
  4. Java关键字系列(public,protected,private)
  5. python 报错 TypeError: type ‘types.GenericAlias‘ is not an acceptable base type
  6. linux 处理 BOM头 ^M 方法
  7. shell脚本中执行 source /etc/profile 或者 source ~/.bashrc 不能生效的原因
  8. centos7 系统备份
  9. linux uname 命令简介
  10. windows测试模式打开关闭