首页 > 其他分享 >ruoyi若依整合websocket

ruoyi若依整合websocket

时间:2024-06-03 17:32:34浏览次数:16  
标签:websocket ruoyi 若依 session ws proxy WebSocket public

原文链接:https://blog.csdn.net/qq_33342112/article/details/132096930

注:本文档中的ruoyi框架为前后不分离版本,nginx配置与前后分离版有所不同。

一、导pom,版本需与springboot版本一致

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
<version>2.5.15</version>
</dependency>
如果是新建module,则需要在ruoyi-admin的pom.xml中导入新建的module,否则注解不生效

<dependency>
<groupId>com.ruoyi</groupId>
<!-- 新module的名称 -->
<artifactId>ruoyi-websocket</artifactId>
</dependency>
二、注册websocket

@Configuration
@EnableWebSocket
public class SpringWebSocketConfig implements WebSocketConfigurer {

@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
System.out.println("注册websocket");
//固定连接路径则使用/ws,如/ws后还有参数,则追加/*通配符
registry.addHandler(new MyWebSocketHandler(), "/ws/*")//设置连接路径和处理器
.setAllowedOrigins("*") //允许跨域访问
.addInterceptors(new MyWebSocketInterceptor());//设置拦截器
}
}
三、创建拦截器 MyWebSocketInterceptor

public class MyWebSocketInterceptor implements HandshakeInterceptor {
@Override
public boolean beforeHandshake(ServerHttpRequest servletRequest, ServerHttpResponse servletResponse, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
System.out.println("websocket前置拦截");

//如果用到Sec-WebSocket-Protocol,可以采用getHeaders().get(key)的方法获取
if (servletRequest.getHeaders().get("Sec-WebSocket-Protocol") == null) {
System.out.println("无Sec-WebSocket-Protocol,进行拦截!");
return false;
}
String protocol = servletRequest.getHeaders().get("Sec-WebSocket-Protocol").get(0);

//如果uri的路径中带有参数,可获取到uri字符串,采用截取的方式处理,最后存入attributes
String path = servletRequest.getURI().getPath();
String id = path.substring(path.lastIndexOf('/') + 1);
attributes.put("id", id);
System.out.println("设备id:" + id);

return true;
}

@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {
System.out.println("websocket后置拦截");
}
}
四、创建处理器 MyWebSocketHandler

public class MyWebSocketHandler implements WebSocketHandler {

//建立新的 socket 连接后回调的方法
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
System.out.println("新连接");
//从session中获取存放的参数
session.getAttributes().get("id");
}

// 接收客户端发送的 Socket
@Override
public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
// 连接发送的消息
String msg = message.getPayload().toString();
// 通过session向连接发送消息
session.sendMessage(new TextMessage("发送消息"));
}

//连接出错时,回调的方法
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
System.out.println("收到的错误信息:" + exception);
}

//连接关闭时,回调的方法
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
System.out.println("断开连接");
}


// WebSocketHandler 是否处理部分消息 默认返回false即可
@Override
public boolean supportsPartialMessages() {
return false;
}

}
五、本地启动项目

 

六、本地环境测试,或者使用在线测试 http://www.websocket-test.com/

<!DOCTYPE HTML>
<html>
<head>
<title>My WebSocket</title>
</head>

<body>
<input id="text" type="text" />
<button onclick="send()">Send</button>
<button onclick="closeWebSocket()">Close</button>
<div id="message"></div>


</body>

<script type="text/javascript">

let ws = null;
//判断当前浏览器是否支持WebSocket
if ('WebSocket' in window) {
//【非必须】 在ws后面添加了些内容
var str = 'abc';
//【非必须】 Sec-WebSocket-Protocol的内容
var protocol = ['Sec-WebSocket-Protocol的内容']
ws = new WebSocket("ws://127.0.0.1:14000/ws/" + str, protocol);
}
else {
alert('当前浏览器 Not support websocket')
}

//连接发生错误的回调方法
ws.onerror = function () {
setMessageInnerHTML("error");
};

//连接成功建立的回调方法
ws.onopen = function(event) {
setMessageInnerHTML("success");
}
//接收到消息的回调方法
ws.onmessage = function(message) {
if (typeof(message.data) == 'string') {
setMessageInnerHTML(message.data);
}
}
//ws连接断开的回调方法
ws.onclose = function(e) {
setMessageInnerHTML("close");
}

//将消息显示在网页上
function setMessageInnerHTML(innerHTML) {
document.getElementById('message').innerHTML += innerHTML + '<br/>';
}

//关闭连接
function closeWebSocket() {
ws.close();
}


//发送消息
function send(msg) {
if(!msg){
msg = document.getElementById('text').value;
document.getElementById('message').innerHTML += "send:" + msg + '<br/>';
ws.send(msg);
}
}
</script>
</html>

