flutter web 登录获得选项但不会发布
我有一个正在构建的应用程序,并且一年内没有更改登录代码,更新后我的 flutter 登录页面将请求 OPTIONS 并且 go API 服务器返回 200。以前,服务器中没有出现 OPTIONS 日志。这种情况发生在开发和生产中。我的 Linux 客户端登录正常。
我在这里进行了 CORS 更改,但没有效果。 GET 请求工作正常,但从来没有 POST 请求到达服务器。
这是我的错误:
ClientException: XMLHttpRequest error., uri=https://api.mydomain.com/login
这是我的服务器端代码。
r := chi.NewRouter() r.Use(middleware.RequestID) r.Use(middleware.Logger) r.Use(middleware.Recoverer) r.Use(middleware.URLFormat) r.Use(render.SetContentType(render.ContentTypeJSON)) r.Use(cors.Handler(cors.Options{ AllowedOrigins: []string{"https://*, http://*"}, AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, AllowedHeaders: []string{"Accept", "Origin", "Authorization", "Content-Type", "X-CSRF-Token", "X-Requested-With"}, ExposedHeaders: []string{"Link"}, AllowCredentials: false, MaxAge: 300, // Maximum value not ignored by any of major browsers }))
这是我的颤振登录信息:
Future<bool> login(String email, String password, String fcmToken) async { try { var response = await http.post( Uri.parse("$_baseUrl/login"), headers: <String, String>{ 'Content-Type': 'application/json; charset=UTF-8', }, body: jsonEncode( <String, String>{ 'business_email': email, 'password': password, 'token': fcmToken, }, ), ); if (response.statusCode == 200) { String jwt = response.body; await storage.write(key: 'jwt', value: jwt); return true; } } catch (e) { logger.d(e); return false; } return false; }
我的登录页面
class Login extends StatefulWidget { const Login({ Key? key, }) : super(key: key); @override State<Login> createState() => _LoginState(); } class _LoginState extends State<Login> { @override void initState() { WidgetsBinding.instance.addPostFrameCallback( (_) => showSnackBar(context), ); super.initState(); } final GlobalKey<FormState> _formKey = GlobalKey(); final FocusNode _focusNodePassword = FocusNode(); final TextEditingController _controllerUserEmail = TextEditingController(); final TextEditingController _controllerPassword = TextEditingController(); bool _obscurePassword = true; bool isLoading = false; String? fcmToken = ''; @override Widget build(BuildContext context) { var model = LoginModel( authenticationService: Provider.of(context, listen: false), ); return Scaffold( body: Form( key: _formKey, child: SingleChildScrollView( padding: const EdgeInsets.all(30.0), child: Column( children: [ const SizedBox( height: 20, ), SizedBox( //height: 20, width: double.infinity, child: Text( 'exactCASE', textAlign: TextAlign.center, style: Theme.of(context).textTheme.headlineLarge, )), const SizedBox(height: 30), isLoading ? const Center(child: CircularProgressIndicator()) : Text( 'Login to your account', style: Theme.of(context).textTheme.labelMedium, ), const SizedBox(height: 20), TextFormField( controller: _controllerUserEmail, keyboardType: TextInputType.name, decoration: InputDecoration( labelText: 'Email', prefixIcon: const Icon(Icons.person_outline), border: OutlineInputBorder( borderRadius: BorderRadius.circular(10), ), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(10), ), ), onEditingComplete: () => _focusNodePassword.requestFocus(), validator: (String? value) { if (value == null || value.isEmpty) { return "Please enter your email"; } return null; }, ), const SizedBox(height: 10), TextFormField( controller: _controllerPassword, focusNode: _focusNodePassword, obscureText: _obscurePassword, keyboardType: TextInputType.visiblePassword, decoration: InputDecoration( labelText: "Password", prefixIcon: const Icon(Icons.password_outlined), suffixIcon: IconButton( onPressed: () { setState(() { _obscurePassword = !_obscurePassword; }); }, icon: _obscurePassword ? const Icon(Icons.visibility_outlined) : const Icon(Icons.visibility_off_outlined)), border: OutlineInputBorder( borderRadius: BorderRadius.circular(10), ), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(10), ), ), validator: (String? value) { if (value == null || value.isEmpty) { return "Please enter password."; } return null; }, ), const SizedBox(height: 30), Column( children: [ FilledButton( style: FilledButton.styleFrom( minimumSize: const Size.fromHeight(50), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(20), ), ), onPressed: () { if (_formKey.currentState?.validate() ?? false) { _login(context, model, _controllerUserEmail.text, _controllerPassword.text); } }, child: const Text("Login"), ), ], ), ], ), ), ), ); } @override void dispose() { _focusNodePassword.dispose(); _controllerUserEmail.dispose(); _controllerPassword.dispose(); super.dispose(); } Future<void> _login(BuildContext context, LoginModel model, String email, String password) async { final navigator = Navigator.of(context); if (defaultTargetPlatform != TargetPlatform.linux && defaultTargetPlatform != TargetPlatform.windows) { fcmToken = await FirebaseMessaging.instance.getToken(); } setState( () { isLoading = true; }, ); fcmToken ??= ''; var loginSuccess = await model.login(email, password, fcmToken!); if (loginSuccess) { navigator.pushNamed(RoutePaths.homeTabs); } else { setState( () { isLoading = false; final snackBar = SnackBar( content: const Text('Login Failed!'), action: SnackBarAction( label: 'OK', onPressed: () {}, )); ScaffoldMessenger.of(context).showSnackBar(snackBar); }, ); } } }
正确答案
根据 的文档Access-Control-Allow-Origin 源响应应该是单个 URL(即请求者)或单个字符 *
。
尝试改变:
AllowedOrigins: []string{"https://*, http://*"},
至
AllowedOrigins: []string{"*"},
以上是flutter web 登录获得选项但不会发布的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

OpenSSL,作为广泛应用于安全通信的开源库,提供了加密算法、密钥和证书管理等功能。然而,其历史版本中存在一些已知安全漏洞,其中一些危害极大。本文将重点介绍Debian系统中OpenSSL的常见漏洞及应对措施。DebianOpenSSL已知漏洞:OpenSSL曾出现过多个严重漏洞,例如:心脏出血漏洞(CVE-2014-0160):该漏洞影响OpenSSL1.0.1至1.0.1f以及1.0.2至1.0.2beta版本。攻击者可利用此漏洞未经授权读取服务器上的敏感信息,包括加密密钥等。

Go语言中用于浮点数运算的库介绍在Go语言(也称为Golang)中,进行浮点数的加减乘除运算时,如何确保精度是�...

Go爬虫Colly中的Queue线程问题探讨在使用Go语言的Colly爬虫库时,开发者常常会遇到关于线程和请求队列的问题。�...

本文讨论了GO的反思软件包,用于运行时操作代码,对序列化,通用编程等有益。它警告性能成本,例如较慢的执行和更高的内存使用,建议明智的使用和最佳

本文讨论了GO中使用表驱动的测试,该方法使用测试用例表来测试具有多个输入和结果的功能。它突出了诸如提高的可读性,降低重复,可伸缩性,一致性和A

本文讨论了通过go.mod,涵盖规范,更新和冲突解决方案管理GO模块依赖关系。它强调了最佳实践,例如语义版本控制和定期更新。
