zoukankan      html  css  js  c++  java
  • Ajax请求如何设置csrf_token

    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
    
  • 相关阅读:
    display ntp-service sessions
    display ntp-service status
    MySQL与telnet安装
    YL_组播_IGMPv2-v3
    YL_组播_PIM-DM协议原理
    YL_组播_IGMP协议原理
    IIS发布站点问题
    css 定位及遮罩层小技巧
    MYSQL查询某字段中以逗号分隔的字符串的方法
    零度
  • 原文地址:https://www.cnblogs.com/yang-wei/p/10009106.html
Copyright © 2011-2022 走看看