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 ...
随机推荐
- IIS虚拟目录与UNC路径权限初探
最近在一个项目中涉及到了虚拟目录与UNC路径的问题,总结出来分享给大家. 问题描述 某客户定制化项目(官网),有一个图片上传的功能.客户的Web机器有10台,通过F5负载均衡分摊请求. 假设这10台机 ...
- OFFICE 文档转换为html在线预览
OFFICE 文档在线预览方案很多: 服务器先转换为PDF,再转换为SWF,最后通过网页加载Flash预览,比如flexpaper Office文档直接转换为SWF,通过网页加载Flash预览 微软的 ...
- kaggle
注册kaggle可真所谓费劲心思,先是邮箱验证不来,换了两三个浏览器都不成功,非常恼火,没有验证码,最后还是FQ加谷歌浏览器,哎,注册之旅还是非常坎坷德,但是好消息是注册成功了.接下来是机器学习语言, ...
- angular之$watch、$watchGroup、$watchCollection
1,原型:$watch: function(watchExp, listener, objectEquality, prettyPrintExpression){}: 2,参数:watchExp(必须 ...
- Apple官方文档译文GitHub框架源码注解
引导
- 【Android Developers Training】 108. 使用模拟定位进行测试
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- java 线程 理解 解析
1 线程的概述 进程:正在运行的程序,负责了这个程序的内存分配,代表了内存中的执行区域. 线程:就是在一个进程中负者一个执行路径. 多线程:就是在一个进程中多个执行路径同时执行. 假象: 电脑上的程序 ...
- java for循环
publicclass Test2 { staticboolean foo(char c) { System.out.print(c); returntrue; ...
- Unity3D文件读取
Resources: 是作为一个Unity3D的保留文件夹出现的,也就是如果你新建的文件夹的名字叫Resources,那么里面的内容在打包时都会被无条件的打到发布包中.它的特点简单总结一下就是: 只读 ...
- 动态绑定DropDownList
1.首先前台创建一个dropdownlist控件,并为这个控件起名id ,并且不要忘记runat=server这个属性,否则后台不能获取到该控件. 2.后台自定义方法绑定控件(本方法以三层架构的写法为 ...