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 相关文章推荐
深入聊聊Array的sort方法的使用技巧.详细点评protype.js中的sortBy方法
Apr 12 Javascript
拉动滚动条加载数据的jquery代码
May 03 Javascript
了解一点js的Eval函数
Jul 26 Javascript
javascript alert乱码的解决方法
Nov 05 Javascript
jquery+CSS3模拟Path2.0动画菜单效果代码
Aug 31 Javascript
JS实现回到页面顶部动画效果的简单实例
May 24 Javascript
jQuery 实现ajax传入参数含有特殊字符的方法总结
Oct 17 Javascript
Angularjs自定义指令实现分页插件(DEMO)
Sep 16 Javascript
React Native实现地址挑选器功能
Oct 24 Javascript
Vue.js自定义事件的表单输入组件方法
Mar 08 Javascript
如何更好的编写js async函数
May 13 Javascript
Vue使用axios引起的后台session不同操作
Aug 14 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
phpQuery让php处理html代码像jQuery一样方便
2015/01/06 PHP
PHP5.6新增加的可变函数参数用法分析
2017/08/25 PHP
JS日历 推荐
2006/12/03 Javascript
js中for in的用法示例解析
2013/12/25 Javascript
nodejs分页类代码分享
2014/06/17 NodeJs
jQuery validate 验证radio实例
2017/03/01 Javascript
分享一个精简的vue.js 图片lazyload插件实例
2017/03/13 Javascript
Vue.js鼠标悬浮更换图片功能
2017/05/17 Javascript
详解RequireJs官方使用教程
2017/10/31 Javascript
socket io与vue-cli的结合使用的示例代码
2018/11/01 Javascript
vue 父组件中调用子组件函数的方法
2019/06/06 Javascript
Layui实现带查询条件的分页
2019/07/27 Javascript
js get和post请求实现代码解析
2020/02/06 Javascript
javascript 数组精简技巧小结
2020/02/26 Javascript
js实现表格数据搜索
2020/08/09 Javascript
[01:17:47]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
举例详解Python中yield生成器的用法
2015/08/05 Python
python 对dataframe下面的值进行大规模赋值方法
2018/06/09 Python
flask框架中勾子函数的使用详解
2018/08/01 Python
pygame游戏之旅 添加游戏暂停功能
2018/11/21 Python
Django框架模型简单介绍与使用分析
2019/07/18 Python
PYTHON实现SIGN签名的过程解析
2019/10/28 Python
10个Python面试常问的问题(小结)
2019/11/20 Python
Python迭代器模块itertools使用原理解析
2019/12/11 Python
Django+boostrap 美化admin后台的操作
2020/03/11 Python
Python新手学习装饰器
2020/06/04 Python
使用css实现android系统的loading加载动画
2019/07/25 HTML / CSS
施华洛世奇水晶荷兰官方网站:SWAROVSKI荷兰
2017/05/12 全球购物
汇科协同Java笔试题
2012/03/31 面试题
医学类导师推荐信范文
2013/11/19 职场文书
三好学生评语大全
2014/12/29 职场文书
微信搭讪开场白
2015/05/28 职场文书
2015年环境监察工作总结
2015/07/23 职场文书
车辆管理制度范本
2015/08/05 职场文书
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
2021/06/18 MySQL
教你用Python+selenium搭建自动化测试环境
2021/06/18 Python