`
zhangdaiscott
  • 浏览: 440990 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
8fb25857-16b4-3681-ab5e-e319f45c42a8
Jeecg快速开发平台
浏览量:0
文章分类
社区版块
存档分类

JeecgBoot关于websocket的改进方案

阅读更多

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;
 
@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函数改为:
@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);
        }
    }
 
分享到:
评论

相关推荐

    spring-boot-websocket-client代码示例

    `spring-boot-websocket-client`这个项目就是一个关于此主题的代码示例。Spring Boot作为Java生态中的一个热门框架,简化了创建独立、生产级别的基于Spring的应用程序。而WebSocket则是一种在客户端和服务器之间建立...

    spring-boot+webSocket实现向日葵远程控制

    本项目为spring-boot+webSocket实现的向日葵远程控制项目 向日葵是一款很好用的远程操作软件。 一直很好奇这种软件的基本原理是如何的? 今天带大家通过一个简单的项目来探究一下,并实现一个简单的远程操控软件 ...

    spring boot+websocket

    在本文中,我们将深入探讨如何在Spring Boot框架中集成WebSocket技术,以便实现实时通信功能。结合jQuery在前端的应用,可以构建出一个高效、实时的Web应用。首先,让我们了解Spring Boot和WebSocket的基本概念。 ...

    spring boot+websocket前后端简单demo

    在本文中,我们将深入探讨如何使用Spring Boot和WebSocket技术创建一个简单的前后端交互示例。Spring Boot是Java领域中广泛使用的微服务框架,它简化了Spring应用的初始设置和配置。而WebSocket则是一种在客户端和...

    Spring Boot 集成 WebSocket(原生注解与Spring封装方式)

    阅读建议:此资源以开发 Spring Boot 集成 WebSocket 学习其原理和内核,不仅是代码编写实现也更注重内容上的需求分析和方案设计,所以在学习的过程要结合这些内容一起来实践,并调试对应的代码。

    Spring Boot整合websocket实现群聊,音频发送,点对点聊天,图片发送.zip

    Spring Boot整合websocket实现群聊,音频发送,点对点聊天,图片发送。 Spring Boot整合websocket实现群聊,点对点聊天,图片发送,音频发送。 Spring Boot整合websocket实现群聊,点对点聊天,图片发送,音频发送 ...

    基于Spring Boot + WebSocket + Redis,可快速开发的分布式即时通讯群聊系统.zip

    基于Spring Boot + WebSocket + Redis,可快速开发的分布式即时通讯群聊系统.zip 1、该资源内项目代码经过严格调试,下载即用确保可以运行! 2、该资源适合计算机相关专业(如计科、人工智能、大数据、数学、电子信息...

    spring boot整合WebSocket实现多人聊天室的实例

    在本实例中,我们将探讨如何使用Spring Boot整合WebSocket和STOMP协议来实现一个多人聊天室。 首先,我们需要在Spring Boot项目中添加WebSocket的相关依赖。这通常包括`spring-websocket`和`spring-messaging`。在`...

    spring-boot-websocket-study-master.zip

    在本项目"spring-boot-websocket-study-master.zip"中,我们主要探讨的是如何利用Spring Boot框架集成WebSocket技术来实现一个实时的游戏公告系统。这个系统能够让游戏管理员在后台发布游戏公告,而所有在线的游戏...

    (源码)基于Spring Boot和WebSocket的站内信系统.zip

    # 基于Spring Boot和WebSocket的站内信系统 ## 项目简介 本项目是一个基于Spring Boot和WebSocket的站内信系统,旨在为Spring Boot项目集成站内信功能。通过整合WebSocket,系统支持向指定用户发送信息和群发信息,...

    spring-boot-websocket.rar

    标题中的“spring-boot-websocket.rar”表明这是一个关于Spring Boot集成WebSocket技术的压缩包资源。Spring Boot是Java领域中一个流行的微服务框架,它简化了创建独立的、生产级的基于Spring的应用程序。WebSocket...

    boot-websocket-study.rar

    在这个"boot-websocket-study"项目中,开发者提供了一个用于学习WebSocket的示例,通过导入并运行此项目,你可以直观地了解WebSocket的工作原理和应用。 首先,项目名称"boot-websocket-study"表明它是基于Spring ...

    java开发基于SpringBoot+WebSocket+Redis分布式即时通讯群聊系统.zip

    一个基于Spring Boot + WebSocket + Redis,可快速开发的分布式即时通讯群聊系统。适用于直播间聊天、游戏内聊天、客服聊天等临时性群聊场景。 Java开发基于SpringBoot+WebSocket+Redis分布式即时通讯群聊系统。一...

    Spring Boot整合websocket实现群聊,点对点聊天,图片发送,音频发送

    Spring Boot作为Java生态中的微服务框架,提供了方便地集成WebSocket的功能,使得开发者能够轻松构建实时交互的应用,如群聊、点对点聊天以及发送图片和音频等富媒体消息。 首先,集成WebSocket到Spring Boot项目中...

    Spring Boot + WebSocket + 广播式

    将WebSocket集成到Spring Boot中,可以轻松实现高效、稳定的实时通信功能。 本项目是一个基于Spring Boot的WebSocket广播式通信的示例。"广播式"意味着当服务器接收到一条消息时,会将这条消息广播给所有已连接的...

    spring-boot-websocket-sample-master.zip_spring boot_spring-boot_

    在本例中,"spring-boot-websocket-sample-master.zip"是一个示例项目,展示了如何在Spring Boot应用中集成WebSocket技术来实现实时通信。 WebSocket是一种在客户端和服务器之间建立长连接的协议,允许双向通信,即...

    spring-boot+websocket

    这是整理网上关于spring-boot集成websocket的Demo,实现了基本的广播,点对点消息发送,以及连接监听,断开监听,以及连接session信息获取等基本功能,代码是完整的,亲测可用,jdk运行环境是jdk1.8,希望对大家有用...

    (源码)基于Spring Boot和WebSocket的实时聊天系统.zip

    # 基于Spring Boot和WebSocket的实时聊天系统 ## 项目简介 本项目是一个基于Spring Boot和WebSocket的实时聊天系统,旨在提供一个高效、实时的聊天平台。系统支持用户登录、注册、个人信息管理、好友添加、一对一...

    Spring boot整合websocket实现即时通讯

    Spring boot整合websocket实现即时通讯。传统的HTTP协议,一般通过向服务器发送请求,拉取数据实现半双工通信,缺点是服务器难以直接向浏览器下发消息,因此,websocket协议应运而生,可用于向建立连接的浏览器主动...

    Springboot多连接池+websocket

    在Spring Boot中,可以通过`spring-websocket`模块实现WebSocket功能。使用`@ServerEndpoint`注解定义WebSocket的端点,`@MessageMapping`用于处理消息。同时,还需要配置WebSocket的消息处理器,例如使用`...

Global site tag (gtag.js) - Google Analytics