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

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

ruisui883个月前 (01-15)技术分析22

引言

在现代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实现跨域通信” 的相关文章

vue3中父子传值、defineProps用法、defineEmits用法

Vue3中新增了一个 script setup 语法糖模式,可以在单文件组件中更简洁地编写组件逻辑。使用 script setup 语法后,props、data、computed、methods 等选项不再需要独立定义,而是可以直接在 setup 函数中声明,代码结构更加清晰,并且可以更方便地使用响...

掌握版本控制:Git的那些常见用法与技巧

Git作为现代开发中最常用的版本控制系统,它的普及和高效性使得程序员几乎每天都在与它打交道。无论是个人项目,还是团队协作,Git都能帮助我们追踪代码的修改历史,保证代码版本的管理井井有条,并在多人协作时有效地避免冲突。本文将分享一些常见的Git用法与技巧,帮助你更好地掌握Git的强大功能,并提升你在...

理解virt、res、shr之间的关系(linux系统篇)

前言想必在linux上写过程序的同学都有分析进程占用多少内存的经历,或者被问到这样的问题——你的程序在运行时占用了多少内存(物理内存)?通常我们可以通过top命令查看进程占用了多少内存。这里我们可以看到VIRT、RES和SHR三个重要的指标,他们分别代表什么意思呢?这是本文需要跟大家一起探讨的问题。...

12种JavaScript中最常用的数组操作整理汇总

数组是最常见的数据结构之一,我们需要绝对自信地使用它。在这里,我将列出 JavaScript 中最重要的几个数组常用操作片段,包括数组长度、替换元素、去重以及许多其他内容。1、数组长度大多数人都知道可以像这样得到数组的长度:const arr = [1, 2, 3]; console.log(a...

微信外H5跳转小程序——组件(vue项目)

场景有个H5(vue项目),需要实现点击商品item跳转到小程序,微信内和微信外都要支持,这里我们只介绍一下H5在微信外的跳转。如图所示,红框内是一个商品,就是点击这里,要跳转小程序:配置微信小程序云开发(云函数)1、开通云开发然后选择免费额度2、云开发权限设置找到权限设置,把这里的「未登录用户访问...

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

//xia仔のke:chaoxingit.com/208/全栈开发医疗小程序:利用Spring Boot 2.X、Vue和UniApp在当今数字化时代,医疗行业也在不断地迈向信息化和智能化的方向。开发一款医疗小程序,能够为用户提供便捷的医疗服务和信息查询,为医疗机构提供高效的管理和服务渠道。本文将介...