Ajax请求如何设置csrf_token

 

1.方式一


通过获取隐藏的input标签中的csrfmiddlewaretoken值,放置在data中发送。

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

2.方式二

 

通过获取返回的cookie中的字符串,放置在请求头中发送。

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

  1. $.ajax({
  2.     url: "/cookie_ajax/",
  3.     type"POST",
  4.     // 从Cookie取csrftoken, 并设置到请求头中
  5.     headers: {"X-CSRFToken": $.cookie("csrftoken")},
  6.     data: {
  7.         "username""leo",
  8.         "password"123
  9.     },
  10.     success: function(data){
  11.         console.log(data)
  12.     }
  13. })
 
或者用自己写一个getCookie方法:
 
  1. function getCookie(name){
  2.     var cookieValue = null;
  3.     if (document.cookie && document.cookie !== ""){
  4.         var cookies = document.cookie.split(";");
  5.         for (var i = 0; i < cookies.length; i++){
  6.             var cookie = jQuery.trim(cookies[i]);
  7.             // Does this cookie string begin with the name we want?
  8.             if (cookie.substring(0, name.length + 1=== (name + "=")){
  9.                 cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
  10.                 break;
  11.             }
  12.         }
  13.     }
  14.     return cookieValue;
  15. }
  16. var csrftoken = getCookie("csrftoken");
 
每一次都这么写太麻烦了,可以使用$.ajaxSetup()方法为ajax请求统一设置。
 
  1. function csrfSafeMethod(method){
  2.     // these HTTP methods do not require CSRF protection
  3.     return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method);
  4. }
  5. $.ajaxSetup({
  6.     beforeSend: function(xhr, settings){
  7.         if (!csrfSafeMethod(settings.type) && !this.crossDomain){
  8.             xhr.setRequestHeader("X-CSRFToken", csrftoken);
  9.         }
  10.     }
  11. })

注意:
如果使用从cookie中取csrftoken的方式,需要确保cookie存在csrftoken值。

如果你的视图渲染的HTML文件中没有包含{% csrf_token %}, Django可能不会设置CSRFtoken的cookie。

这个时候需要使用ensure_csrf_cookie()装饰器强制设置Cookie。

  1. django.views.decorators.csrf import ensure_csrf_cookie
  2. @ensure_csrf_cookie
  3. def login(request):
  4.     pass
 
posted @ 2019-11-29 09:30  yang-leo  阅读(723)  评论(0)    收藏  举报