1、簡介jquery
django爲用戶實現防止跨站請求僞造的功能,經過中間件 django.middleware.csrf.CsrfViewMiddleware 來完成。而對於django中設置防跨站請求僞造功能有分爲全局和局部。ajax
全局:django
中間件 django.middleware.csrf.CsrfViewMiddlewarecookie
局部:session
from django.views.decorators.csrf import csrf_exempt,csrf_protect
2、應用函數
普通表單提交post
<form action="/xiaoqing/session1/" method="post"> {{ csrf_token }} #實際上是後臺給用戶發 一堆字符串 {% csrf_token %} #須要設置 {% csrf_token %} <input type="text" name="username"/> <input type="text" name="password"/> <input type="checkbox" value="1" name="remember">10s免登陸 <input type="submit" value="提交"/> <input type="button" value="ajax提交" id="btn"> </form>
Ajax提交ui
對於傳統的form,能夠經過表單的方式將token再次發送到服務端,而對於ajax的話,使用以下方式。this
<form action="/xiaoqing/session1/" method="post"> {{ csrf_token }} #實際上是後臺給用戶發 一堆字符串 {% csrf_token %} <input type="text" name="username"/> <input type="text" name="password"/> <input type="checkbox" value="1" name="remember">10s免登陸 <input type="submit" value="提交"/> <input type="button" value="ajax提交" id="btn"> </form> <script src="/static/jquery-3.2.1.min.js"></script> <script src="/static/jquery.cookie.js"></script> <script> var csrftoken = $.cookie('csrftoken') #獲取csrftoken cookie $(function(){
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); #判斷是get方法仍是post方法 }
$.ajaxSetup({ beforeSend: function(xhr, settings) { if (!csrfSafeMethod(settings.type) && !this.crossDomain) { xhr.setRequestHeader("X-CSRFToken", csrftoken); } } }); //這段表示判斷是get請求仍是post請求 get請求不須要csrftoken驗證
$.ajaxSetup({ beforeSend:function(xhr,settings){ xhr.setRequestHeader('X-CSRFtoken',csrftoken) } }) $('#btn').click(function(){ $.ajax({ url:'/xiaoqing/session1/', type:'POST', data:{'user':"root",'pwd':123456}, {# headers:{'X-CSRFtoken':csrftoken#} success:function(arg){ } }) }) }) </script>