You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go/Gin后端WebSocket升级及认证:Flutter连接报错求助

解决Flutter WebSocket连接认证及发送数据问题

一、修复当前连接错误

你现在的问题核心是:手动发起HTTP握手后又重新创建新连接,且误用了https协议(WebSocket对应HTTPS的协议是wss)。正确做法是直接通过IOWebSocketChannel.connect完成握手+连接,同时携带Cookie通过认证,无需手动发送HTTP请求。

修改后的Flutter代码示例:

Future<void> connectWebSocket() async {
  final jsonString = await loadSharedPrefs("cookie");
  if (jsonString != null) {
    // 用wss协议对应HTTPS环境,ws对应HTTP环境
    final url = Uri.parse('wss://${globals.serverurl}/api/driver/ws');
    final headers = <String, String>{
      'Cookie': '${globals.mipmip}=${Uri.encodeComponent(jsonString)}',
    };
    try {
      // 直接通过connect方法完成握手,自动携带必要的升级头
      _webSocketChannel = IOWebSocketChannel.connect(
        url,
        headers: headers,
      );
      _onlineStatus = true;
      notifyListeners();

      // 监听WebSocket流,处理消息、错误和断开事件
      _webSocketChannel.stream.listen(
        (message) {
          // 处理服务器发送的消息
        },
        onError: (error) {
          print("WebSocket错误: $error");
          _onlineStatus = false;
          notifyListeners();
        },
        onDone: () {
          _onlineStatus = false;
          notifyListeners();
        },
      );
    } catch (e) {
      print("连接失败: $e");
      _onlineStatus = false;
      notifyListeners();
    }
  }
}

关键说明:

  • wss://是HTTPS对应的WebSocket协议,ws://对应HTTP,必须匹配后端部署环境。
  • IOWebSocketChannel.connect会自动生成并添加Upgrade、Connection等握手必需的头,只需传入自定义的Cookie头即可。
  • 该方式仅发起一次连接请求,既能通过后端的CookieAuth和DriverMiddleware认证,又能直接使用连接发送/接收数据。

二、WebSocket最佳认证方式

根据场景不同,常用的WebSocket认证方式分为以下几种:

1. Cookie认证(适合同域场景)

  • 优势:复用现有HTTP认证体系,无需额外修改后端逻辑,浏览器环境下会自动携带Cookie(Flutter需手动设置)。
  • 注意:确保WebSocket连接域名与Cookie域名一致,避免跨域Cookie无法携带的问题。

2. JWT Token认证(适合跨域/前后端分离场景)

  • 实现方式:握手时通过Authorization头携带Token,比如headers: {'Authorization': 'Bearer ${yourJwtToken}'},后端中间件解析该头完成认证。
  • 优势:不依赖Cookie,支持跨域,安全性较高,适配移动端、跨域Web应用。

3. 握手后认证(适合特殊场景)

  • 实现方式:先建立未认证的WebSocket连接,客户端立即发送认证信息(如Token),服务器验证通过后允许后续通信,未通过则断开连接。
  • 注意:需额外处理未认证连接的超时清理,逻辑相对复杂,一般作为备选方案。

不推荐使用URL参数传递Token,因为URL可能被服务器日志、代理记录,存在安全风险。

内容的提问来源于stack exchange,提问作者M6Gpower

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:22:50