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 replace()正则替换实现代码
Feb 26 Javascript
js给onclick事件赋值,动态传参数实例解说
Mar 28 Javascript
给js文件传参数(详解)
Jul 13 Javascript
jQuery实现的一个自定义Placeholder属性插件
Aug 11 Javascript
JS解析XML文件和XML字符串详解
Apr 17 Javascript
JQuery中节点遍历方法实例
May 18 Javascript
JQuery zClip插件实现复制页面内容到剪贴板
Nov 02 Javascript
纯JavaScript代码实现文本比较工具
Feb 17 Javascript
easyui tree带checkbox实现单选的简单实例
Nov 07 Javascript
jquery 输入框查找关键字并提亮颜色的实例代码
Jan 23 jQuery
Node.js应用设置安全的沙箱环境
Apr 23 Javascript
区分vue-router的hash和history模式
Oct 03 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可能遇到的问题“无法载入mysql扩展” 的解决方法
2007/04/16 PHP
php Calender(日历)代码分享
2014/01/03 PHP
[原创]PHP正则匹配中英文、数字及下划线的方法【用户名验证】
2017/08/01 PHP
PHP一致性hash分布式算法封装类定义与用法示例
2018/08/04 PHP
web 页面分页打印的实现
2009/06/22 Javascript
2种jQuery 实现刮刮卡效果
2015/02/01 Javascript
jQuery菜单插件superfish使用指南
2015/04/21 Javascript
浅析Node.js中的内存泄漏问题
2015/06/23 Javascript
JS实现的鼠标跟随代码(卡通手型点击效果)
2015/10/26 Javascript
js实现跨域的4种实用方法原理分析
2015/10/29 Javascript
Chrome不支持showModalDialog模态对话框和无法返回returnValue问题的解决方法
2016/10/30 Javascript
基于vuejs实现一个todolist项目
2017/04/11 Javascript
基于复选框demo(分享)
2017/09/27 Javascript
详解VUE2.X过滤器的使用方法
2018/01/11 Javascript
小程序实现选择题选择效果
2018/11/04 Javascript
在 Vue.js中优雅地使用全局事件的方法
2019/02/01 Javascript
node使用mysql获取数据库数据中文乱码问题的解决
2019/12/02 Javascript
Python中MYSQLdb出现乱码的解决方法
2014/10/11 Python
python实现判断一个字符串是否是合法IP地址的示例
2018/06/04 Python
Python 3.x基于Xml数据的Http请求方法
2018/12/28 Python
pyqt远程批量执行Linux命令程序的方法
2019/02/14 Python
Django使用中间键实现csrf认证详解
2019/07/22 Python
Python中list循环遍历删除数据的正确方法
2019/09/02 Python
python中的逆序遍历实例
2019/12/25 Python
Python pip install如何修改默认下载路径
2020/04/29 Python
HTML5页面音视频在微信和app下自动播放的实现方法
2016/10/20 HTML / CSS
如何避免常见的6种HTML5错误用法
2017/11/06 HTML / CSS
英国家喻户晓的高街品牌:River Island
2017/11/28 全球购物
食品安全检查制度
2014/02/03 职场文书
现场施工员岗位职责
2014/03/10 职场文书
成龙洗发水广告词
2014/03/14 职场文书
爱国主义演讲稿
2014/05/07 职场文书
妇联主席先进事迹
2014/05/18 职场文书
2014年管理工作总结
2014/11/22 职场文书
Redis Cluster 字段模糊匹配及删除
2021/05/27 Redis
MYSQL 运算符总结
2021/11/11 MySQL