gpt4 book ai didi

JQuery AJAX BeforeSend CSRF 保护

转载 作者:行者123 更新时间:2023-12-01 05:20:50 33 4
gpt4 key购买 nike

我有一个显示 JSON 响应的 AJAX 进程。如果我禁用 CSRF 保护,该过程就会起作用。我收到 HTTP 200 并收到 JSON 响应。

以下是工作形式:

$(document).ready(function() {

//AJAX
$('form').on('submit', function(event) {
$.ajax({
data : {
user : $('#user').val(),
password : $('#password').val()
},
url: '/loginproc',
type: 'POST'
})
.done(function(data) {
if (data.error) {
$('#errorAlert').text(data.error).show();
$('#successAlert').hide();
}
else {
$('#successAlert').text(data.xx).show();
$('#errorAlert').hide();
}
});
event.preventDefault();
});

});

这在语法上正确吗?我需要在“.done”之前添加分号吗?

<小时/>

我正在使用 Flask-WTForms CSRF 保护,文档说明如下:

When sending an AJAX request, add the X-CSRFToken header to it. For example, in JQuery you can configure all requests to send the token.

<script type="text/javascript">
var csrf_token = "{{ csrf_token() }}";

$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrf_token);
}
}
});
</script>
<小时/>

使用以下 JS,我可以获得 HTTP 200,但是,我没有返回任何 JSON 数据

$(document).ready(function() {

$('form').on('submit', function(event) {

var csrf_token = "{{ csrf_token() }}";

$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type)) {
xhr.setRequestHeader("X-CSRFToken", csrftoken)
}
}
});

$.ajax({
data : {
user : $('#user').val(),
password : $('#password').val()
},
url: '/loginproc',
type: 'POST'
})
.done(function(data) {
if (data.error) {
$('#errorAlert').text(data.error).show();
$('#successAlert').hide();
}
else {
$('#successAlert').text(data.xx).show();
$('#errorAlert').hide();
}
});
event.preventDefault();
});

});

这完全正确吗?我确实得到了 HTTP 200,但没有返回 JSON 数据。 JQuery/AJAX 让我很困惑。

问题:

  1. 形式 1(没有 CSRF 的工作形式)语法正确吗?
  2. 我不应该使用“ajaxSetup”吗?
  3. 有什么想法为什么我没有取回 JSON 数据吗?我是否也需要将返回包裹在 CSRF 中?

非常感谢您的帮助,感谢您的宝贵时间。

语法正确且功能正确 2.

最佳答案

我建议您移动 event.preventDefault();在事件提交之后也使用console.log,这样你就可以检查变量是否包含你认为的内容,控制台在你的浏览器中,只需谷歌如何在浏览器中打开你的控制台,这样你就可以检查包含csrf_token的内容以及长度和数据在“done”aa 的响应中添加 .fail 以便您可以处理有错误的服务器响应。

关于以下问题:“我需要在“.done”之前添加分号吗?”答案是否定的,因为这称为方法链接示例: $("#id").show().css("background", "red");在示例中,我链接 show 和 css,您可以一次链接如此多的方法;)

$(document).ready(function() {

$('form').on('submit', function(event) {
event.preventDefault();
var csrf_token = "{{ csrf_token() }}";
console.log("csrf_token: ", csrf_token);

$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type)) {
xhr.setRequestHeader("X-CSRFToken", csrftoken)
}
}
});

$.ajax({
data : {
user : $('#user').val(),
password : $('#password').val()
},
url: '/loginproc',
type: 'POST'
})
.done(function(data) {
console.log("done", data.length, data);
if (data.error) {
$('#errorAlert').text(data.error).show();
$('#successAlert').hide();
}
else {
$('#successAlert').text(data.xx).show();
$('#errorAlert').hide();
}
})
.fail(function( jqXHR, textStatus, errorThrown ) {
console.error("response with error:", jqXHR, textStatus, errorThrown);
});
});

});

关于JQuery AJAX BeforeSend CSRF 保护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44094062/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com