北京国炬信息技术有限公司

  • 首页
  • 产品方案
    • 低代码平台
    • 流程设计器
    • 微服务方案
    • 表单设计器
    • 大屏设计器
    • 报表设计器
    • 流程数据中台
    • 移动APP方案
  • 新闻动态
    • 公司动态
    • 技术博客
    • 学习视频
  • 关于我们
    • 公司简介
    • 发展历程
    • 公司荣誉
    • 联系我们
  • 人才招聘
首页 > 新闻动态 > 公司动态

JeecgBoot关于websocket的改进方案

作者:admin 发布时间:2022-05-12 点击数:

1.环境描述

JeecgBoot3.0

2.websocket权限认证

  • 在shiroConfig.java代码中注释掉
filterChainDefinitionMap.put("/websocket/**", "anon");//系统通知和公告
  • 配置拦截器
package org.jeecg.config.websocket;
 
import org.apache.commons.lang.StringUtils;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.http.server.ServletServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
 
@Component
public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor {
 
    @Override
    public boolean beforeHandshake(ServerHttpRequest request,
                                   ServerHttpResponse response, WebSocketHandler wsHandler,
                                   Map<String, Object> attributes)
 throws Exception 
{
        return super.beforeHandshake(request, response, wsHandler, attributes);
    }
 
    @Override
    public void afterHandshake(ServerHttpRequest request,
                               ServerHttpResponse response, WebSocketHandler wsHandler,
                               Exception ex)
 
{
 
        HttpServletRequest httpServletRequest = ((ServletServerHttpRequest)request).getServletRequest();
        HttpServletResponse httpServletResponse = ((ServletServerHttpResponse)response).getServletResponse();
        if(StringUtils.isNotEmpty(httpServletRequest.getHeader("sec-websocket-protocol")))
            httpServletResponse.addHeader("sec-websocket-protocol", httpServletRequest.getHeader("sec-websocket-protocol"));
        super.afterHandshake(request, response, wsHandler, ex);
    }
}
  • 修改前端的请求,在HeaderNotice.vue中
let token = Vue.ls.get(ACCESS_TOKEN)
var url = window._CONFIG['domianURL'].replace("https://","wss://").replace("http://","ws://")+"/websocket/"+userId +"?token="+token

3. HashMap不是线程安全的,可以改为线程安全的map,如下

 private static Map<String, Session> sessionPool = new ConcurrentHashMap<>();

4.重复发送问题

  • 原有的代码为:
  /**
     * 服务器端推送消息
     */

    public void pushMessage(String message) {
        try {
            webSockets.forEach(ws -> ws.session.getAsyncRemote().sendText(message));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
 
    @OnMessage
    public void onMessage(String message) {
        //todo 现在有个定时任务刷,应该去掉
        log.debug("【websocket消息】收到客户端消息:" + message);
        JSONObject obj = new JSONObject();
        //业务类型
        obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_CHECK);
        //消息内容
        obj.put(WebsocketConst.MSG_TXT, "心跳响应");
        for (WebSocket webSocket : webSockets) {
            webSocket.pushMessage(message);
        }
    }
  • 可将OnMessage函数改为:
    @OnMessage
    public void onMessage(String message) {
        //todo 现在有个定时任务刷,应该去掉
        log.debug("【websocket消息】收到客户端消息:" + message);
        JSONObject obj = new JSONObject();
        //业务类型
        obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_CHECK);
        //消息内容
        obj.put(WebsocketConst.MSG_TXT, "心跳响应");
        for (WebSocket webSocket : webSockets) {
   //webSocket.pushMessage(message);
            webSocket.session.getAsyncRemote().sendText(message);
        }
    }


加入收藏
上一篇:JeecgBoot 3.2.0 版本发布,基于代码生成器的企
下一篇:JeecgBoot抵御XSS攻击实现方案
返回列表

随便看看

  • 2024年度开源低代码大排名!这几个遥遥领先!
  • 制作报表可以使用哪些数据库?积木报表15种数据库类型任你选!
  • 参与JEECG插件开发大赛,赢千元现金大奖!
  • 秋日上新!H5活动之家营销平台升级大盘点!
  • 开源低代码平台,JeecgBoot v3.7.1 大版本发布
  • 免费的可视化Web报表工具,JimuReport v1.4.4-beta版本发布
  • JeecgBoot集成TiDB,打造高效可靠的数据存储解决方案
  • JeecgBoot集成宝兰德AppServer部署方案
  • Jeewx-Boot 1.2 小程序官网模块发布,免费开源的微
  • JeecgBoot轻松解决ERP项目复杂布局需求!

  • 公司产品
  • JeecgBoot低代码平台
  • 敲敲云零代码
  • 大屏设计器
  • 流程设计器
  • 表单设计器
  • 源码下载
  • JeecgBoot低代码平台
  • 积木报表平台
  • 移动开发平台
  • 微信管家平台
  • 更多信息
  • JEECG官方论坛
  • JEECG插件市场
  • 仪表盘设计器
  • 积木报表官网
  • 联系我们
  • 中国·北京·朝阳区科荟前街1号院奥林佳泰大厦9层
  • 商务QQ: 69893005、418799587
  • 商务热线: 010-64808099(5*8小时)
  • 项目外包: 18611788525(5*8小时)
  • 扫码关注我们
Copyright © 2015 北京国炬软件 All Rights Reserved Powered by JEECG 京ICP备2023027727号