vue-resource pos提交t数据时碰到Django csrf
我的github(PS:希望star):https://github.com/thWinterSun/v-admin
最近在用Vue写前端代码,再用vue-resource向后台提交数据。项目后台是用python+Django开发的。下面我就复盘一下我出现问题的经过。
首先,想用vue进行数据交互只能引入vue-resource。
<script src="js/vue.js"></script>
<script src="js/vue-resource.js" ></script>
之后我使用vm.$http方法向后台发送数据,其实和jquery的AJAX方法差不多,需要定义发送的地址、请求类型和发送数据等。
this.$http({
url:'/data/',
data:JSON.stringify(Strdata),
method:'POST'
}).then(function(res){
alert(res.data);
});
由于POST请求需要修改发送date的Content-Type为application/json,所以要设置emulateJSON为true,就变成这样了
this.$http({
url:'/data/',
data:JSON.stringify(Strdata),
method:'POST',
emulateJSON:true
}).then(function(res){
alert(res.data);
});
正常来说这样就OK了,就可以拿到后台数据了。之后打开控制台,查看network,找到发出的data,看到HTTP状态码为302。

怎么会被重定向到了登录页面,难道是登录超时??

然后我看了看后台服务.....

不应该是登录的问题啊,后面有请求成功返回啊,于是我对比了一下成功的请求和失败请求的HTTP请求头,发现好像是少了一个叫X-CSRFToken的东西。这是什么东西呢,于是我就google了一下,得到如下答案:
Django 提供的 CSRF 防护机制
django 第一次响应来自某个客户端的请求时,会在服务器端随机生成一个 token,把这个 token 放在 cookie 里。然后每次 POST 请求都会带上这个 token,
这样就能避免被 CSRF 攻击。
- 在返回的 HTTP 响应的 cookie 里,django 会为你添加一个 csrftoken 字段,其值为一个自动生成的 token
- 在所有的 POST 表单时,必须包含一个 csrfmiddlewaretoken 字段 (只需要在模板里加一个 tag, django 就会自动帮你生成,见下面)
- 在处理 POST 请求之前,django 会验证这个请求的 cookie 里的 csrftoken 字段的值和提交的表单里的 csrfmiddlewaretoken 字段的值是否一样。如果一样,则表明这是一个合法的请求,否则,这个请求可能是来自于别人的 csrf 攻击,返回 403 Forbidden.
- 在所有 ajax POST 请求里,添加一个 X-CSRFTOKEN header,其值为 cookie 里的 csrftoken 的值。
也就是说我每次向后台发送POST请求的时候,Django为了防止跨站请求伪造,即csrf攻击,提供了CsrfViewMiddleware中间件来防御csrf攻击。这时我就知道为什么之前将请求方式改为GET后成功了。
之后就想办法在HTTP请求头中设置X-CSRFToken了,我查了很多资料,看到最多的一种方法是这样:
<meta id="token" name="token" value="{ csrf_token() }">
Vue.http.headers.common['X-CSRFToken'] = document.querySelector('#token').getAttribute('value');
但是我试过还是重定向到登录页,不知道为什么。之后想了想,实际就是获取cookie里面的csrftoken值,然后在赋值给HTTP请求头里面的X-CSRFToken就行了。
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
Vue.http.headers.common['X-CSRFToken'] = getCookie('csrftoken');
之后HTTP请求头上的X-CSRFToken就有值了,响应也就成功了。

vue-resource pos提交t数据时碰到Django csrf的更多相关文章
- pos提交提交数据时碰到Django csrf
我的github(PS:希望star):https://github.com/thWinterSun/v-admin 最近在用Vue写前端代码,再用vue-resource向后台提交数据.项目后台是用 ...
- .net 中异步SOCKET发送数据时碰到的内存问题
做CS的开发一直都是这样的方式: server端用 C++编写,采用IOCP机制处理大量客户端连接.数据接收发送的问题 client端用 C++ 或C# 写,没什么特殊要求. 最近工作时间上比较宽裕, ...
- vue再页面渲染json数据时没有显示
对象点属性不能获取数据. 原因: 在创建数据对象时我使用了k,v方式:tempMap['category '] = this.category[i].label 如果在创建数据时使用的k,v方式,那么 ...
- 11.VUE学习之提交表单时拿到input里的值
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- python2读取EXCEL表格内的数据时碰到的问题
一,今天在剥离自动化的测试数据时,发生了一个错误,错误显示读取不到某个单元格的数据. 因为我使用的是python2,正好那一个单元格出现的是中文汉字,再者通过查看报错日志,让我了解到错误的原因. di ...
- Spring boot 项目中put提交Date数据时出现type=Bad Request, status=400状态码
1.问题原因 经过测试发现,当客户端页面提交日期为空时会出现以下异常,如果提交日期不为空则不会出现上述问题.出现这种错误的原因是没有对代码中的Date型参数进行格式化,接收为null的日期类型参数时, ...
- debug - vue中通过ajax获取数据时,如何避免绑定的数据中出现property of undefined错误
因为获取服务器是异步的,所以 vue 先绑定数据. 如果 ??? 是通过 ajax 异步获取的,在获取之前,???是未定义的.此时在外面的标签上添加一个 v-if="???" 可以 ...
- jQuery解析AJAX返回的html数据时碰到的问题与解决
$.ajax({ type : "post", url : "<%=request.getContextPath()%>/ce/articledetail/m ...
- vue -resource 文件提交提示process,或者拦截处理
this.$http.post('url',fd||data,{emulateJSON:true}).then(fn(res){},fn(res){}) process成功案例 _self.$http ...
随机推荐
- win7开启telnet客户端
- EL表达式拼接字符串
EL表达式拼接字符串<c:set var="types" value="${','}${resMap['vo'].lineType }${','}" &g ...
- php 函数形参前面加上&
<?php function test(&$a){ $a=$a+100; } $b=1; echo $b;//输出1 test($b);//这里$b传递给函数的其实是$b的变量内容所处的 ...
- 查看表结构命令(mysql和oracle)
MySQL查看表结构SQL语句 = mysql查看表结构命令,如下: desc 表名; show columns from 表名; describe 表名; show create table 表名; ...
- linux+tomcat+jdk环境验证码无法显示
我的环境配置:RHEL6.5+tomcat6+jdk1.6 今天遇到一个奇怪的现象,我的tomcat启动起来之后,网站无法显示验证码,导致无法登陆.我的tomcat启动过程是这样的: 我有一个进程守护 ...
- 【Android Developers Training】 4. 启动另一个Activity
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 关闭chrome浏览器的developer tools
背景 Chrome使用过程中,很容易启动Chrome developer tools,一些误触如按到F12.CTRL+Shift+C等都会启动developer tools.对于不开发Web的人来说, ...
- c# ProxyServer 代理服务器 不是很稳定
/**C# Programming Tips & Techniquesby Charles Wright, Kris Jamsa Publisher: Osborne/McGraw-Hill ...
- 全面解释java中StringBuilder、StringBuffer、String类之间的关系
StringBuilder.StringBuffer.String类之间的关系 java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,在上一篇博文中我 ...
- v2013调试无法访问此网站 localhost 拒绝了我们的连接请求
问题描述: 别人给的服务器代码,在本地部署以后调试的,localhost:8080 可以访问,localhost:2524访问不了需要改什么配置吗 解决思路: 这 ...