首页 > 其他分享 >springboot 集成 websocket

springboot 集成 websocket

时间:2024-06-18 09:59:28浏览次数:19  
标签:集成 websocket springboot springframework return session org import public

1.首先添加maven依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

 

2.添加拦截器

import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.HandshakeInterceptor;

import javax.servlet.http.HttpSession;
import java.util.Map;

public class CustomWebSocketInterceptor implements HandshakeInterceptor {
    private static TokenProperties tokenProperties;

    static {
        //不能注入 动态设置
        tokenProperties = SpringUtil.getBean(TokenProperties.class);
    }

    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
        ServletServerHttpRequest serverHttpRequest = (ServletServerHttpRequest) request;
        HttpSession session = serverHttpRequest.getServletRequest().getSession();
        String token = serverHttpRequest.getServletRequest().getParameter("token");
        if (StrUtil.isBlank(token)) {
            return false;
        }

        //解密token 
        
        return true;
    }

    @Override
    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception e) {

    }
}

 

3.工具类

import cn.hutool.core.lang.Console;
import cn.hutool.json.JSONUtil;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;

import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class TelSocketSessionUtil {
    private static Map<String, WebSocketSession> clients = Collections.synchronizedMap(new HashMap<>());//new ConcurrentHashMap<>();

    /**
     * 保存一个连接
     *
     * @param session
     */
    public static void add(Object o, WebSocketSession session) {
        clients.put(getKey(o), session);
    }

    /**
     * 获取一个连接
     *
     * @return
     */
    public static WebSocketSession get(Object o) {
        return clients.get(getKey(o));
    }

    /**
     * 移除一个连接
     */
    public static void remove(Object o) throws IOException {
        clients.remove(getKey(o));
    }

    /**
     * 组装sessionId
     *
     * @return
     */
    public static String getKey(Object o) {
        return JSONUtil.toJsonStr(o);
        //return JsonUtils.serialize(o);
    }

    /**
     * 判断是否有效连接
     * 判断是否存在
     * 判断连接是否开启
     * 无效的进行清除
     *
     * @return
     */
    public static boolean hasConnection(Object o) {
        String key = getKey(o);
        if (clients.containsKey(key)) {
            return true;
        }
        return false;
    }

    /**
     * 获取连接数的数量
     *
     * @return
     */
    public static int getSize() {
        return clients.size();
    }

    /**
     * 发送消息到客户端
     *
     * @throws Exception
     */
    public static void sendMessage(Object key, String message) throws Exception {
        if (!hasConnection(key)) {
            throw new NullPointerException(getKey(key) + " connection does not exist");
        }

        WebSocketSession session = get(key);
        try {
            session.sendMessage(new TextMessage(message));
        } catch (IOException e) {
            Console.log("WebSocket sendMessage exception: {}", getKey(key));
            Console.log(e.getMessage(), e);
            clients.remove(getKey(key));
        }
    }
}

 

4.实现处理器

import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;

@Component
public class CustomWebSocketHandler extends TextWebSocketHandler {

    private static final CopyOnWriteArraySet<WebSocketSession> sessions = new CopyOnWriteArraySet<>();

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        sessions.add(session);
        TelSocketSessionUtil.add("", session);
//        TelSocketSessionUtil.sendMessage("", "我给你发消息了");
        System.out.println("New connection established: " + session.getId());
    }

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        String payload = message.getPayload();
        System.out.println("Received message: " + payload);
        // Broadcast the received message to all connected clients
        for (WebSocketSession webSocketSession : sessions) {
            if (webSocketSession.isOpen()) {
                webSocketSession.sendMessage(new TextMessage("Server received: " + payload));
            }
        }
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        sessions.remove(session);
        System.out.println("Connection closed: " + session.getId());
    }

    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
        System.err.println("Transport error: " + exception.getMessage());
    }

    private void sendMessageToAll(String message) throws IOException {
        for (WebSocketSession session : sessions) {
            if (session.isOpen()) {
                session.sendMessage(new TextMessage(message));
            }
        }
    }
}

 

