关注JEECG发展历程 关注最新动态和版本, 记录JEECG成长点滴 更新日志 - 技术支持 - 招聘英才

JEECG最新版本下载 JEECG智能开发平台 - 显著提高开发效率 常见问题 - 入门视频 - 参与开源团队

商务QQ: 2019066212、3102411850 商务热线(5*8小时): 010-64808099 官方邮箱: jeecgos@163.com

查看: 203|回复: 0

JeecgBoot关于websocket的改进方案

[复制链接]
发表于 2022-5-12 11:40:14 | 显示全部楼层 |阅读模式
1.环境描述

JeecgBoot3.0



2.websocket权限认证
  • 在shiroConfig.java代码中注释掉
  1. filterChainDefinitionMap.put("/websocket/**", "anon");//系统通知和公告
复制代码

  • 配置拦截器
  1. package org.jeecg.config.websocket;

  2. import org.apache.commons.lang.StringUtils;
  3. import org.springframework.http.server.ServerHttpRequest;
  4. import org.springframework.http.server.ServerHttpResponse;
  5. import org.springframework.http.server.ServletServerHttpRequest;
  6. import org.springframework.http.server.ServletServerHttpResponse;
  7. import org.springframework.stereotype.Component;
  8. import org.springframework.web.socket.WebSocketHandler;
  9. import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12. import java.util.Map;

  13. @Component
  14. public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor {

  15.     @Override
  16.     public boolean beforeHandshake(ServerHttpRequest request,
  17.                                    ServerHttpResponse response, WebSocketHandler wsHandler,
  18.                                    Map<String, Object> attributes) throws Exception {
  19.         return super.beforeHandshake(request, response, wsHandler, attributes);
  20.     }

  21.     @Override
  22.     public void afterHandshake(ServerHttpRequest request,
  23.                                ServerHttpResponse response, WebSocketHandler wsHandler,
  24.                                Exception ex) {

  25.         HttpServletRequest httpServletRequest = ((ServletServerHttpRequest)request).getServletRequest();
  26.         HttpServletResponse httpServletResponse = ((ServletServerHttpResponse)response).getServletResponse();
  27.         if(StringUtils.isNotEmpty(httpServletRequest.getHeader("sec-websocket-protocol")))
  28.             httpServletResponse.addHeader("sec-websocket-protocol", httpServletRequest.getHeader("sec-websocket-protocol"));
  29.         super.afterHandshake(request, response, wsHandler, ex);
  30.     }
  31. }
复制代码

  • 修改前端的请求,在HeaderNotice.vue中
  1. let token = Vue.ls.get(ACCESS_TOKEN)
  2. var url = window._CONFIG['domianURL'].replace("https://","wss://").replace("http://","ws://")+"/websocket/"+userId +"?token="+token
复制代码

3. HashMap不是线程安全的,可以改为线程安全的map,如下
  1. private static Map<String, Session> sessionPool = new ConcurrentHashMap<>();
复制代码

4.重复发送问题
  • 原有的代码为:
  1. /**
  2.      * 服务器端推送消息
  3.      */
  4.     public void pushMessage(String message) {
  5.         try {
  6.             webSockets.forEach(ws -> ws.session.getAsyncRemote().sendText(message));
  7.         } catch (Exception e) {
  8.             e.printStackTrace();
  9.         }
  10.     }


  11.     @OnMessage
  12.     public void onMessage(String message) {
  13.         //todo 现在有个定时任务刷,应该去掉
  14.         log.debug("【websocket消息】收到客户端消息:" + message);
  15.         JSONObject obj = new JSONObject();
  16.         //业务类型
  17.         obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_CHECK);
  18.         //消息内容
  19.         obj.put(WebsocketConst.MSG_TXT, "心跳响应");
  20.         for (WebSocket webSocket : webSockets) {
  21.             webSocket.pushMessage(message);
  22.         }
  23.     }
复制代码

  • 可将OnMessage函数改为:
   
  1. @OnMessage
  2.     public void onMessage(String message) {
  3.         //todo 现在有个定时任务刷,应该去掉
  4.         log.debug("【websocket消息】收到客户端消息:" + message);
  5.         JSONObject obj = new JSONObject();
  6.         //业务类型
  7.         obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_CHECK);
  8.         //消息内容
  9.         obj.put(WebsocketConst.MSG_TXT, "心跳响应");
  10.         for (WebSocket webSocket : webSockets) {
  11.    //webSocket.pushMessage(message);
  12.             webSocket.session.getAsyncRemote().sendText(message);
  13.         }
  14.     }
复制代码

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表