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 相关文章推荐
高亮显示web页表格行的javascript代码
Nov 19 Javascript
鼠标滑上去后图片放大浮出效果的js代码
May 28 Javascript
jQuery渐变发光导航菜单的实例代码
Mar 27 Javascript
js复制网页内容并兼容各主流浏览器的代码
Dec 17 Javascript
Jquery 实现checkbox全选方法
Jan 28 Javascript
JS触发服务器控件的单击事件(详解)
Aug 06 Javascript
js Dom实现换肤效果
Oct 21 Javascript
vue脚手架搭建项目的兼容性配置详解
Jul 17 Javascript
vue实现压缩图片预览并上传功能(promise封装)
Jan 10 Javascript
vue自定义指令用法经典实例小结
Mar 16 Javascript
Egg Vue SSR 服务端渲染数据请求与asyncData
Nov 24 Javascript
利用PHP实现递归删除链表元素的方法示例
Oct 23 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 cURL和Rolling cURL并发方式比较
2013/10/30 PHP
举例讲解PHP面对对象编程的多态
2015/08/12 PHP
PHPStrom中实用的功能和快捷键大全
2015/09/23 PHP
php实现scws中文分词搜索的方法
2015/12/25 PHP
PHP基于curl后台远程登录正方教务系统的方法
2016/10/14 PHP
thinkPHP5使用Rabc实现权限管理
2019/08/28 PHP
零基础php编程好学吗
2019/10/11 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
javascript 获取网页参数系统
2008/07/19 Javascript
表单元素的submit()方法和onsubmit事件应用概述
2013/02/01 Javascript
模拟一个类似百度google的模糊搜索下拉列表
2014/04/15 Javascript
javascript 动态创建表格
2015/01/08 Javascript
jQuery中append()方法用法实例
2015/01/08 Javascript
浅谈类似于(function(){}).call()的js语句
2015/03/30 Javascript
JavaScript获取网页中第一个链接ID的方法
2015/04/03 Javascript
jQuery超简单选项卡完整实例
2015/09/26 Javascript
JS实现的图片预览插件与用法示例【不上传图片】
2016/11/25 Javascript
关于Ajax的原理以及代码封装详解
2017/09/08 Javascript
详解在vue-cli中使用路由
2017/09/25 Javascript
echarts 使用formatter 修改鼠标悬浮事件信息操作
2020/07/20 Javascript
用python写一个windows下的定时关机脚本(推荐)
2017/03/21 Python
numpy中索引和切片详解
2017/12/15 Python
python selenium 查找隐藏元素 自动播放视频功能
2019/07/24 Python
Python 使用list和tuple+条件判断详解
2019/07/30 Python
Python帮你识破双11的套路
2019/11/11 Python
Python socket实现的文件下载器功能示例
2019/11/15 Python
ansible-playbook实现自动部署KVM及安装python3的详细教程
2020/05/11 Python
Python 在局部变量域中执行代码
2020/08/07 Python
python3实现名片管理系统(控制台版)
2020/11/29 Python
HTML5中使用postMessage实现Ajax跨域请求的方法
2016/04/19 HTML / CSS
html5 自定义播放器核心代码
2013/12/20 HTML / CSS
Infababy英国:婴儿推车、Travel System婴儿车和婴儿汽车座椅销售
2018/05/23 全球购物
英国玛莎百货美国官网:Marks & Spencer美国
2018/11/06 全球购物
办公室内勤岗位职责范本
2013/12/09 职场文书
优秀教师推荐材料
2014/12/16 职场文书
深入理解redis中multi与pipeline
2021/06/02 Redis