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 相关文章推荐
跨浏览器的事件对象介绍
Jun 27 Javascript
jQuery实现单行文字间歇向上滚动源代码
Jun 02 Javascript
JavaScript jQuery 中定义数组与操作及jquery数组操作
Dec 18 Javascript
属于你的jQuery提示框(Tip)插件
Jan 20 Javascript
JavaScript数据绑定实现一个简单的 MVVM 库
Apr 08 Javascript
解析javascript图片懒加载与预加载的分析总结
Oct 27 Javascript
ES6通过babel转码使用webpack使用import关键字
Dec 13 Javascript
原生js封装自定义滚动条
Mar 24 Javascript
解决html input验证只能输入数字,不能输入其他的问题
Jul 21 Javascript
JavaScript代码执行的先后顺序问题
Oct 29 Javascript
jQuery 实现倒计时天,时,分,秒功能
Jul 31 jQuery
迅速了解一下ES10中Object.fromEntries的用法使用
Mar 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
索尼SONY ICF-SW7600GR电路分析与改良
2021/03/02 无线电
PHP创建桌面快捷方式的实例代码
2014/02/17 PHP
Codeigniter框架实现获取分页数据和总条数的方法
2014/12/05 PHP
JQuery.ajax传递中文参数的解决方法 推荐
2011/03/28 Javascript
node.js中的fs.truncate方法使用说明
2014/12/15 Javascript
动态的9*9乘法表效果的实现代码
2016/05/16 Javascript
JS出现失效的情况总结
2017/01/20 Javascript
vue实现添加标签demo示例代码
2017/01/21 Javascript
jQuery实现的事件绑定功能基本示例
2017/10/11 jQuery
Angular实现下拉框模糊查询功能示例
2018/01/03 Javascript
angular 实现的输入框数字千分位及保留几位小数点功能示例
2018/06/19 Javascript
浅谈vue项目4rs vue-router上线后history模式遇到的坑
2018/09/27 Javascript
Vue实现购物车的全选、单选、显示商品价格代码实例
2019/05/06 Javascript
浅谈redux, koa, express 中间件实现对比解析
2019/05/23 Javascript
关于layui的动态图标不显示的解决方法
2019/09/04 Javascript
p5.js临摹动态图形的方法
2019/10/23 Javascript
Vue 一键清空表单的实现方法
2020/02/07 Javascript
利用H5api实现时钟的绘制(javascript)
2020/09/13 Javascript
centos系统升级python 2.7.3
2014/07/03 Python
python采集博客中上传的QQ截图文件
2014/07/18 Python
操作Windows注册表的简单的Python程序制作教程
2015/04/07 Python
python删除特定文件的方法
2015/07/30 Python
Python获取linux主机ip的简单实现方法
2016/04/18 Python
Python单体模式的几种常见实现方法详解
2017/07/28 Python
用Python将Excel数据导入到SQL Server的例子
2019/08/24 Python
Python爬虫之Spider类用法简单介绍
2020/08/04 Python
python语音识别指南终极版(有这一篇足矣)
2020/09/09 Python
Django如何重置migration的几种情景
2021/02/24 Python
eBay瑞士购物网站:eBay.ch
2018/12/24 全球购物
关于爱国的演讲稿
2014/05/07 职场文书
活动总结报告格式
2014/05/09 职场文书
禁止酒驾标语
2014/06/25 职场文书
促销活动总结怎么写
2014/06/25 职场文书
2014年电厂工作总结
2014/12/04 职场文书
永远是春天观后感
2015/06/12 职场文书
深入理解margin塌陷和margin合并的解决方案
2021/06/26 HTML / CSS