如何阻止Chrome调试时Dart HTTP将请求合并为带?next参数的形式
问题根因
你观察到的「请求合并」本质是浏览器自动处理重定向的表现:Web端请求/myDash时没有携带登录态Cookie,后端判定未登录,返回302重定向到/login?next=%2FmyDash,浏览器自动跟进重定向请求,才会出现你看到的合并格式URL。
具体解决步骤
1. 修复平台判断逻辑错误
你当前的myDash方法只给安卓、iOS端加了Cookie头,Web端请求完全没有携带登录态,直接导致后端返回重定向:
// 原代码的问题:只适配了移动端,没有覆盖Web场景 if (UniversalPlatform.isAndroid || UniversalPlatform.isIOS) { print("<<Is android>"); headers.addAll({'Cookie': sessionCookie}); }
同时注意:Web端禁止手动设置Cookie头,Cookie属于浏览器禁止修改的请求首部,手动添加会被浏览器直接拦截,不会生效。
2. 适配Web端凭证携带规则
http包专门为Web端提供了withCredentials配置项,开启后浏览器会自动管理同域Cookie(自动携带请求Cookie、保存后端返回的Set-Cookie),不需要你手动存储操作:
修改两个请求的代码,增加withCredentials配置:
// 登录请求修改 var request = http.MultipartRequest('POST', Uri.parse(domain + '/login')); request.followRedirects = false; request.persistentConnection = false; // 新增这行,适配Web端凭证携带 request.withCredentials = true; // 拉取数据请求修改 var request = http.Request('GET', Uri.parse(domain + '/myDash')); // 新增这行,适配Web端凭证携带 request.withCredentials = true;
Web端可以直接删除手动设置Cookie、手动存储sessionCookie的逻辑,完全交给浏览器处理即可,原有手动存Cookie的逻辑保留给移动端使用就行。
3. 调整Flask后端CORS配置
Web端跨域请求要正常携带Cookie,后端需要做对应的CORS配置:
- 安装
flask-cors依赖 - 配置时开启
supports_credentials = True origins不能设为通配符*,必须明确填写你Flutter Web的调试地址(比如http://localhost:54321,你可以在Chrome地址栏看到实际的调试端口)
示例配置:
from flask_cors import CORS app = Flask(__name__) CORS(app, origins=["http://localhost:你的Flutter Web调试端口"], supports_credentials=True)
4. 可选优化:替换Multipart请求
你用MultipartRequest提交普通表单完全没必要,直接用http.post方法提交FormData更简单,也不会有额外的开销:
// 替换原有Multipart请求逻辑 var response = await http.post( Uri.parse(domain + '/login'), body: {'username': username, 'password': paswd}, headers: headers, );
修改完成后重启调试,就能看到两个请求独立发起,不会再出现重定向合并的情况。
内容的提问来源于stack exchange,提问作者Nicholas Collins
相关产品推荐
相关产品推荐

