提取和会话以及CORS

时间:2018-08-23 02:16:59

标签: reactjs session flask cors fetch

我正在运行一个React前端和一个Flask后端。我什么都不懂。

让我们来谈谈CORS。 CORS是跨域资源共享。那么,当我在同一主机上同时运行前端和后端时,为什么Chrome会抱怨CORS?

因此,我在Flask后端上启用了CORS,并以快乐的方式继续。

我并不愚蠢,所以我想,如果我的用户的数据不小心刷新或关闭了页面,该如何保存?幸运的是,Flask在会话中内置了Cookie。因此,我继续将重要的内容存储在会话中,在componentDidMount中,我尝试获取一些重要的内容。但是刷新后,Flask会忘记会话,并且我的提取操作不会返回有用的数据。

我尝试查找了一段时间,并且看到了一些有趣的东西,例如要获取的凭据参数。如果我写{credentials: "include"},请按照docs进行操作:

  

即使对于跨域调用,也始终发送用户凭据(cookie,基本的http auth等)。

表面上,这应该可以解决我的问题,并在某种程度上解决了我的困惑,但是,当然,没有这样的运气:

  

对预检请求的响应未通过访问控制检查:响应中的“ Access-Control-Allow-Credentials”标头的值为“,当请求的凭据模式为” include”时必须为“ true” 。因此,不允许访问来源“ http://localhost:3000”。

请帮助我了解正在发生的事情以及如何解决此问题。

我会继续研究。

2 个答案:

答案 0 :(得分:1)

简而言之:

  1. 您的服务器应该说它支持凭据。 Flask中的support_credentials=True会产生Access-Control-Allow-Credentials: true标头。
  2. 您的前端应在请求中包含凭据:{credentials: "include"}
  3. 您的服务器应返回不带通配符的Access-Control-Allow-Origin,即http://foo.example而不是*

最好使用浏览器的开发工具进行故障排除。

在这里查看更多说明:https://stackoverflow.com/a/7189502/803174

答案 1 :(得分:0)

所以我找到了一个解决方案,但我愿意接受一个明确说明正在发生什么情况的答案。

我的解决方案是在我的Flask应用中添加protected void TransactionTypeTextBox_SelectedIndexChanged(object sender, DropDownListEventArgs e) { RadDropDownList dropdownlist1 = (RadDropDownList)sender; GridEditFormInsertItem item = (GridEditFormInsertItem)dropdownlist1.NamingContainer; Panel Panel1 = (Panel)item.FindControl("Panel1"); if (dropdownlist1.SelectedItem.Text == "Cheque") { Panel1.Visible = true; } else if (dropdownlist1.SelectedItem.Text == "Cash") { Panel1.Visible = false; } } ,使代码行如下所示:

supports_credentials=True

然后我可以在获取请求中添加CORS(app, supports_credentials=True) ,并且cookie似乎已成功存储。