Ajax請求如何設置csrf_token


0|11. 方式一


通過獲取隱藏的input標簽中的csrfmiddlewaretoken值,放置在data中發送。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
$.ajax({
     url: "/cookie_ajax/" ,
     type : "POST" ,
     data: {
         "username" : "yang" ,
         "password" : 123 ,
         / / 使用jQuery取出csrfmiddlewaretoken的值,拼接到data總
         "csrfmiddlewaretoken" : $( "[name=" csrfmiddlewaretoken "]" ).val()
     },
     success: function(data){
         console.log(data);
     }
})

0|12. 方式二


通過獲取返回的cookie中的字符串,放置在請求頭中發送。

注意: 需要引入一個jquery.cookie.js插件。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
$.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方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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請求統一設置。

?
1
2
3
4
5
6
7
8
9
10
11
12
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。

?
1
2
3
4
5
django.views.decorators.csrf import ensure_csrf_cookie
 
@ensure_csrf_cookie
def login(request):
     pass

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM