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

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

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

查看: 4571|回复: 1

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.     }
复制代码

发表于 2023-3-23 17:09:36 | 显示全部楼层
这时相机的稳定性问题就会变得幸运飞艇直播福彩双色球结果幸运时时彩走势图非常突出,一丁点儿的晃动都会致使成像模糊不清,导致拍摄失败
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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