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