【发布时间】:2017-10-21 00:02:04
【问题描述】:
我有一个显示 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 保护,文档说明如下:
发送 AJAX 请求时,添加 X-CSRFToken 标头。为了 例如,在 JQuery 中,您可以配置所有请求以发送令牌。
<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(没有 CSRF 的工作表格)在语法上是否正确?
- 我不应该使用“ajaxSetup”吗?
- 知道为什么我没有取回 JSON 数据吗?我是否也需要将退货包裹在 CSRF 中?
非常感谢您的帮助,感谢您的宝贵时间。
语法正确且功能正常 2. s
【问题讨论】:
-
您可以在您的 htaccess 文件中启用 csrf 保护。尝试使用success函数而不是done
标签: jquery ajax flask wtforms flask-wtforms