1. 方式一
通過獲取隱藏的input標簽中的csrfmiddlewaretoken值,放置在data中發送。
$.ajax({
url: "/cookie_ajax/",
type: "POST",
data: {
"username": "yang",
"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": "yang",
"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;
}
}
}
return cookieValue;
}
var csrftoken = getCookie("csrftoken");
每一次都這么寫太麻煩了,可以使用$.ajaxSetup()方法為ajax請求統一設置。
function csrfSafeMethod(method){
// these HTTP methods do not require CSRF protection
return (/^(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.csrf import ensure_csrf_cookie
@ensure_csrf_cookie
def login(request):
pass
