解决 Ajax 发送 post 请求出现 403 Forbidden 的三种方式
众所周知前端向后台发送 post 请求时,必须验证 <ul id="ddd"> <li>1</li> <li>2</li> <li>3</li> </ul> <button id="btn" type="button">Ajax 发送</button> 1. 方式一<script src="{% static 'js/jquery-3.1.1.js' %}"></script> <script> $('#btn').click(function () { var li_content = []; $('#ddd').children('li').each(function () { li_content.push($(this).html()); }); console.log(li_content); $.ajax({ url: '/webs/test_json/',type: 'post',data: { 'li_list': JSON.stringify(li_content),csrfmiddlewaretoken: '{{ csrf_token }}' // 添加这句 },success: function (arg) { console.log(arg); } }) }) </script> 2. 方式二方式二仅在 Django 中适用,因为 <ul id="ddd"> {% csrf_token %} <!--添加这句会生成一个隐藏的 input 标签,name='csrfmiddlewaretoken'--> <li>1</li> <li>2</li> <li>3</li> </ul> <button id="btn" type="button">Ajax 发送</button> <script src="{% static 'js/jquery-3.1.1.js' %}"></script> <script> $('#btn').click(function () { var li_content = []; $('#ddd').children('li').each(function () { li_content.push($(this).html()); }); console.log(li_content); $.ajax({ url: '/webs/test_json/',csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val() // 添加这句,去获取 input 的值 },success: function (arg) { console.log(arg); } }) }) </script> 3. 方式三因为 1、直接添加请求头: $.ajax({ url: '/webs/test_json/',headers: { "X-CSRFtoken":$.cookie("csrftoken")}, type: 'post',data: { 'li_list': JSON.stringify(li_content) },success: function (arg) { console.log(arg); } }) }) 2、如果页面有多个 Ajax,那么可以设置全局的: 发送请求前会事先执行 $.ajaxSetup({ beforeSend: function (xhr,settings) { if (!csrfSafeMethod(settings.type) && !this.crossDomain) { xhr.setRequestHeader("X-CSRFToken",$.cookie('csrftoken')); } } }); $.ajax({ url: '/webs/test_json/',data: { 'li_list': JSON.stringify(li_content) },success: function (arg) { console.log(arg); } }) 3、如果想要实现在当 <script src="{% static 'js/jquery-3.1.1.js' %}"></script> <script type="text/javascript" src="/static/js/jquery.cookie.js"></script> <script> $('#btn').click(function () { var li_content = []; $('#ddd').children('li').each(function () { li_content.push($(this).html()); }); console.log(li_content); function csrfSafeMethod(method) { // these HTTP methods do not require CSRF protection return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); } /* 全局Ajax中添加请求头X-CSRFToken,用于跨过CSRF验证 */ $.ajaxSetup({ beforeSend: function (xhr,settings) { if (!csrfSafeMethod(settings.type) && !this.crossDomain) { xhr.setRequestHeader("X-CSRFToken",$.cookie('csrftoken')); } } }); $.ajax({ url: '/webs/test_json/',success: function (arg) { console.log(arg); } }) }) </script>
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |