vue socketIo客户端连接java后端(vite实现前端代理跨域)

中文互联网已经烂了,很多参考是没什么用的甚至是掐头去尾(胡编乱造),

反而是自己的分析+官方文档才是正路。(本文仅供参考,建议还是自己去分析问题以及参照官网)。(使用官方代理方法以及路径)

为什么用代理呢,是为了将浏览器的请求(类似重定向)发给前端服务器解决而不是直接打到后端。代理就会帮我们实现跨域,将不同host+port的域转成和你后端一样的域。

vite中文代理配置官网:开发服务器选项 | Vite 官方中文文档 (vitejs.dev)

  // 代理 websockets 或 socket.io 写法:ws://localhost:5173/socket.io -> 
  // 官方写法:                          ws://localhost:5174/socket.io
      '/socket.io': {
        target: 'ws://localhost:5174',
        ws: true,
      },

前端实现如下:

 const socket = io(`http://${location.host}?userId=${userId}`
        , {
        ackTimeout: 10000,
        retries: 5,
        autoConnect: true,
        transports: ['websocket','polling'],
        withCredentials: true,
    });

后端加上配置如下:

       //设置允许源
       config.setOrigin("*");
       //设置允许跨域
       config.setHostname("0.0.0.0");

vite.config.js代理实现代码:

'/socket.io': {
          target: 'http://localhost:9999',
          changeOrigin: true,
          secure: false,
          ws: true,
          onError(err, req, res) {
            console.error('Proxy error:', err);
          },
          onProxyReqWs(proxyReq, req, socket, options, head) {
            console.log('Proxying WebSocket request:', req.url);
          },

解释:有一个很坑爹的点就是,socketio客户端发送请求格式如下:

ws://localhost:3000/socket.io/?userId=10000000&EIO=4&transport=websocket

注意的点是我在请求路径上根本没写socket.io,他是所有请求都默认加上的,所以在做代理时就用他来做代理路径(不是可以,是唯一,如果你在创建socket的请求使用其他路径来做代理,那不好意思,会发生错误,错误一般是invaid namespace)。

对了,如果可以的话,真心建议看一下控制台每一个请求的信息,不断测试可能性,这样总比在“垃圾堆里”找答案好。(附:连接成功贴图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值