vue-resource post数据时碰到Django csrf问题的解决


Posted in Javascript onMarch 13, 2020

公司最近用vue写前端,用vue-resource遇到的一些问题,现在记录下来。

vue-resource post数据

this.$http.post('/someUrl',data, [options]).then(function(response){
  // 响应成功回调
}, function(response){
  // 响应错误回调
});

vue-resource 向后端请求api, 公司的后台是用Django 开发的,Django为了防止跨站请求伪造,即csrf攻击,提供了CsrfViewMiddleware中间件来防御csrf攻击。

我们在html 页面里加入{% csrf %}来让django渲染出一个csrf的标签

(如果是form 提交表单的话,我们要把这个标签加在form标签内,如果是用xhr提交的话写在html页面里就可以了)

不写在form 表单内,但是实现效果是一样的,我们都需要在post 的表单中提供csrftoken我们在vue里要传送的的data 里要加上csrf的key

data{
  csrfmiddlewaretoken: '{{ csrf_token }}' 
}

这样django解析表单时会解析到csrf_token, 我们post的数据就不会遇到403 forbidden了。

其实这样是投机取巧的行为,这样虽然django 也能识别,但是遇到复杂的数据时就不行了,比如数组,vue-resource post 数组的时候, 因为我之前在post的option里加了一个option {emulateJSON: true},这样vue-resource 在post数据时,会把data 转换成 application/x-www-form-urlencoded表单格式,但是这样的话,post 的数组就会被解析成arrry[0]item 这样的话,后端是不识别的,会报错。

解决方式查到是把csrftoken 放在报头里,data 传数据,具体解决方式是加一条

Vue.http.headers.common['X-CSRFToken'] = $("input[name='csrfmiddlewaretoken']").val()

其中$("input[name='csrfmiddlewaretoken']").val() 是取django 的{% csrf %}在模板解析后生成的input里的csrftoken。

其中报头的话django 在后台解析的时候会自动加上HTTP_的前缀,所以说我们的报头是 X-CSRFToken就可以了。

补充知识:VUE向django发送post返回403:CSRF Failed: CSRF token missing or incorrect

问题描述

前端是VUE,后端是django。

VUE用axios向后端发送POST代码如下:

let params = new URLSearchParams()
  params.append('orderID', orderId)
  params.append('dishID', dishId)
  axios.post(loginUrL, params})
   .then(response => {
    console.log(response)
    cb()
   })
   .catch(error => {
    console.log(error)
    errorCb()
   })

但是服务器返回403错误,点开一看,CSRF Failed: CSRF token missing or incorrect

原因

根据这个链接https://stackoverflow.com/a/26639895

这是一个django的跨域访问问题。

django,会对合法的跨域访问做这样的检验,cookies里面存储的'csrftoken',和post的header里面的字段”X-CSRFToken'作比较,只有两者匹配,才能通过跨域检验。否则会返回这个错误:CSRF Failed: CSRF token missing or incorrect

解决方法

由上面的分析可以得出,只要在POST请求的header添加一个字段'X-CSRFToken',这个字段和cookie里面的‘csrftoken'一样就好了。

在post请求添加一个header,内容如下:

{headers: {'X-CSRFToken': this.getCookie('csrftoken')}

其中,getCookies是这样一个函数,用于将cookies里面的内容按名字取出:

getCookie (name) {
   var value = '; ' + document.cookie
   var parts = value.split('; ' + name + '=')
   if (parts.length === 2) return parts.pop().split(';').shift()
  },

最终的POST请求如下:

params.append('orderID', orderId)
  params.append('dishID', dishId)
  axios.post(loginUrL, params, {headers: {'X-CSRFToken': this.getCookie('csrftoken')}})
   .then(response => {
    console.log(response)
    cb()
   })
   .catch(error => {
    console.log(error)
    errorCb()
   })

以上这篇vue-resource post数据时碰到Django csrf问题的解决就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
url参数中有+、空格、=、%、&、#等特殊符号的问题解决
May 15 Javascript
JavaScript函数模式详解
Nov 07 Javascript
js实现模拟银行卡账号输入显示效果
Nov 18 Javascript
jQuery实现的调整表格行tr上下顺序
Jan 10 Javascript
Angular2 PrimeNG分页模块学习
Jan 14 Javascript
jQuery异步提交表单实例
May 30 jQuery
Bootstrap Table快速完美搭建后台管理系统
Sep 20 Javascript
动态内存分配导致影响Javascript性能的问题
Dec 18 Javascript
vue+web端仿微信网页版聊天室功能
Apr 30 Javascript
了解JavaScript中let语句
May 30 Javascript
基于node+vue实现简单的WebSocket聊天功能
Feb 01 Javascript
绘制微信小程序验证码功能的实例代码
Jan 05 Javascript
js函数和this用法实例分析
Mar 13 #Javascript
js对象简介与基本用法示例
Mar 13 #Javascript
JS自定义滚动条效果
Mar 13 #Javascript
js Math数学简单使用操作示例
Mar 13 #Javascript
Vue实现仿iPhone悬浮球的示例代码
Mar 13 #Javascript
AI小程序之语音听写来了,十分钟掌握百度大脑语音听写全攻略
Mar 13 #Javascript
vue动态渲染svg、添加点击事件的实现
Mar 13 #Javascript
You might like
BBS(php & mysql)完整版(六)
2006/10/09 PHP
生成静态页面的PHP类
2006/11/25 PHP
JavaScript 组件之旅(二)编码实现和算法
2009/10/28 Javascript
JavaScript中的isXX系列是否继续使用的分析
2011/04/16 Javascript
10款非常有用的 Ajax 插件分享
2012/03/14 Javascript
了解了这些才能开始发挥jQuery的威力
2013/10/10 Javascript
解决window.opener=null;window.close(),只支持IE6不支持IE7,IE8的问题
2014/01/14 Javascript
JS组件Bootstrap实现弹出框效果代码
2016/04/26 Javascript
JavaScript结合Bootstrap仿微信后台多图文界面管理
2016/07/22 Javascript
概述BootStrap中role="form"及role作用角色
2016/12/08 Javascript
使用Javascript判断浏览器终端设备(PC、IOS(iphone)、Android)
2017/01/04 Javascript
node.JS md5加密中文与php结果不一致的解决方法
2017/05/05 Javascript
JavaScript+HTML5实现的日期比较功能示例
2017/07/12 Javascript
Bootstrap Table 在指定列中添加下拉框控件并获取所选值
2017/07/31 Javascript
vue基于mint-ui的城市选择3级联动的示例
2017/10/25 Javascript
详解如何在angular2中获取节点
2017/11/23 Javascript
使用javascript函数编写简单银行取钱存钱流程
2018/05/26 Javascript
angular2/ionic2 实现搜索结果中的搜索关键字高亮的示例
2018/08/17 Javascript
Nodejs异步流程框架async的方法
2019/06/07 NodeJs
Webpack按需加载打包chunk命名的方法
2019/09/22 Javascript
Vue中强制组件重新渲染的正确方法
2021/01/03 Vue.js
[01:06:54]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第二场 2月28日
2021/03/11 DOTA
对python读取zip压缩文件里面的csv数据实例详解
2019/02/08 Python
Python利用字典破解WIFI密码的方法
2019/02/27 Python
python中metaclass原理与用法详解
2019/06/25 Python
对Pytorch中nn.ModuleList 和 nn.Sequential详解
2019/08/18 Python
Python 使用 prettytable 库打印表格美化输出功能
2019/12/26 Python
pytorch 图像中的数据预处理和批标准化实例
2020/01/15 Python
Python使用enumerate获取迭代元素下标
2020/02/03 Python
简单了解pytest测试框架setup和tearDown
2020/04/14 Python
python 使用cycle构造无限循环迭代器
2020/12/02 Python
HTML5 解析规则分析
2009/08/14 HTML / CSS
Paradox London官方网站:英国新娘鞋婚礼鞋品牌
2019/08/29 全球购物
材料化学应届生求职信
2013/10/09 职场文书
纪念九一八事变演讲稿:勿忘国耻
2014/09/14 职场文书
市场督导岗位职责
2015/04/10 职场文书