成功连接!

 

七、生产环境需配置nginx (本配置为wss版,需监听443,ws版监听80端口即可)

server {
listen 443 ssl;
#监听的域名地址
server_name xxxx.com;
ssl_certificate cert/xxxx.com.pem;
ssl_certificate_key cert/xxxx.com.key;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_ciphers ALL:!kEDH!ADH:RC4+RSA:+HIGH:+EXP;

#监听的路径,对应第二步中的连接路径
location /ws/ {
proxy_pass http://127.0.0.1:14000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}

# 不添加,则会导致后台管理页面无法登录
location / {
#这里是反向代理的地址,我用的是tomcat默认的8080端口
proxy_pass http://localhost:14000/login;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 1;
proxy_send_timeout 200;
proxy_read_timeout 200;
}
}

 

标签:websocket,ruoyi,若依,session,ws,proxy,WebSocket,public
From: https://www.cnblogs.com/fswhq/p/18039904

相关文章

  • 若依框架整合Echarts图表
    若依框架整合Echarts图表一、前端1、放置Echarts图表的div<el-col:span="12"><div:class="className":style="{height:height,width:width}":ref="'chart'"/></el-col>​ 注:ref里的字段,需为字符串2、前端需要导入的包impo......
  • 基于WebSocket的modbus通信(三)- websocket和串口
    WebSocket传递ModbusTCP数据包错误纠正上一篇还有个错误,就是客户端写数据时服务端不需要响应,但我的服务端响应了的。我选择改客户端,把写数据时接收到的响应丢弃。PrintBytes(ADUMessage.Serialze(request),"请求");if(Client!=null){awaitClient.Client.SendAsyn......
  • 基于WebSocket的modbus通信(二)- 客户端
    上一篇已经实现了ModbusTcp服务器和8个主要的功能码,只是还没有实现错误处理功能。但是在测试客户端时却发现了上一篇的一个错误,那就是写数据成功,服务器不需要响应。接下来要做的就是实现ModbusTcp客户端。有了清晰的协议,代码循规蹈矩的写就行了。效果原始数据其中只读寄存......
  • 5.SpringTask,WebSocket
    SpringTask,WebSocketSpringTask介绍:SpringTask是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑;定位:定时任务框架作用:定时自动执行某段Java代码;应用场景:信用卡每月还款提醒;银行贷款每月还款提醒;火车票售票系统处理未支付订单;入职纪念日为......
  • 基于WebSocket的modbus通信(一)- 服务器
    ModbusTcp协议是基于tcp的,但不是说一定要通过tcp协议才能传输,只要能传输二进制的地方都可以。比如WebSocket协议。但由于目前我只有tcp上面的modbus服务器实现,所以我必须先用tcp连接借助已有工具来验证我的服务器是否写正确。效果ModBusTCP协议报文ModBusTCP协议报文比较复......
  • 若依框架数据导入功能
    @AutowiredprotectedValidatorvalidator;@OverridepublicStringimportData(Listlist,booleanupdateSupport){//TODO:修改T为实际数据对象if(CollectionUtils.isEmpty(list)){thrownewServiceException("导入数据不能为空!");}intsuccessNum=0;intfailureNum......
  • golang开发 gorilla websocket的使用
    很多APP都需要主动向用户推送消息,这就需要用到长连接的服务,即我们通常提到的websocket,同样也是使用socket服务,通信协议是基本类似的,在go中用的最多的、也是最简单的socket服务就是gorilla/websocket,它有21.1K的star,足以说明它的受欢迎程度,它的github地址是https://github.com/g......
  • 根据若依系统+minio实现批量下载附件并自动压缩成zip
    效果实现:  分割!!!!以下代码参考于http://t.csdn.cn/4dUmDwg话不多说直接从后端开始0.首先是pom依赖<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.5.7</version></dependency>1.后端Contr......
  • 若依微服务版使用swagger
    第一步,在使用的nacos模块下添加 swagger.enabled.true(貌似可有可无) 第二步:重启该模块,刷新页面,并且打开系统工具的系统接口第三步:进入swagger调试页面,选择要调试的模块和controller,找到要调试的方法,出现调试页面第四步:点击【试试看】按钮,点击【execute】按钮即可进行调试......
  • 记一次攻防演练中的若依(thymeleaf 模板注入)getshell
    记一次攻防演练中幸运的从若依弱口令到后台getshell的过程和分析。0x01漏洞发现首先,我会先把目标的二级域名拿去使用搜索引擎来搜索收集到包含这个目标二级域名的三级域名或者四级域名的网站。这样子可以快速的定位到你所要测试的漏洞资产。1、推荐三个比较实用的搜索引擎:奇......