日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

ajax头文件报错,AJAX的CSRF保护

發(fā)布時(shí)間:2025/3/21 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ajax头文件报错,AJAX的CSRF保护 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

如果使用ajax傳輸數(shù)據(jù),需要在AJAX中要使用csrf保護(hù)。

一般而言,即在后端已經(jīng)使用了CSRFProtect(app)的前提下,

如果想使用ajax,避免400的報(bào)錯(cuò),可以前端的表單里引入標(biāo)簽,如下所示

login.html

然后在js中的ajax代碼塊中將csfr包裹起來(lái):

login.js

$(function () {

$('#submit').click(function (event) {

// 阻止默認(rèn)的提交表單的行為

event.preventDefault();

var email = $('input[name=email]').val();

var password = $('input[name=password]').val();

var csrftoken = $('input[name=csrf_token]').val()

$.post({

'url': '/login/',

'data': {

'email': email,

'password': password,

'csrf_token':csrftoken

// 把csrf也作為數(shù)據(jù)傳輸過(guò)去

},

'success': function (data) {

console.log(data);

},

'fail': function (error) {

console.log(error);

}

});

});

});

以上方法是完全可行的,但是太low逼了,雖然后臺(tái)通過(guò)wtform可以正確拿到數(shù)據(jù):

form=LoginForm(request.form)

if form.validate():

email=form.email.data

password=form.password.data

print(email,password)

參考官方文檔,官方文檔給出的建議是如果是ajax,最好是在頭文件寫csrf-token,即手動(dòng)的添加X(jué)-CSRFToken到Header中。但是CSRF從哪里來(lái),還是需要通過(guò)模板給渲染,Flask比較推薦的方式是在前端html文件的meta標(biāo)簽中渲染csrf,如下:

login.html

參考官方文檔,如果要發(fā)送AJAX請(qǐng)求,則在發(fā)送之前要添加CSRF,官網(wǎng)文檔里有這樣一段很屌的代碼如下(使用了jQuery),在頭文件里處理了csrftoken:

var csrftoken = $('meta[name=csrf-token]').attr('content')

$.ajaxSetup({

beforeSend: function(xhr, settings) {

if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {

xhr.setRequestHeader("X-CSRFToken", csrftoken)

}

}

})

于是,相應(yīng)的最初版的login.js改寫成如下的形式

login.js

$(function () {

$('#submit').click(function (event) {

// 阻止默認(rèn)的提交表單的行為

event.preventDefault();

var email = $('input[name=email]').val();

var password = $('input[name=password]').val();

// 得到head中的csrf-token的attr值

var csrftoken = $('meta[name=csrf-token]').attr('content')

$.ajaxSetup({

beforeSend: function(xhr, settings) {

if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {

xhr.setRequestHeader("X-CSRFToken", csrftoken)

}

}

});

$.post({

'url': '/login/',

'data': {

'email': email,

'password': password,

// 注意與最初的版本的不同

},

'success': function (data) {

console.log(data);

},

'fail': function (error) {

console.log(error);

}

});

});

});

這是按照官方文檔標(biāo)準(zhǔn)的寫法,但是也太麻煩了。。。。。

所以,我們可以自己封裝一個(gè)myajax.js文件:

myajax.js

var myajax = {

'get':function(args) {

args['method'] = 'get';

this.ajax(args);

},

'post':function(args) {

args['method'] = 'post';

this.ajax(args);

},

'ajax':function(args) {

// 設(shè)置csrftoken

this._ajaxSetup();

$.ajax(args);

},

'_ajaxSetup': function() {

$.ajaxSetup({

'beforeSend':function(xhr,settings) {

if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {

var csrftoken = $('meta[name=csrf-token]').attr('content');

xhr.setRequestHeader("X-CSRFToken", csrftoken)

}

}

});

}

};

接著在前端html文件的meta標(biāo)簽中渲染csrf,同時(shí)調(diào)用myajax.js,如下:

base.html

Title

{% block head %}{% endblock %}

導(dǎo)航條

{% block body %}{% endblock %}

底部欄

附上login.html代碼,在其中引入了login.js:

{% extends 'base.html' %}

{% block head %}

{% endblock %}

{% block body %}

郵箱:
密碼:

{% endblock %}

最后在login.js中調(diào)用封裝好的myajax.post替代原聲的$.ajax.post:

login.js

/**

* Created by hynev on 2017/11/10.

*/

//jquery

//XMLHTTTPRequest

//整個(gè)文檔都加載完畢后才會(huì)執(zhí)行這個(gè)函數(shù)

$(function(){

$('#submit').click(function(event){

//阻止默認(rèn)的提交表單的行為

event.preventDefault();

varemail=$('input[name=email]').val();

varpassword=$('input[name=password]').val();

myajax.post({

'url':'/login/',

'data':{

'email':email,

'password':password

},

'success':function(data){

console.log(data);

},

'fail':function(error){

console.log(error);

}

});

});

});

這個(gè)myajax.js這個(gè)文件可以直接用在很多地方。

總結(jié)

以上是生活随笔為你收集整理的ajax头文件报错,AJAX的CSRF保护的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。