背景介绍
- 在网站开发过程中可能会需要用到ajax来达到不刷新网页就更新局部html。
django的模版便签里自带里一个{% csrf_token %} 来防止跨站请求攻击,在CSRF保护激活的情况下, Django 会检查所有 POST 请求中的 CSRF token。
当你提交表单时,你可以使用{% csrf_token %}模板标签来发送带有 token 的表单。
Any way,像 POST 请求一样对 AJAX 请求传递CDRF token 可能会有一点点不方便。
当发起AJAX请求的时候,如果我们没带上请求头,我们会直接拒绝访问,为了解决一个问题,查文档后发现了可行的解决方案。
解决方案
-
其实Django允许你在你的 AJAX 请求中设置一个定制的 X-CSRFToken token 头(header)。这允许你安装一个 jQuery 或者任意 JavaScript 库来自动设置X-CSRFToken头在每一次请求中。
为了在所有的请求中加入 token ,你需要:- 从 csrftoken cookie 中检索 CSRF token,它在CSRF保护激活的情况下会被设置
- 使用 X-CSRFToken头发送 token 到 AJAX 中
你也可以自己去文档里找到更多关于 CSRF 保护 和 AJAX 的信息:http://docs.djangoproject.com/en/1.11/ref/csrf/#ajax
-
为了实现上述需求我们需要编写代码如下类似代码
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/
jquery.min.js"></script>
<script src=" http://cdn.jsdelivr.net/jquery.cookie/3.2.1/jquery.
cookie.min.js "></script>// 获取一个cookie相关的包
<script>
var csrftoken = $.cookie('csrftoken'); // 获取cookie里的token 赋值给这个变量
function csrfSafeMethod(method) {
// 这里的这些方法不需要csrf保护
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken); //设置我们的主人公,请求头
}
}
});
$(document).ready(function(){
{% block domready %} // 我们把这段代码写在网站的base模版下,哪有就可以让所以模版自由使用带请求头的ajax请求
{% endblock %}
});
</script>
- 把这段代码写到网站及base模版里,接下来就可以自由的使用带请求头ajax请求啦
网友评论