Fullstar

Archives

  • December 2025
  • August 2024
  • July 2024
  • February 2024
  • November 2023
  • August 2023
  • July 2023
  • January 2023
  • November 2022
  • October 2022
  • September 2022
  • February 2022
  • January 2022
  • September 2021
  • January 2021
  • December 2020
  • November 2020
  • October 2020
  • September 2020
  • August 2020
  • July 2020

Categories

  • Code
  • Lens
  • Life
0
Fullstar
  • Code

SpringBoot+WebSocket

  • October 27, 2020
  • Brandon

Looking for a Shorter Overview?

AI Summary

通过Spring Boot的WebSocket依赖、配置类和服务端点,可以按用户wid维护实时连接并定向推送消息。前端建立连接后接收任务提醒,后端还可利用账号对应的连接检测重复登录,实现伪单点登录。

Key Moments

AI-generated
1

引入WebSocket依赖并注册端点导出器

添加spring-boot-starter-websocket依赖,并通过ServerEndpointExporter使Spring Boot能够扫描和发布WebSocket端点。
2

按用户wid维护WebSocket连接

WebSocketServer在连接打开时将wid与会话实例写入ConcurrentHashMap,并在连接关闭时移除对应连接。
3

后端定向推送任务提醒

通过AppointSending按wid查找在线会话并发送文本消息,业务层可在任务开始时调用它通知指定用户。
4

前端建立连接并处理登录冲突

前端以wid拼接/socket地址创建WebSocket连接、接收提醒消息,同时可利用同账号连接检测实现伪单点登录。
Total
0
Shares
0
0
0

1.导入依赖

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

2.后端

2.1 配置类(config)

@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

2.2 WebSocketServer类

@ServerEndpoint("/socket/{wid}")
@Component
public class WebSocketServer {

    private static ConcurrentHashMap<Integer,WebSocketServer> webSocketMap = new ConcurrentHashMap<>();
    //存储哈希表,使用Integer找到对应的WebSocketServer
    private Session session;//与当前用户的连接会话
    private Integer wid;//当前用户的wid

    @OnOpen
    public void onOpen(Session session,@PathParam("wid") Integer wid) {
        //接收由@ServerEndpoint传入的{wid}
        this.session = session;
        this.wid = wid;
        webSocketMap.put(wid, this);//写入hash表
    }

    @OnClose
    public void onClose() {
        webSocketMap.remove(wid);//连接中断时将对应websocket移出
    }

    public void AppointSending(Integer wid,String message){
    //向wid发送message
        try {
            if(webSocketMap.get(wid) == null){//此用户当前未登录则取消发送
                return;
            }
            webSocketMap.get(wid).session.getBasicRemote().sendText(message);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

}

解释:设置@ServerEndpoint(“/socket/{wid}”),其作用类似于controller中常用的@RequestMapping注解,当前端访问此地址时将访问函数@OnOpen

3.前端

let socket;
$(document).ready(function(){
    let socketUrl="http://localhost:8080/socket/"+$.cookie("wid");
    connetcSocket(socketUrl);
})

    function connetcSocket(socketUrl){
        socketUrl=socketUrl.replace("https","ws").replace("http","ws");
        if(socket != null){
            socket.close();
            socket = null;
        }
        socket = new WebSocket(socketUrl);//创建连接
        //打开事件
        socket.onopen = function() {
            console.log("websocket已打开");
        };
        //获得消息事件
        socket.onmessage = function(data) {
            //接收消息
            let content = data.data;
            layer.confirm(content,{icon: 0, title:'任务提醒'},function(index) 
            {
                layer.close(index);
            })
        };
        //关闭事件
        socket.onclose = function() {
            console.log("websocket已关闭");
        };
        //发生了错误事件
        socket.onerror = function() {
            console.log("websocket发生了错误");
        }
    }

4.后端发送

 //用于反向推送
    @Autowired
    WebSocketServer webSocketServer;//自动注入

    private void noticeTask(Integer wid,Integer tid){
        //提醒wid要开始tid任务
        Task task = taskService.selectTaskByTid(tid);
        String content = "项目号:"+task.getPid()+",子任务号:"+task.getTid()+",已经可以开始执行,请留意!";
        webSocketServer.AppointSending(wid,content);
    }

5.利用websocket实现伪单点登录

用户在每个前端页面均与后端保持websocket连接,其中连接使用账号充当key,当有相同账号的用户登录时查看哈希表中是否存在相同key值,若有则表示重复登录,则后端向前端发送信息,通知其退出登录,在其退出登录后第二个用户再建立连接。

Related Posts

AI-generated

Springboot常用依赖/工具包

从 WebJars 引入 Bootstrap、jQuery,到配置 Thymeleaf、热部署、WebSocket 与 Shiro,这份清单集中给出 SpringBoot 项目常用依赖及关键配置要点。
69.8% match October 30, 2020

Shiro基本使用

从UserRealm的账号密码认证,到user:add权限授权,再到Shiro过滤链和Thymeleaf页面标签,快速搭建可登录、可拦截、可按权限显示按钮的基础安全功能。
52.1% match October 31, 2020

Questions Answered

AI-generated

Spring Boot如何启用WebSocket服务端点?

引入启动依赖并注册ServerEndpointExporter配置Bean即可启用。

如何根据用户wid管理WebSocket连接?

用并发哈希表保存wid与当前服务端实例的对应关系。

后端怎样向指定用户发送实时消息?

查找wid对应会话,再通过BasicRemote发送文本消息。

WebSocket怎样实现伪单点登录?

以账号为连接键检测重复登录并通知原用户退出。

Next Up

常用依赖速配
配置Shiro权限
微信小程序实战
掌握线程调度
Total
0
Shares
Share 0
Tweet 0
Pin it 0
Brandon

Previous Article
  • Code

JavaFx常用语句(查阅用)

  • September 28, 2020
  • Brandon
View Post
Next Article
  • Code

Springboot常用依赖/工具包

  • October 30, 2020
  • Brandon
View Post
You May Also Like
View Post
  • Code

Letta部署记录

  • Brandon
  • December 26, 2025
View Post
  • Code

WordPress 后台任务利器:使用 BGRunner 构建可靠的异步处理

  • Brandon
  • December 14, 2025
View Post
  • Code

WordPress image offload

  • Brandon
  • December 14, 2025
View Post
  • Code

ComfyUI应用手册

  • Brandon
  • December 6, 2025
View Post
  • Code

Leetcode Java常用代码

  • Brandon
  • February 17, 2024
View Post
  • Code

Golang入门

  • Brandon
  • February 4, 2024
View Post
  • Code

Setting Up and Maintaining a Ubuntu Environment for My Home Server

  • Brandon
  • November 24, 2023
View Post
  • Code

Swift Learning Log

  • Brandon
  • August 31, 2023

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Fullstar

Input your search keywords and press Enter.

Springboot常用依赖/工具包

Shiro基本使用

基于vue的微信小程序开发

Java 多线程

异常处理的合理使用与防御式编程

JDBC操作Hive概述

UP NEXT

Springboot常用依赖/工具包

69.8% match October 30, 2020 0