当前位置:首页 > 技术分析 > 正文内容

在SpringBoot+Vue3项目中通过Nginx代理WebSocket实现跨域通信

ruisui885个月前 (01-15)技术分析41

引言

在现代Web开发中,实时数据交互变得越来越重要,而WebSocket作为HTML5标准的一部分,提供了一种全双工、长连接的通信方式,使得服务器与客户端可以进行双向实时通信。但在实际应用中,由于浏览器同源策略的限制,前端应用直接访问后端WebSocket服务可能会受到阻碍,尤其是在前后端部署不在同一域名或端口下的情况下。这时,我们可以借助Nginx反向代理来解决这一问题。

本文将详细介绍如何在基于SpringBoot+Vue3的项目中配置Nginx以代理WebSocket,从而实现实时、跨域的数据通信。

步骤一:搭建Spring Boot WebSocket服务

首先,在Spring Boot后端创建并配置WebSocket服务。这里简述一个基本的WebSocket处理器:

// 引入相关依赖
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 {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(myWebSocketHandler(), "/ws").setAllowedOrigins("*"); // 允许所有来源
    }

    @Bean
    public MyWebSocketHandler myWebSocketHandler() {
        return new MyWebSocketHandler();
    }
}

// WebSocket消息处理器
@Component
public class MyWebSocketHandler extends TextWebSocketHandler {

    @Override
    public void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException {
        String payload = message.getPayload();
        // 处理接收到的消息
        // ...
        session.sendMessage(new TextMessage("Received: " + payload));
    }

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        // 连接建立后的处理
        // ...
    }
}

步骤二:Vue3前端建立WebSocket连接

在Vue3前端,我们使用WebSocket API创建连接,并确保连接地址是Nginx代理的WebSocket路径(假设为/api/ws):

import { onMounted, ref } from 'vue';

export default {
  setup() {
    const socket = ref(null);

    onMounted(() => {
      // 创建WebSocket连接
      socket.value = new WebSocket('/api/ws');

      socket.value.onopen = function(event) {
        console.log('WebSocket连接已打开');
      };

      socket.value.onmessage = function(event) {
        console.log('接收到消息:', event.data);
      };

      socket.value.onerror = function(error) {
        console.error('WebSocket错误:', error);
      };
    });

    // 发送消息到服务器的方法
    const sendMessage = (msg) => {
      if (socket.value.readyState === WebSocket.OPEN) {
        socket.value.send(msg);
      } else {
        console.log('WebSocket还未准备好发送消息');
      }
    };

    return {
      sendMessage
    };
  }
};

步骤三:配置Nginx代理WebSocket

在Nginx服务器上,我们需要设置WebSocket的反向代理。编辑Nginx配置文件(如 /etc/nginx/sites-available/default),添加如下配置:

server {
    listen 80; # 或者你希望监听的其他端口
    server_name your-domain.com; # 替换为你的域名

    location /api/ws {
        proxy_pass http://localhost:8080/ws; # 后端WebSocket服务的实际地址
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_read_timeout 60s; # 可根据需要调整超时时间
    }

    # ...其他常规HTTP请求的代理配置...
}

保存配置后,重启Nginx服务,使新的配置生效。

通过以上步骤,我们在SpringBoot+Vue3项目中成功配置了Nginx对WebSocket的代理。当Vue3前端尝试连接到/api/ws时,实际上是由Nginx转发至本地运行的Spring Boot WebSocket服务,从而实现了跨越不同源的WebSocket通信。

小结

综上所述,利用Nginx强大的反向代理功能,不仅可以解决WebSocket的跨域问题,还可以帮助我们更好地管理网络流量和负载均衡,提高整个系统的稳定性和可靠性。

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/319.html

分享给朋友:

“在SpringBoot+Vue3项目中通过Nginx代理WebSocket实现跨域通信” 的相关文章

关于Vue页面跳转传参,参数不同, 但页面只获取参数一次的问题

#头条创作挑战赛#1.问题描述问题描述: element 展示表格(页面A),点击表格的每一行的查看详情按钮,可以携带此行的信息参数跳转到另一个页面(页面B),但是从A页面到B页面,只有第一次跳转的时候B页面可以获取到A页面的参数,返回再次A->B ,B页面无法获取到参数。2.解决办法:方法一...

Vue Router 4 路由操作 - 路由导航

路由导航分为 声明式导航 和 编程式导航。通过 <router-link to="..."> 标签跳转的方式为声明式导航。通过 路由实例对象(router.push(...))跳转的为编程式导航。导航到不同的位置想要导航到不同的URL,使用 router.push 方法。...

慕课 SpringBoot2.X+Vue+UniAPP,全栈开发医疗小程序

本课程以业务驱动技术栈,打造业务相对完整的掌上医疗小程序,解决大家没有好的毕设项目或者求职项目的困境。本课程案例采用前后端分离架构,业务功能完善(既有WEB管理端,也有移动用户端),界面美观,无需艰涩的技术也能做出亮眼的作品。SpringBoot2.X+Vue+UniAPP,全栈开发医疗小程序 |...

Ruoyi-vue第五十二章:Uniapp小程序配置tabbar底部导航栏

一、功能实现效果如下图底部的tabbar二、uniapp的tabBar如果应用是一个多 tab 应用,可以通过 tabBar 配置项指定一级导航栏,以及 tab 切换时显示的对应页。在 pages.json 中提供 tabBar 配置,不仅仅是为了方便快速开发导航,更重要的是在App和小程序端提升性...

在vue项目中封装WebSockets请求

在Vue项目中封装WebSocket请求包括以下步骤:1. 安装WebSocket库:首先,导入WebSocket库,例如`vue-native-websocket`或`socket.io-client`。根据项目需求选择适当的库,并根据官方文档进行安装和配置。2. 创建WebSocket服务:在V...

微信将研发“应用号”体系 或成为App大杂烩应用

Akiha发表于 2016-01-11 18:11微信正在探讨一种新的公众号形态,即在现有的订阅号、服务号之外,再研发新的“应用号”体系。让用户不必去装各种 App,在微信里就能实现各种服务、功能;关注后,“应用号”平时不向用户发送消息,需要时,用户再去点开“应用号”等。目前,微信钱包内已有的服务,...