Flutter忽略Https、WSS证书验证

使用Dio单独忽略Https证书验证

Dio _dio = Dio();
_dio.options.baseUrl = UrlConfig.BASE_URL;
    _dio.options.connectTimeout = 5000;
    _dio.options.receiveTimeout = 3000;
    //忽略Https校验
    (_dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate =
        (HttpClient client) {
      client.badCertificateCallback =
          (X509Certificate cert, String host, int port) {
        return true;
      };
    };
    _dio.interceptors.add(HttpInterceptor.getInstance());

全局忽略Https证书验证

由于项目需求需要,在使用忽略Https证书验证的过后,连接websocket时使用的是wss地址,故而也需要忽略证书验证,不然会报CERTIFICATE_VERIFY_FAILED错误,方式如下:

class GlobalHttpOverrides extends HttpOverrides {
  @override
  HttpClient createHttpClient(SecurityContext context) {
    // TODO: implement createHttpClient
    return super.createHttpClient(context)
      ..badCertificateCallback =
          (X509Certificate cert, String host, int port) => true;
  }
}

使用的时候,在main方法当中调用

HttpOverrides.global = GlobalHttpOverrides();

如果需要设置全局的,则不需要单独为dio设置证书忽略;
另外,我使用的websocket连接库是web_socket_channel: ^1.1.0;对于全局忽略证书验证,我个人觉得还不是很好,是否有另外的方式单独在为连接websocket时,忽略证书验证呢,而不通过全局的忽略去实现效果???

参考:how to solve flutter CERTIFICATE_VERIFY_FAILED error while performing a POST request?

<think>好的,我现在要详细思考如何在Spring Boot中配置WebSocket,并实现与Flutter客户端的集成。首先,我需要回忆一下WebSocket的基本概念和Spring Boot中相关的配置步骤。 WebSocket是一种在单个TCP连接上进行全双工通信的协议,适合实时应用。在Spring Boot中,通常使用Spring WebSocket模块来实现。记得需要添加依赖,比如spring-boot-starter-websocket。然后,配置类需要启用WebSocket支持,通常通过@EnableWebSocketMessageBroker注解,并继承AbstractWebSocketMessageBrokerConfigurer来配置消息代理。 接下来,可能需要创建控制器来处理消息,使用@MessageMapping注解的方法来处理客户端发送的消息,以及@SendTo注解来指定返回的消息目的地。此外,前端(这里指Flutter)需要使用WebSocket客户端库来连接和通信,比如在Flutter中使用web_socket_channel包。 然后,关于Flutter部分,需要安装相应的依赖,并建立WebSocket连接,发送和接收消息。可能需要处理连接状态、错误处理以及消息的序列化和反序列化。 不过,有些步骤我可能记不太清楚,比如具体的配置类代码,或者是否需要使用STOMP协议。此外,跨域问题也是需要考虑的,特别是在开发环境中,前端和后端可能运行在不同的端口上,需要配置CORS。 另外,参考信息中的引用似乎不太相关,比如引用[1]提到了Symfony、PHP等技术,可能与当前问题无关。引用[2]是关于阿里云容器服务集成日志服务和Istio,可能也不直接相关。因此,可能需要忽略这些引用,专注于Spring Boot和Flutter的配置。 总结一下,步骤可能包括: 1. 在Spring Boot项目中添加WebSocket依赖。 2. 配置WebSocket消息代理,启用STOMP(如果需要的话)。 3. 创建消息处理控制器。 4. 在Flutter中安装WebSocket客户端库。 5. 在Flutter中建立连接,发送和接收消息。 6. 处理可能的跨域问题。 现在需要详细检查每个步骤的正确性,确保代码示例准确无误,并注意LaTeX格式的正确使用,比如数学公式用$...$包裹,独立公式用$$...$$。同时,生成相关问题时要围绕WebSocket配置和集成展开。 可能遇到的问题包括:依赖版本冲突、WebSocket连接失败、消息无法正确路由、跨域配置错误等。需要确保在教程中提及这些问题的解决方法,或者引导用户如何排查。 最后,确保回答结构清晰,分步骤说明,代码示例正确,并且生成的相关问题有助于用户深入理解该主题。</think>### 在Spring Boot中配置WebSocket并与Flutter集成的详细步骤 #### 1. Spring Boot后端配置 **步骤1:添加依赖** 在`pom.xml`中添加WebSocket和STOMP协议支持: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> ``` **步骤2:配置WebSocket消息代理** 创建配置类`WebSocketConfig.java`,启用消息代理: ```java import org.springframework.context.annotation.Configuration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; import org.springframework.web.socket.config.annotation.StompEndpointRegistry; import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker("/topic"); // 客户端订阅的主题前缀 config.setApplicationDestinationPrefixes("/app"); // 服务端接收消息的路由前缀 } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS(); // 允许跨域 } } ``` **步骤3:创建消息控制器** 编写控制器处理客户端消息: ```java import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.messaging.handler.annotation.SendTo; import org.springframework.stereotype.Controller; @Controller public class WebSocketController { @MessageMapping("/send/message") // 客户端发送消息的路由:/app/send/message @SendTo("/topic/messages") // 广播到/topic/messages public String handleMessage(String message) { return "Server response: " + message; } } ``` --- #### 2. Flutter客户端集成 **步骤1:添加依赖** 在`pubspec.yaml`中添加WebSocket库: ```yaml dependencies: web_socket_channel: ^2.4.0 ``` **步骤2:建立WebSocket连接** 在Flutter中连接Spring Boot后端: ```dart import 'package:web_socket_channel/web_socket_channel.dart'; import 'package:web_socket_channel/io.dart'; class WebSocketService { final WebSocketChannel channel = IOWebSocketChannel.connect( 'ws://localhost:8080/ws', // 后端WebSocket端点 ); void sendMessage(String message) { channel.sink.add(message); } void dispose() { channel.sink.close(); } } ``` **步骤3:监听消息并显示** 在Flutter页面中实时接收消息: ```dart import 'package:flutter/material.dart'; import 'package:web_socket_channel/web_socket_channel.dart'; class ChatScreen extends StatefulWidget { @override _ChatScreenState createState() => _ChatScreenState(); } class _ChatScreenState extends State<ChatScreen> { final TextEditingController _controller = TextEditingController(); final WebSocketChannel channel = IOWebSocketChannel.connect('ws://localhost:8080/ws'); @override Widget build(BuildContext context) { return Scaffold( body: Column( children: [ Expanded( child: StreamBuilder( stream: channel.stream, builder: (context, snapshot) { return Text(snapshot.hasData ? '${snapshot.data}' : ''); }, ), ), TextField( controller: _controller, onSubmitted: (value) { channel.sink.add(value); _controller.clear(); }, ), ], ), ); } @override void dispose() { channel.sink.close(); super.dispose(); } } ``` --- #### 3. 注意事项 - **跨域问题**:后端配置`setAllowedOrigins("*")`仅用于开发环境,生产环境需指定具体域名。 - **STOMP协议**:上述示例使用STOMP简化消息路由,若需原生WebSocket,需手动处理帧解析[^1]。 - **安全性**:生产环境中建议启用加密(`wss://`)和身份验证。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TenTenXu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值