| 
 | 
 
| 
1.环境描述 JeecgBoot3.0  
 
2.websocket权限认证- 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
 
 -     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);
 
 -         }
 
 -     }
 
  复制代码 
 |   
 
 
 
 |