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事件列表解说
Dec 22 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(jquery)
Nov 16 Javascript
jQuery实现DIV层淡入淡出拖动特效的方法
Feb 13 Javascript
基于jquery实现导航菜单高亮显示(两种方法)
Aug 23 Javascript
AngularJS 避繁就简的路由
Jul 01 Javascript
jQuery实现倒计时(倒计时年月日可自己输入)
Dec 02 Javascript
jQuery基于Ajax实现读取XML数据功能示例
May 31 jQuery
关于微信小程序登录的那些事
Jan 08 Javascript
JS温故而知新之变量提升和时间死区
Jan 27 Javascript
JS学习笔记之闭包小案例分析
May 29 Javascript
ng-alain的sf如何自定义部件的流程
Jun 12 Javascript
基于JQuery和DWR实现异步数据传递
Oct 16 jQuery
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下保存远程图片到本地的办法
2010/08/08 PHP
PHP+mysql+ajax轻量级聊天室实现方法详解
2016/10/17 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
2020/02/21 PHP
用javascript实现画板的代码
2007/09/05 Javascript
JavaScript 学习点滴记录
2009/04/24 Javascript
关于Ext中form移除textfield方法:hide(),setVisible(false),remove()
2010/12/02 Javascript
学习js在线html(富文本,所见即所得)编辑器
2012/12/18 Javascript
JavaScript中switch判断容易犯错的一个细节
2014/08/27 Javascript
DOM节点深度克隆函数cloneNode()用法实例
2015/01/12 Javascript
jquery uploadify如何取消已上传成功文件
2017/02/08 Javascript
详解vue父子模版嵌套案例
2017/03/04 Javascript
微信小程序调用PHP后台接口 解析纯html文本
2017/06/13 Javascript
Vue-Access-Control 前端用户权限控制解决方案
2017/12/01 Javascript
Vue的路由及路由钩子函数的实现
2019/07/02 Javascript
vue使用video.js进行视频播放功能
2019/07/18 Javascript
vue element 生成无线级左侧菜单的实现代码
2019/08/21 Javascript
JavaScript arguments.callee作用及替换方案详解
2020/09/02 Javascript
Vue实现简单购物车功能
2020/12/13 Vue.js
[01:03:03]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
python连接字符串的方法小结
2015/07/13 Python
在Python中移动目录结构的方法
2016/01/31 Python
python学习教程之Numpy和Pandas的使用
2017/09/11 Python
Python numpy 提取矩阵的某一行或某一列的实例
2018/04/03 Python
基于Python在MacOS上安装robotframework-ride
2018/12/28 Python
python实现在遍历列表时,直接对dict元素增加字段的方法
2019/01/15 Python
python动态视频下载器的实现方法
2019/09/16 Python
神经网络训练采用gpu设置的方式
2021/03/03 Python
如何使用css3实现一个类在线直播的队列动画的示例代码
2020/06/17 HTML / CSS
html5拖曳操作 HTML5实现网页元素的拖放操作
2013/01/02 HTML / CSS
iHerb香港:维生素、补充剂和天然保健品
2017/08/01 全球购物
大学老师推荐信
2014/02/25 职场文书
2014年辅导员工作总结
2014/11/18 职场文书
怎样写观后感
2015/06/19 职场文书
CSS3 Tab动画实例之背景切换动态效果
2021/08/23 HTML / CSS
Golang中channel的原理解读(推荐)
2021/10/16 Golang
Apache Hudi集成Spark SQL操作hide表
2022/03/31 Servers