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 相关文章推荐
JavaScript中yield实用简洁实现方式
Jun 12 Javascript
处理及遍历XML文档DOM元素属性及方法整理
Aug 23 Javascript
Java中Timer的用法详解
Oct 21 Javascript
Web Uploader文件上传插件使用详解
May 10 Javascript
JS冒泡事件与事件捕获实例详解
Nov 25 Javascript
JavaScript生成指定范围的时间列表
Mar 19 Javascript
Vue.js实现的计算器功能完整示例
Jul 11 Javascript
Bootstrap-table自定义可编辑每页显示记录数
Sep 07 Javascript
详解在vue-test-utils中mock全局对象
Nov 07 Javascript
浅谈VueJS SSR 后端绘制内存泄漏的相关解决经验
Dec 20 Javascript
vue+element创建动态的form表单及动态生成表格的行和列
May 20 Javascript
JavaScript最完整的深浅拷贝实现方式详解
Feb 28 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
可以将word转成html的js代码
2010/04/11 Javascript
JQuery index()方法使用代码
2010/06/02 Javascript
javascript:文字不间断向左移动的实例代码
2013/08/08 Javascript
使用JavaScript修改浏览器URL地址栏的实现代码
2013/10/21 Javascript
javascript框架设计之框架分类及主要功能
2015/06/23 Javascript
浅谈javascript运算符——条件,逗号,赋值,()和void运算符
2016/07/15 Javascript
JS实现动画兼容性的transition和transform实例分析
2016/12/13 Javascript
Bootstrap导航中表单简单实现代码
2017/03/06 Javascript
Bootstrap响应式导航由768px变成992px的实现代码
2017/06/15 Javascript
vue用addRoutes实现动态路由的示例
2017/09/15 Javascript
JavaScript变量声明var,let.const及区别浅析
2018/04/23 Javascript
ES6 系列之 Generator 的自动执行的方法示例
2018/10/19 Javascript
vue表单数据交互提交演示教程
2019/11/13 Javascript
vue父子组件间引用之$parent、$children
2020/05/20 Javascript
python生成二维码的实例详解
2017/10/29 Python
详谈pandas中agg函数和apply函数的区别
2018/04/20 Python
Python占用的内存优化教程
2019/07/28 Python
pandas的排序和排名的具体使用
2019/07/31 Python
解析Python3中的Import
2019/10/13 Python
python中的RSA加密与解密实例解析
2019/11/18 Python
Python发送手机动态验证码代码实例
2020/02/28 Python
Python 分布式缓存之Reids数据类型操作详解
2020/06/24 Python
Python pathlib模块使用方法及实例解析
2020/10/05 Python
若干个Java基础面试题
2015/05/19 面试题
失业者真诚求职信范文
2013/12/25 职场文书
商业活动邀请函
2014/02/04 职场文书
中学生运动会入场词
2014/02/12 职场文书
青年志愿者活动方案
2014/08/17 职场文书
2014年祖国生日寄语
2014/09/19 职场文书
学校总务处领导班子民主生活会对照检查材料思想汇报
2014/09/27 职场文书
小学生安全教育广播稿
2014/10/20 职场文书
2016年11月份红领巾广播稿
2015/12/21 职场文书
2016年大学生暑期社会实践活动总结
2016/04/06 职场文书
Golang Gob编码(gob包的使用详解)
2021/05/07 Golang
Python 数据可视化之Seaborn详解
2021/11/02 Python
mysql 索引的数据结构为什么要采用B+树
2022/04/26 MySQL