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 相关文章推荐
jQuery帮助之筛选查找 children([expr])
Jan 31 Javascript
关于JavaScript中的关联数组分析
Apr 09 Javascript
用Javascript来生成ftp脚本的小例子
Jul 03 Javascript
js中opener与parent的区别详细解析
Jan 14 Javascript
数据结构中的各种排序方法小结(JS实现)
Jul 23 Javascript
JavaScript提高网站性能优化的建议(二)
Jul 24 Javascript
Javascript 使用ajax与C#获取文件大小实例详解
Jan 13 Javascript
jQuery实现鼠标滑过预览图片大图效果的方法
Apr 26 jQuery
不得不知的ES6小技巧
Jul 28 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
Jan 20 Javascript
react 原生实现头像滚动播放的示例
Apr 21 Javascript
Vue ECharts实现机舱座位选择展示功能
May 15 Vue.js
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
typecho插件编写教程(三):保存配置
2015/05/28 PHP
一个完整的PHP类包含的七种语法说明
2015/06/04 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
一步一步教你写一个jQuery的插件教程(Plugin)
2009/09/03 Javascript
javascript contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2010/02/04 Javascript
JavaScript 错误处理与调试经验总结
2010/08/10 Javascript
jquery用get实现ajax在ie里面刷新不进入后台解决方法
2013/08/12 Javascript
关于js中for in的缺陷浅析
2013/12/02 Javascript
BootStrap响应式导航条实例介绍
2016/05/06 Javascript
AngularJS页面传参的5种方式
2017/04/01 Javascript
微信小程序中button组件的边框设置的实例详解
2017/09/27 Javascript
jquery根据name取得select选中的值实例(超简单)
2018/01/25 jQuery
jQuery实现鼠标响应式淘宝动画效果示例
2018/02/13 jQuery
打通前后端构建一个Vue+Express的开发环境
2018/07/17 Javascript
JavaScript模板引擎原理与用法详解
2018/12/24 Javascript
实例介绍JavaScript中多种组合继承
2019/01/20 Javascript
使用Vue.observable()进行状态管理的实例代码详解
2019/05/26 Javascript
简单文件操作python 修改文件指定行的方法
2013/05/15 Python
Python 多线程抓取图片效率对比
2016/02/27 Python
Python使用迭代器打印螺旋矩阵的思路及代码示例
2016/07/02 Python
利用Python画ROC曲线和AUC值计算
2016/09/19 Python
Python 多线程的实例详解
2017/09/07 Python
自定义django admin model表单提交的例子
2019/08/23 Python
python 实现生成均匀分布的点
2019/12/05 Python
Python tornado上传文件的功能
2020/03/26 Python
利用pandas向一个csv文件追加写入数据的实现示例
2020/04/23 Python
HTML5之HTML元素扩展(上)—新增加的元素及使用概述
2013/01/31 HTML / CSS
详解HTML5中的拖放事件(Drag 和 drop)
2016/11/14 HTML / CSS
美国最大的户外装备和服装购物网站:Backcountry
2019/10/15 全球购物
医学毕业生自荐信
2013/10/11 职场文书
优秀学生自我鉴定范例
2013/12/18 职场文书
外贸会计专业自荐信
2014/06/22 职场文书
2015年评职称工作总结范文
2015/04/20 职场文书
canvas绘制折线路径动画实现
2021/05/12 Javascript
Go 语言结构实例分析
2021/07/04 Golang
python数字类型和占位符详情
2022/03/13 Python