在 CakePHP 3.6 中使用 ajax 上传图像时 CSRF 令牌不匹配
CSRF token mismatch while uploading image using ajax in CakePHP 3.6
我试过了
class UsersController extends AppController
{
public function beforeFilter(Event $event)
{
$this->getEventManager()->off($this->Csrf);
}
public function ajaxEdit($id = null)
{
$this->autoRender = false;
debug($id);
debug($this->request->getData());
}
我正在使用 ajax 代码
$(document).ready(function(){
$('#user-profile').change(function(){
$('.loader-body').show();
var form = $('#user-profile-image')[0];
var formData = new FormData(form);
var tutorial_id = $('#user-file-id').val();
$.ajax({
url :"/users/ajax-edit/"+tutorial_id,
method:"POST",
data:formData,
contentType:false,
cache: false,
processData:false,
success:function(data){
let parseData = $.parseJSON(data);
if (parseData.status === true) {
location.reload();
var value = parseData.url;
console.log(value);
} else {
alert(parseData.message);
}
}
});
});
});
我已关注这些链接的帮助
- CakePHP ajax CSRF token mismatch
2 https://book.cakephp.org/3.0/en/controllers/components/csrf.html
获取 CSRF 令牌不匹配(见附图)
https://i.stack.imgur.com/FsVZu.png
首先,如果您在 ajax 调用中使用 POST 方法,那么您应该将 tutorial_id 作为数据发送,而不是在 url 中发送。
您可以通过 ajax 调用中的特殊 X-CSRF-Token header 向您发送 CSRF 令牌来解决此问题。
https://book.cakephp.org/3.0/en/controllers/components/csrf.html
beforeSend: function (xhr) {
xhr.setRequestHeader('X-CSRF-Token', $('[name="_csrfToken"]').val());
},
或
您可以为您的 ajax 操作禁用 CSRF 组件[Cakephp 不推荐],例如:
public function beforeFilter(Event $event) {
if (in_array($this->request->action, ['ajaxEdit'])) {
$this->eventManager()->off($this->Csrf);
}
}
我试过了
class UsersController extends AppController
{
public function beforeFilter(Event $event)
{
$this->getEventManager()->off($this->Csrf);
}
public function ajaxEdit($id = null)
{
$this->autoRender = false;
debug($id);
debug($this->request->getData());
}
我正在使用 ajax 代码
$(document).ready(function(){
$('#user-profile').change(function(){
$('.loader-body').show();
var form = $('#user-profile-image')[0];
var formData = new FormData(form);
var tutorial_id = $('#user-file-id').val();
$.ajax({
url :"/users/ajax-edit/"+tutorial_id,
method:"POST",
data:formData,
contentType:false,
cache: false,
processData:false,
success:function(data){
let parseData = $.parseJSON(data);
if (parseData.status === true) {
location.reload();
var value = parseData.url;
console.log(value);
} else {
alert(parseData.message);
}
}
});
});
});
我已关注这些链接的帮助
- CakePHP ajax CSRF token mismatch
2 https://book.cakephp.org/3.0/en/controllers/components/csrf.html
获取 CSRF 令牌不匹配(见附图)
https://i.stack.imgur.com/FsVZu.png
首先,如果您在 ajax 调用中使用 POST 方法,那么您应该将 tutorial_id 作为数据发送,而不是在 url 中发送。
您可以通过 ajax 调用中的特殊 X-CSRF-Token header 向您发送 CSRF 令牌来解决此问题。 https://book.cakephp.org/3.0/en/controllers/components/csrf.html
beforeSend: function (xhr) {
xhr.setRequestHeader('X-CSRF-Token', $('[name="_csrfToken"]').val());
},
或
您可以为您的 ajax 操作禁用 CSRF 组件[Cakephp 不推荐],例如:
public function beforeFilter(Event $event) {
if (in_array($this->request->action, ['ajaxEdit'])) {
$this->eventManager()->off($this->Csrf);
}
}