1.环境描述JeecgBoot3.02.websocket权限认证在shiroConfig.java代码中注释filterChainDefinitionMap.put("/websocket/**","anon");//系统通知和公告配置jec软件包.org配置.websocket;导入org.apache.commons.lang.StringUtils;导入org.springframework.http.server.ServerHttpRequest;导入org.springframework.http.server.ServerHttpResponse;导入org.springframework.http.server.ServletServerHttpRequest;导入org.springframework.http.server.ServletServerHttpResponse;导入org.springframework.stereotype.Component;导入org.springframework.web.socket.WebSocketHandler;导入org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;导入javax.servlet.http.HttpServletRequest;导入javax.servlet.http.HttpServletResponse;导入java.util.Map;@ComponentpublicclassHandshakeInterceptorextendsHttpSessionHandshakeInterceptor{@OverridepublicbooleanbeforeHandshake(ServerHttpRequest请求,ServerHttpResponse响应,WebSocketHandlerwsHandler,Mapattributes)throwsException{returnsuper.beforeHandshake(request,response,wsHandler,attributes);}@OverridepublicvoidafterHandshake(ServerHttpRequestrequest,ServerHttpResponseresponse,WebSocketHandlerwsHandler,Exceptionex){HttpServletRequesthttpServletRequest=((ServletServerHttpRequest)request).getServletRequest();HttpServletResponsehttpServletResponse=((ServletServerHttpResponse)response).getServletResponse();if(StringUtils.isNotEmpty(httpServletRequest.getHeader("sec-websocket-protocol")))httpServletResponse.addHeader("sec-websocket-protocol",httpServletRequest.getHeader("sec-websocket-protocol"));super.afterHandshake(请求,响应,wsHandler,ex);}}修改前端请求,在HeaderNotice.vue中让token=Vue.ls.get(ACCESS_TOKEN)varurl=window._CONFIG['domianURL'].replace("https://","wss://").replace("http://","ws://")+"/websocket/"+userId+"?token="+token3.HashMap不是线程安全的,可以改成线程安全的map,如下privatestaticMapsessionPool=newConcurrentHashMap<>();4、重复发送问题的原代码为:/***服务器端推送消息*/publicvoidpushMessage(Stringmessage){try{webSockets.forEach(ws->ws.session.getAsyncRemote().sendText(消息));}catch(Exceptione){e.printStackTrace();}}@OnMessagepublicvoidonMessage(Stringmessage){//todo现在有定时刷任务,log.debug([websocketmessage]receivedclientmessage:"+message);JSONObjectobj=newJSONObject();//业务类型obj.put(WebsocketConst.MSG_CMD,WebsocketConst.CMD_CHECK);//消息内容obj.put(WebsocketConst.MSG_TXT,"心跳响应");for(WebSocketwebSocket:webSockets){webSocket.pushMessage(消息);}}OnMessage函数可以改成:@OnMessagepublicvoidonMessage(Stringmessage){//todo现在有定时刷任务,log.debug([websocketmessage]receivedclientmessage:"+message);JSONObjectobj=newJSONObject();//业务类型obj.put(WebsocketConst.MSG_CMD,WebsocketConst.CMD_CHECK);//消息内容obj.put(WebsocketConst.MSG_TXT,"心跳响应");for(WebSocketwebSocket:webSockets){//webSocket.pushMessage(消息);webSocket.session.getAsyncRemote().sendText(消息);}}