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 设计模式 安全沙箱模式
Sep 24 Javascript
js表头排序实现方法
Jan 16 Javascript
Javascript监视变量变化的方法
Jun 09 Javascript
谈谈AngularJs中的隐藏和显示
Dec 09 Javascript
利用Node.JS实现邮件发送功能
Oct 21 Javascript
Easyui的组合框的取值与赋值
Oct 28 Javascript
简单实现JS计算器功能
Dec 21 Javascript
vue中使用vue-router切换页面时滚动条自动滚动到顶部的方法
Nov 28 Javascript
element上传组件循环引用及简单时间倒计时的实现
Oct 01 Javascript
原生JS实现图片懒加载之页面性能优化
Apr 26 Javascript
JS+HTML5本地存储Localstorage实现注册登录及验证功能示例
Feb 10 Javascript
在vue中使用console.log无效的解决
Aug 09 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
简单介绍下 PHP5 中引入的 MYSQLI的用途
2007/03/19 PHP
php通过strpos查找字符串出现位置的方法
2015/03/17 PHP
PHP实现的折半查询算法示例
2017/10/09 PHP
laravel 解决路由除了根目录其他都404的问题
2019/10/18 PHP
Jquery时间验证和转换工具小例子
2013/07/01 Javascript
node.js使用nodemailer发送邮件实例
2014/03/10 Javascript
JavaScript监听和禁用浏览器回车事件实例
2015/01/31 Javascript
web 屏蔽BackSpace键实例代码
2016/12/24 Javascript
12306 刷票脚本及稳固刷票脚本(防挂)
2017/01/04 Javascript
详解jQuery事件
2017/01/13 Javascript
javascript实现动态显示颜色块的报表效果
2017/04/10 Javascript
node使用UEditor富文本编辑器的方法实例
2017/07/11 Javascript
jQuery 函数实例分析【函数声明、函数表达式、匿名函数等】
2020/05/19 jQuery
javascript读取本地文件和目录方法详解
2020/08/06 Javascript
python通过ftplib登录到ftp服务器的方法
2015/05/08 Python
Django返回json数据用法示例
2016/09/18 Python
利用python3随机生成中文字符的实现方法
2017/11/24 Python
Python实现从log日志中提取ip的方法【正则提取】
2018/03/31 Python
Python找出微信上删除你好友的人脚本写法
2018/11/01 Python
解决python打不开文件(文件不存在)的问题
2019/02/18 Python
HTML的form表单和django的form表单
2019/07/25 Python
解决Atom安装Hydrogen无法运行python3的问题
2019/08/28 Python
dpn网络的pytorch实现方式
2020/01/14 Python
如何真正的了解python装饰器
2020/08/14 Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
2020/11/01 Python
python爬取抖音视频的实例分析
2021/01/19 Python
SteelSeries赛睿官网:游戏外设和配件的领先制造商(耳机、键盘、鼠标和鼠标垫)
2018/06/17 全球购物
Myprotein西班牙官网:欧洲第一大运动营养品牌
2020/02/24 全球购物
个人简历自荐信
2013/12/05 职场文书
清洁工岗位职责
2014/01/29 职场文书
英语教师求职信
2014/06/16 职场文书
2014年乡镇领导个人整改措施
2014/09/19 职场文书
学生抄作业检讨书(2篇)
2014/10/17 职场文书
教师学习群众路线心得体会
2014/11/04 职场文书
2016优秀护士先进个人事迹材料
2016/02/25 职场文书
CSS变量实现主题切换的方法
2021/06/23 HTML / CSS