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; @Componentpublic 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);        }    }