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 相关文章推荐
类似框架的js代码
Nov 09 Javascript
JS 自动安装exe程序
Nov 30 Javascript
动态加载外部javascript文件的函数代码分享
Jul 28 Javascript
jquery tab插件精简版分享
Sep 10 Javascript
JavaScript 基础篇之对象、数组使用介绍(三)
Apr 07 Javascript
JavaScript 命名空间 使用介绍
Aug 29 Javascript
jQuery获得页面元素的绝对/相对位置即绝对X,Y坐标
Mar 06 Javascript
js换图片效果可进行定时操作
Jun 09 Javascript
jQuery实现简单二级下拉菜单
Apr 12 Javascript
基于Jquery easyui 选中特定的tab
Nov 17 Javascript
vue 动态绑定背景图片的方法
Aug 10 Javascript
Vue中 v-if 和v-else-if页面加载出现闪现的问题及解决方法
Oct 12 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
在PHP中养成7个面向对象的好习惯
2010/01/28 PHP
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
2012/06/13 PHP
laravel 5 实现模板主题功能
2015/03/02 PHP
php使用正则验证中文
2016/04/06 PHP
PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
2016/09/11 PHP
php结合ajax实现手机发红包的案例
2016/10/13 PHP
php7 安装yar 生成docker镜像
2017/05/09 PHP
php实现单笔转账到支付宝功能
2018/10/09 PHP
jquery创建div 实现代码
2009/04/27 Javascript
js弹出的对话窗口永远保持居中显示
2012/12/15 Javascript
JavaScript var声明变量背后的原理示例解析
2013/10/12 Javascript
node.js中的fs.chownSync方法使用说明
2014/12/16 Javascript
js中hash和ico的关联分析
2015/02/05 Javascript
JavaScript返回当前会话cookie全部键值对照的方法
2015/04/03 Javascript
JavaScript实现获得所有兄弟节点的方法
2015/07/23 Javascript
利用iscroll4实现轮播图效果实例代码
2017/01/11 Javascript
JavaScript在控件上添加倒计时功能的实现代码
2017/07/04 Javascript
Koa 使用小技巧(小结)
2018/10/22 Javascript
Angular6 发送手机验证码按钮倒计时效果实现方法
2019/01/08 Javascript
小程序如何自主实现拦截器的示例代码
2019/11/04 Javascript
jQuery实现王者荣耀手风琴效果
2020/01/17 jQuery
python模拟enum枚举类型的方法小结
2015/04/30 Python
python读取excel表格生成erlang数据
2017/08/26 Python
Python 中的参数传递、返回值、浅拷贝、深拷贝
2019/06/25 Python
python3注册全局热键的实现
2020/03/22 Python
解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题
2020/05/20 Python
沃尔玛加拿大:Walmart.ca
2020/03/02 全球购物
新闻网站实习自我鉴定
2013/09/25 职场文书
自主招生自荐信指南
2014/02/04 职场文书
酒店七夕情人节活动策划方案
2014/08/24 职场文书
2014幼儿园教师师德师风演讲稿
2014/09/10 职场文书
群众路线四风自我剖析材料
2014/10/08 职场文书
2015感人爱情寄语
2015/02/26 职场文书
高一军训口号
2015/12/25 职场文书
实习员工转正的评语汇总,以备不时之需
2019/12/17 职场文书
Java多线程并发FutureTask使用详解
2022/06/28 Java/Android