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制作迷你背词汇工具
Jul 27 Javascript
Ext 今日学习总结
Sep 19 Javascript
javascript 运算数的求值顺序
Aug 23 Javascript
jquery ajax修改全局变量示例代码
Nov 08 Javascript
浅析Node在构建超媒体API中的作用
Jul 30 Javascript
在网页中插入百度地图的步骤详解
Dec 02 Javascript
微信小程序 实战程序简易新闻的制作
Jan 09 Javascript
javascript 开发之网页兼容各种浏览器
Sep 28 Javascript
AngularJS中table表格基本操作示例
Oct 10 Javascript
react中fetch之cors跨域请求的实现方法
Mar 14 Javascript
webpack 样式加载的实现原理
Jun 12 Javascript
JavaScript实现拖拽效果
Mar 16 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文件操作实例代码
2012/05/10 PHP
php学习笔记之面向对象
2014/11/08 PHP
php版微信公众平台回复中文出现乱码问题的解决方法
2016/09/22 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
PHP实现微信商户支付企业付款到零钱功能
2018/09/30 PHP
javascript XML数据显示为HTML一例
2008/12/23 Javascript
浅谈Javascript事件处理程序的几种方式
2012/06/27 Javascript
js 动态为textbox添加下拉框数据源的方法
2014/04/24 Javascript
利用javascript实现全部删或清空所选的操作
2014/05/27 Javascript
js动态创建标签示例代码
2014/06/09 Javascript
Javascript获取表单名称(name)的方法
2015/04/02 Javascript
Three.js快速入门教程
2016/09/09 Javascript
浅谈Vue 初始化性能优化
2017/08/31 Javascript
vue jsx 使用指南及vue.js 使用jsx语法的方法
2017/11/11 Javascript
vue实现键盘输入支付密码功能
2018/08/18 Javascript
最简单的vue消息提示全局组件的方法
2019/06/16 Javascript
vue通过video.js解决m3u8视频播放格式的方法
2019/07/30 Javascript
vue 使用v-for进行循环的实例代码详解
2020/02/19 Javascript
[01:09]模型精美,特效酷炫!TI9不朽宝藏Ⅰ鉴赏
2019/05/10 DOTA
Python连接mssql数据库编码问题解决方法
2015/01/01 Python
python杀死一个线程的方法
2015/09/06 Python
python Django批量导入数据
2016/03/25 Python
详解Python安装scrapy的正确姿势
2018/06/26 Python
python将字符串以utf-8格式保存在txt文件中的方法
2018/10/30 Python
python3 http提交json参数并获取返回值的方法
2018/12/19 Python
Python实现批量执行同目录下的py文件方法
2019/01/11 Python
解决Python3 抓取微信账单信息问题
2019/07/19 Python
解决Python图形界面中设置尺寸的问题
2020/03/05 Python
美国玛丽莎收藏奢华时尚商店:Marissa Collections
2016/11/21 全球购物
运动会广播稿30字
2014/01/21 职场文书
领导党性分析材料
2014/02/15 职场文书
信息与工商管理职业规划范文:为梦想而搏击
2014/09/11 职场文书
毕业设计指导教师评语
2014/12/30 职场文书
服务员岗位职责范本
2015/04/09 职场文书
2016暑期师德培训心得体会
2016/01/09 职场文书
Oracle 多表查询基本语法实例
2022/04/18 Oracle