1.ajax登录示例
urls.py
from django.conf.urls importurlfrom django.contrib importadminfrom app01 importviews
urlpatterns=[
url(r'^admin/', admin.site.urls),
url(r'^login_ajax/$', views.login_ajax, name='login_ajax'),
url(r'^index/$', views.index, name='index'),
]
views.py
from django.shortcuts importrender, HttpResponse, redirectimportjsondefindex(request):return HttpResponse('this is index')deflogin_ajax(request):if request.method == "POST":
user= request.POST.get("user")
pwd= request.POST.get("pwd")
ret= {"status": 0, 'url': ''}if user == "alex" and pwd == "123":
ret['status'] = 1ret['url'] = '/index/'
returnHttpResponse(json.dumps(ret))return render(request, "login_ajax.html")
login.html登录页面
登录请登录
用户名
密码
记住我
$('#login').click(function () {
$.ajax({
url:'/login_ajax/',
type:'post',
data: {
csrfmiddlewaretoken: $("[name='csrfmiddlewaretoken']").val(),
user: $('[name="user"]').val(),
pwd: $('[name="pwd"]').val()
},
success: function (data) {
data=JSON.parse(data);if(data.status) {
window.location=data.url
}else{
alert('登陆失败')
}
}
})
})
View Code
静态文件需要配置,使用了jQuery和Bootstrap。
2.CSRF跨站请求伪造
一共四种方式
1,将 csrfmiddlewaretoken: $("[name='csrfmiddlewaretoken']").val() 放在POST的请求体中。
示例中就是使用的这种方式。
2,给ajax的请增加X-CSRFToken的请求头,对应的值只能是cookie中的csrftoken的值。
所以我们要从cookie中提取csrftoken的值,jQuery不能去cookie,我们使用jquery.cookie的插件。点击下载jquer.cookie插件。
HTML中导入jquery.cookie.js。
$('#login').click(function () {
$.ajax({
url:'/login_ajax/',
type:'post',
headers:{"X-CSRFToken":$.cookie('csrftoken') },
data: {
user: $('[name="user"]').val(),
pwd: $('[name="pwd"]').val()
},
success: function (data) {
data=JSON.parse(data);if(data.status) {
window.location=data.url
}else{
alert('登陆失败')
}
}
})
})
View Code
3,使用$.ajaxSetup()给全局的ajax添加默认参数。
可以按照方式一设置data,也可以按照方式二设置请求头。
$.ajaxSetup({
data: {
csrfmiddlewaretoken: $("[name='csrfmiddlewaretoken']").val(),
}
});
或者
$.ajaxSetup({
headers: {"X-CSRFToken": $.cookie('csrftoken')},
});
4,官方推荐方法(用到jquery.cookie插件):
function csrfSafeMethod(method) {// these HTTP methods do notrequire CSRF protectionreturn (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function (xhr, settings) {if (!csrfSafeMethod(settings.type) &&!this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", $.cookie('csrftoken'));
}
}
});