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 相关文章推荐
setTimeout与setInterval在不同浏览器下的差异
Jan 24 Javascript
setTimeout函数兼容各主流浏览器运行执行效果实例
Jun 13 Javascript
jQuery中ajax的使用与缓存问题的解决方法
Dec 19 Javascript
用JS在浏览器中创建下载文件
Mar 05 Javascript
通过location.replace禁止浏览器后退防止重复提交
Sep 04 Javascript
JavaScript使用addEventListener添加事件监听用法实例
Jun 01 Javascript
javascript检查浏览器是否已经启用XX功能
Jul 10 Javascript
jQuery UI设置固定日期选择特效代码分享
Aug 27 Javascript
基于百度地图实现产品销售的单位位置查看功能设计与实现
Oct 21 Javascript
jQuery自定义元素右键点击事件(实现案例)
Apr 28 jQuery
微信小程序开发之路由切换页面重定向问题
Sep 18 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
Oct 02 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 split汉字
2009/06/05 PHP
写php分页时出现的Fatal error的解决方法
2011/04/18 PHP
php字符串截取的简单方法
2013/07/04 PHP
分享一则PHP定义函数代码
2015/02/26 PHP
PHP 输出缓冲控制(Output Control)详解
2016/08/25 PHP
php 多文件上传的实现实例
2016/10/23 PHP
Zend Framework分发器用法示例
2016/12/11 PHP
YII2 实现多语言配置的方法分享
2017/01/11 PHP
php删除数组指定元素实现代码
2017/05/03 PHP
如何用javascript去掉字符串里的所有空格
2007/02/08 Javascript
jQuery判断元素是否是隐藏的代码
2011/04/24 Javascript
js时间日期格式化封装函数
2014/12/02 Javascript
浅谈重写window对象的方法
2014/12/29 Javascript
Jquery中基本选择器用法实例详解
2015/05/18 Javascript
浅析JS获取url中的参数实例代码
2016/06/14 Javascript
Node.js与Sails redis组件的使用教程
2017/02/14 Javascript
js 博客内容进度插件详解
2017/02/19 Javascript
js断点调试心得分享(必看篇)
2017/12/08 Javascript
详解angular2如何手动点击特定元素上的点击事件
2018/10/16 Javascript
vue使用nprogress加载路由进度条的方法
2020/06/04 Javascript
Python工程师面试题 与Python Web相关
2016/01/14 Python
Python 含参构造函数实例详解
2017/05/25 Python
python基础练习之几个简单的游戏
2017/11/10 Python
Python利用正则表达式实现计算器算法思路解析
2018/04/25 Python
pycharm远程开发项目的实现步骤
2019/01/20 Python
python生成requirements.txt的两种方法
2019/09/18 Python
英国露营设备和户外服装购物网站:Simply Hike
2019/05/05 全球购物
德国帽子专家:Hutshopping
2019/11/03 全球购物
游戏商店:Eneba
2020/04/25 全球购物
杭州-飞时达软件有限公司.net笔面试
2012/04/28 面试题
简述安装Slackware Linux系统的过程
2012/05/08 面试题
年终考核实施方案
2014/05/26 职场文书
经典禁毒标语
2014/06/16 职场文书
机关驾驶员违规检讨书
2014/09/13 职场文书
2020年个人安全保证书参考模板
2020/01/08 职场文书
php远程请求CURL案例(爬虫、保存登录状态)
2021/04/01 PHP