我的html页面上有两个链接:
<a id="1" onclick="like(this.id)">first</a>
<a id="2" onclick="like(this.id)">Second</a>
我的JS如下:
function like (id) {
$.ajax({
type:'POST',
data: {
func:
'getNewLocations',
'<?php echo $this->security->get_csrf_token_name(); ?>':
'<?php echo $this->security->get_csrf_hash(); ?>',
message:id
},
url:'<?php echo base_url();?>index.php/Category/like',
success: function(result, statut) {
if (result == 'add') {
//do something
}
else if (result == 'remove') {
//do something
}
}
});
}
而PHP方法如下(仅为示例):
public function like() {
echo 'add';
}
当我第一次点击链接1时, AJAX 请求正常工作,服务器回答“add”。但是当我点击链接2时,我有一个403错误。更令人惊讶的是,当我点击链接2的第一个链接时,它工作,但链接1不工作。我用codeIgniter工作。
你知道为什么和怎么解决吗?谢谢
3条答案
按热度按时间ckx4rj1h1#
由于您似乎正在使用CSRF令牌来验证请求,因此任何发送无效令牌的请求都将被拒绝。
当你第一次点击任何一个锚时,你就用完了那个令牌,所以为了发出额外的请求,你需要在响应中得到一个新的令牌,并使用它来代替旧的令牌。
您只需将数据值(本例中为
"add"
)与csrf值一起发回:get_csrf_token_name()
和get_csrf_hash()
例如,您可以返回包含这些值的JSON值,而不是只返回纯文本
php脚本
在JavaScript中
请注意,如果您支持支持ECMAScript 2015的浏览器,则可以使用计算密钥在数据对象初始化程序中设置csrf值
68bkxrlz2#
第一次提交后,csrf令牌不再有效,您有两种选择。
您可以在config.php中设置以下内容
或者更新页面上的CPRF令牌。
s1ag04yj3#
用于代码点火器4
首先,转到app/Config/Security.php
变更
结束日期