Ajax请求如何设置csrf_token
1.方式一
通过获取隐藏的input标签中的csrfmiddlewaretoken值,放置在data中发送。
$.ajax({url:"/cookie_ajax/",type:"POST",data: {"username":"leo","password":123,//使用jQuery取出csrfmiddlewaretoken的值,拼接到data总"csrfmiddlewaretoken": $("[name="csrfmiddlewaretoken"]").val()},success: function(data){console.log(data);}})
2.方式二
通过获取返回的cookie中的字符串,放置在请求头中发送。
注意: 需要引入一个jquery.cookie.js插件。
$.ajax({url:"/cookie_ajax/",type:"POST",//从Cookie取csrftoken, 并设置到请求头中headers: {"X-CSRFToken": $.cookie("csrftoken")},data: {"username":"leo","password":123},success: function(data){console.log(data)}})
或者用自己写一个getCookie方法:
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]);//Does this cookie string begin with the name we want?if(cookie.substring(0, name.length+1)===(name+"=")){cookieValue=decodeURIComponent(cookie.substring(name.length+1));break;}}}returncookieValue;}var csrftoken=getCookie("csrftoken");
每一次都这么写太麻烦了,可以使用$.ajaxSetup()方法为ajax请求统一设置。
function csrfSafeMethod(method){//these HTTP methods donotrequire CSRF protectionreturn(/^(GET|HEAD|OPTIONS|TRACE)$/.test(method);}$.ajaxSetup({beforeSend: function(xhr, settings){if(!csrfSafeMethod(settings.type) && !this.crossDomain){xhr.setRequestHeader("X-CSRFToken", csrftoken);}}})
注意:
如果使用从cookie中取csrftoken的方式,需要确保cookie存在csrftoken值。
如果你的视图渲染的HTML文件中没有包含{% csrf_token %}, Django可能不会设置CSRFtoken的cookie。
这个时候需要使用ensure_csrf_cookie()装饰器强制设置Cookie。
django.views.decorators.csrfimportensure_csrf_cookie@ensure_csrf_cookiedeflogin(request):pass

浙公网安备 33010602011771号