5.启用

import cn.boxitec.websocket.CustomWebSocketHandler;
import cn.boxitec.websocket.CustomWebSocketInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    private final CustomWebSocketHandler customWebSocketHandler;

    public WebSocketConfig(CustomWebSocketHandler customWebSocketHandler) {
        this.customWebSocketHandler = customWebSocketHandler;
    }

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry
                .addHandler(customWebSocketHandler, "ws")
                .addInterceptors(new CustomWebSocketInterceptor())
                .setAllowedOrigins("*");
    }
}

  

标签:集成,websocket,springboot,springframework,return,session,org,import,public
From: https://www.cnblogs.com/besehen/p/18253769

相关文章

  • Java毕业设计-基于springboot开发的图书商城管理系统-毕业论文(附毕设源代码)
    文章目录前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1、开发说明2、需求/流程分析3、系统功能结构三、系统实现展示1、管理员功能介绍1.1图书列表1.2图书订单信息管理1.3图书类型管理四、毕设内容和源代码获取总结Java毕业设计-基于springboot开发的图书......
  • Java毕业设计-基于springboot开发的图书进销存管理系统-毕业论文(附毕设源代码)
    文章目录前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1、开发说明2、需求/流程分析3、系统功能结构三、系统实现展示1、用户信息管理2、图书类型管理3、商品退货管理4、客户信息管理5、图书添加6、客户添加7、应收金额四、毕设内容和源代码获取总结Java......
  • SpringBoot3项目打war包部署至Tomcat
    前言:近期,在搞国产中间件的部署,那么则需要将项目打为war包,并且在tomcat内尝试成了再去部署到国产中间件吧,以免引起不必要的时间浪费。1、准备工作准备好tomcat10的版本准备好SpringBoot项目2、代码改造打war包需要从springboot依赖中排除tomcat相关的包,我们以Snowy国产快速......
  • SpringBoot3整合SpringDoc实现在线接口文档
    写在前面在现目前项目开发中,一般都是前后端分离项目。前端小姐姐负责开发前端,苦逼的我们负责后端开发事实是一个人全干,在这过程中编写接口文档就显得尤为重要了。然而作为一个程序员,最怕的莫过于自己写文档和别人不写文档大家都不想写文档,那这活就交给今天的主角Swagger来实现......
  • 毕业设计——基于springboot的电力巡检系统
    !!!有需要的小伙伴可以通过文章末尾名片咨询我哦!!! ......
  • 毕业设计——基于SpringBoot的个人博客系统
    !!!有需要的小伙伴可以通过文章末尾名片咨询我哦!!! ......
  • 基于Springboot框架班级综合测评管理系统的设计与实现
    开头语:你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。开发语言:Java数据库:MySQL技术:Springboot框架,B/S模式工具:MyEclipse系统展示首页个人中心学生管理综合测评管理摘要随着互联网技术的高速发展,班级综合测评管理系统应运而生,旨在实现学校管......
  • SpringBoot的Security和OAuth2的使用
    创建项目先创建一个spring项目。然后编写pom文件如下,引入spring-boot-starter-security,我这里使用的springboot是2.4.2,这里使用使用spring-boot-dependencies,在这里就能找到对应的security的包。<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.......
  • 基于springboot的南门桥社区疫情防疫系统-48138(免费领源码+数据库)可做计算机毕业设计J
    Springboot南门桥社区疫情防疫系统的设计与实现摘 要信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对南门桥社区疫情防疫系统等问题,对南门桥社区......
  • Docker+Jenkins+Pipline实现SpringBoot项目input选择不同差异性yml文件打包、执行sh打
    场景Docker+Jenkins+Pipline如何获取git插件环境变量(提交sha、分支等)以及Jenkinsfile中获取sh执行结果(获取git最近提交信息):https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/139697004在上面的基础上实现了使用Jenkinsfile文件获取git的提交记录以及获取sh的执......