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

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

ruisui884个月前 (01-15)技术分析24

引言

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

基于archlinux的发行版有哪些?

Arch Linux 是一个 Linux 发行版,采用滚动更新的模型,这意味着 Arch Linux 不会定期发布新版本,而是持续接收更新和升级,保持系统与最新软件版本的同步。Arch Linux 以其极简主义、简单性和用户定制为中心的特点而闻名,专注于让用户对其系统配置具有完全控制权。然而,它也以...

vue中组件之间的通信方式

** 1.1 父子组件**a. 父向子传数据: 第1种: 父通过属性传值,子组件通过props接收数据(注:props传过来的数据是单向的,不可以进行修改)第2种:子组件可以通过$parent来获取父组件里的数据和调用父组件的方法(注:数据是双向的,还要注意如用了UI组件并且在该UI组件里重新定义一...

java调用API操作GitLab

最近需要在一个WEB项目中集成GitLab,用到了GitLab的API操作,在网上找了很久都是说直接调用GitLab的Http接口,而且API官方只有javadoc没有其它说明文档,特别记录下,以备查询。这里采用Token的认证方式,因此需要先登陆GitLab新建一个Token,创建方式如下:创建完...

《暗黑破坏神 2:重制版》PC 版 2.3 版本发布,支持英伟达 DLSS

IT之家 12 月 3 日消息,暴雪为《暗黑破坏神 2:重制版》PC 版发布了更新 2.3 版本,添加了“离线难度缩放”滑块(玩家可以在单人游戏时增加挑战和奖励的级别)、多项辅助功能和用户界面改进,以及英伟达 DLSS 支持。玩法改进:玩家现在可以在离线游戏的选项菜单中使用“游戏难度等级”,它提供与...

Python中的11 种数组算法

1. 创建数组 创建数组意味着留出一个连续的内存块来存储相同类型的元素。在大多数语言中,您可以在创建数组时指定数组的大小。假设您正在书架上整理一组书籍,并且您需要为正好 10 本书预留空间。功能架上的每个空间都对应于数组中的一个索引。# Example in Python arr = [1, 2,...

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

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