websocket 安全_将Websocket与Spring Framework和Vuejs结合使用
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:
- 通过注释为
@MessageMapping
的方法的返回值 - 使用
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结合使用相关推荐
- java websocket注解_【websocket】spring boot 集成 websocket 的四种方式
集成 websocket 的四种方案 1. 原生注解 pom.xml org.springframework.boot spring-boot-starter-websocket WebSocketC ...
- 将Websocket与Spring Framework和Vuejs结合使用
Websocket是客户端和服务器之间的全双工(持久)连接,因此两者可以彼此共享信息,而无需重复建立新的连接. 这消除了从客户端重复轮询以从服务器获取更新的需要. 并非所有浏览器都支持Websocke ...
- c++ websocket客户端_你要的websocket都在这,收好不谢~~~
此号已经沉寂多时,似乎已经忘了上一次更新是什么时候了!这一次重拾旧爱,希望能够一直保持下去,坚持写作,快乐你我他 今天的主题是websocket,相信搞研发的兄弟对websocket并不陌生,都202 ...
- websocket 连接本地端口_聊聊 WebSocket,还有 HTTP
还记得曾经风靡一时的 QQ 秀聊天室吗?那时,还在上初.高中的我们,QQ 是最常用的聊天交友工具:而 QQ 秀聊天室的出现打破了只能按条件查找好友的局限性,大家可以随意进入聊天室房间,进行在线聊天.怀 ...
- python websocket爬虫_详解python websocket获取实时数据的几种常见链接方式
第一种, 使用create_connection链接,需要pip install websocket-client (此方法不建议使用,链接不稳定,容易断,并且连接很耗时) import time f ...
- socket分块接收_分块WebSocket传输
小编典典 首先,您需要在 浏览器中 区分WebSocket 协议 和WebSocket API . __ WebSocket协议的帧大小限制为2 ^ 63个八位位组,但是WebSocket消息可以由无 ...
- 小马哥spring编程核心思想_求小马哥讲Spring栈核心编程思想 Spring IoC+Bean+Framework教程...
这次搜集了下小马哥讲Spring栈核心编程思想 Spring IoC+Bean+Framework,最强Spring全面核心实战的视频教程,有需要的朋友可以自行下载学习. 课程简介: 小马哥出手的Sp ...
- 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. ...
- 紧随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 ...
最新文章
- CSS选择器笔记,element element和element element 的区别
- Hadoop入门(十八)Mapreduce的倒排索引程序
- NumPy常用属性及方法
- 字符串10进制、16进制、ASSIC的互转
- form表单上传文件
- Bundle Adjustment原理及应用
- 【Unity】在unity端读取SuperDog加密狗信息【Gemalto 金雅拓 超级狗】
- JS反转链表 - I
- PHP多功能Youngxj工具箱/在线站长工具箱源码
- USER_TAB_COLS,USER_TAB_COLUMNS,ALL_TAB_COLS,ALL_TAB_COLUMNS获取数据库元素的区别
- ipad pro能写python吗_这是一篇用 iPad Pro 写的 iPad Pro 评测
- FFmpeg将视频提取成帧
- postgres内存上下文
- [XDOJ]开灯问题
- 基于Altium Designer 20设计双层印刷电路板的详细步骤(待写)
- Android Studio模拟器打不开Emulator: emulator: ERROR: x86_64 emulation currently requires hardware accelera
- 安装HeidiSQL
- 计算机学院宋威教授,北方工业大学计算机技术(领域)研究生导师介绍:宋威
- 中新金盾信息安全管理系统存在默认密码
- 软件测试周刊(第07期):每个人都是天才
热门文章
- shell脚本重启tomcat
- 【python学习】模块random
- Web services 安全实践: 基于 HTTP Basic Authentication 为 Web services 配置传输层安全机制...
- Java关键字系列(public,protected,private)
- python 报错 TypeError: type ‘types.GenericAlias‘ is not an acceptable base type
- linux 处理 BOM头 ^M 方法
- shell脚本中执行 source /etc/profile 或者 source ~/.bashrc 不能生效的原因
- centos7 系统备份
- linux uname 命令简介
- windows测试模式打开关闭