React如何解决fetch跨域请求时session失效问题


Posted in Javascript onNovember 02, 2018

前言

fetch在reactjs中等同于 XMLHttpRequest,它提供了许多与XMLHttpRequest相同的功能,但被设计成更具可扩展性和高效性。

Fetch 的核心在于对 HTTP 接口的抽象,包括 Request,Response,Headers,Body,以及用于初始化异步请求的 global fetch。得益于 JavaScript 实现的这些抽象好的 HTTP 模块,其他接口能够很方便的使用这些功能;除此之外,Fetch 还利用到了请求的异步特性——它是基于 Promise 的。

请注意,fetch 规范与 jQuery.ajax() 主要有两种方式的不同,牢记:

  • 当接收到一个代表错误的 HTTP 状态码时,从 fetch()返回的 Promise 不会被标记为 reject, 即使该 HTTP 响应的状态码是 404 或 500。相反,它会将 Promise 状态标记为 resolve (但是会将 resolve 的返回值的 ok 属性设置为 false ), 仅当网络故障时或请求被阻止时,才会标记为 reject。
  • 默认情况下, fetch 不会从服务端发送或接收任何 cookies, 如果站点依赖于用户 session,则会导致未经认证的请求(要发送 cookies,必须设置 credentials 选项).

发现问题

在解决fetch跨域请求接口的时候,一般都是让后台接口在返回头里添加

//允许所有域名的脚本访问该资源
header("Access-Control-Allow-Origin: *");

React如何解决fetch跨域请求时session失效问题

确实这样是可以解决跨域请求的问题,但是如果我们要在请求的时候添加session,那么这样设置就会出现问题了。

fetch添加Cookie验证的方法是设置credentials: 'include'

fetch(url, {
  method: 'POST',
  body: JSON.stringify(params),
  mode: 'cors',
  //请求时添加Cookie
  credentials: 'include',
  headers: new Headers({
   'Accept': 'application/json',
   "Content-Type": "application/x-www-form-urlencoded; charset=utf-8",
  })
 })

设置好了之后,信心满满的发起请求。却发现网络请求报错了

A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true. Origin 'http://localhost:3000' is therefore not allowed access

解决方法

原因是网络请求需要携带Cookie时Access-Control-Allow-Origin是不能设置为*的,这个时候应该要给Access-Control-Allow-Origin指定域名

React如何解决fetch跨域请求时session失效问题

这样就可以达到跨域请求的同时传递Cookie的目的了

  • 列表项目

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JavaScript 三种不同位置代码的写法
Oct 25 Javascript
html 锁定页面(js遮罩层弹出div效果)
Oct 27 Javascript
JQuery中判断一个元素下面是否有内容或者有某个标签的判断代码
Feb 02 Javascript
JavaScript禁止页面操作的示例代码
Dec 17 Javascript
JS+CSS实现感应鼠标渐变显示DIV层的方法
Feb 20 Javascript
JavaScript中的原始值和复杂值
Jan 07 Javascript
JS字符串长度判断,超出进行自动截取的实例(支持中文)
Mar 06 Javascript
详解vue与后端数据交互(ajax):vue-resource
Mar 16 Javascript
微信小程序实现保存图片到相册功能
Nov 30 Javascript
从零撸一个pc端vue的ui组件库( 计数器组件 )
Aug 08 Javascript
Vue-CLI与Vuex使用方法实例分析
Jan 06 Javascript
关于Node.js中频繁修改代码重启服务器的问题
Oct 15 Javascript
element ui table 增加筛选的方法示例
Nov 02 #Javascript
Vue请求JSON Server服务器数据的实现方法
Nov 02 #Javascript
详解使用element-ui table组件的筛选功能的一个小坑
Nov 02 #Javascript
如何使用vuex实现兄弟组件通信
Nov 02 #Javascript
JavaScript 复制对象与Object.assign方法无法实现深复制
Nov 02 #Javascript
vue头部导航动态点击处理方法
Nov 02 #Javascript
angular6 利用 ngContentOutlet 实现组件位置交换(重排)
Nov 02 #Javascript
You might like
PHP中遍历stdclass object的实现代码
2011/06/09 PHP
基于php伪静态的实现详细介绍
2013/04/28 PHP
PHP生成迅雷、快车、旋风等软件的下载链接代码实例
2014/05/12 PHP
php自动加载方式集合
2016/04/04 PHP
Laravel5.1 框架Request请求操作常见用法实例分析
2020/01/04 PHP
javascript 清除输入框中的数据
2009/04/13 Javascript
Javascript的并行运算实现代码
2010/11/19 Javascript
基于jquery的滑动样例代码
2010/11/20 Javascript
让新消息在网页标题闪烁提示的jQuery代码
2013/11/04 Javascript
jquery上传插件fineuploader上传文件使用方法(jquery图片上传插件)
2013/12/05 Javascript
js获取本机操作系统类型的两种方法
2015/12/19 Javascript
详解WordPress开发中get_current_screen()函数的使用
2016/01/11 Javascript
bootstrap按钮插件(Button)使用方法解析
2017/01/13 Javascript
javascript深拷贝和浅拷贝详解
2017/02/14 Javascript
微信小程序-横向滑动scroll-view隐藏滚动条
2017/04/20 Javascript
vue以组件或者插件的形式实现throttle或者debounce
2019/05/22 Javascript
vue使用高德地图根据坐标定位点的实现代码
2019/08/22 Javascript
[15:56]Heroes18_暗影萨满(完美)
2014/10/31 DOTA
Phantomjs抓取渲染JS后的网页(Python代码)
2016/05/13 Python
如何利用python制作时间戳转换工具详解
2018/09/12 Python
python树莓派红外反射传感器
2019/01/21 Python
Python netmiko模块的使用
2020/02/14 Python
python3.6使用SMTP协议发送邮件
2020/05/20 Python
python实现图书馆抢座(自动预约)功能的示例代码
2020/09/29 Python
英国著名国际平价时尚男装品牌:Topman
2016/08/27 全球购物
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/01/13 面试题
应届生幼儿园求职信
2013/11/12 职场文书
员工培训邀请函
2014/02/02 职场文书
信息技术培训感言
2014/03/06 职场文书
党委领导班子整改方案
2014/09/30 职场文书
道歉信范文
2015/05/12 职场文书
评估“风险”创业计划的几大要点
2019/08/12 职场文书
golang json数组拼接的实例
2021/04/28 Golang
Pytorch中Softmax与LogSigmoid的对比分析
2021/06/05 Python
Vue全局事件总线你了解吗
2022/02/24 Vue.js
python热力图实现的完整实例
2022/06/25 Python