我在具有控制器的同一codeigniter 3项目中有两个页面,每个页面都有一个子视图,但是使用相同的模板。
这两个页面具有相同的控制器和子视图(仅用于测试,因为在实际情况下,它们实际上具有相同的行为和代码)。
第1页:http://localhost/project-name/register-page1/form/
第2页:http://localhost/project-name/register-page2/form/
在第1页上,带有csrf_token()的ajax可以正常工作。但使用第2页中的相同代码,则无法使用,并说从ajax请求访问方法时禁止403。
我不知道为什么我的代码无法在page1上运行,但不能在page2上运行,并且错误403被禁止。请帮助我...
POST http://localhost/project-name/register-page2/getKabupatenByProvinceName 403(禁止访问)
在 config.php 设置上
$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'csrf_platform';
$config['csrf_cookie_name'] = 'csrf_cookie_platform';
$config['csrf_expire'] = 7200;
$config['csrf_regenerate'] = TRUE;
$config['csrf_exclude_uris'] = array();
register-page1 和 register-page2 ajax控制器
public function getKabupatenByProvinceName()
{
$province_name = $this->input->post('name', TRUE);
$province_data = $this->Province_model->getProvinceByName($province_name)->row();
$data = $this->Province_model->getRegencyByProvinceId($province_data->id)->result();
echo json_encode($data);
}
视图上的register-page1 和 register-page2 ajax请求
$('#provinsi').change(function() {
var csrfName = '<?php echo $this->security->get_csrf_token_name(); ?>';
var csrfHash = get_token();
$('#kabupaten_kota' + '_loading').html('<i class="fa fa-spinner fa-spin" style="font-size:16px"></i> Loading');
var name = $(this).val();
$.ajax({
url: window.location.origin + "/umi-pnm/register/getKabupatenByProvinceName",
method: "POST",
data: {
name: name,
[csrfName]: csrfHash
},
async: true,
dataType: 'json',
success: function(data) {
refill_token();
var html = '';
var i;
html += '<option value="" disabled selected>-- Pilih Kabupaten --</option>';
for (i = 0; i < data.length; i++) {
html += '<option value="' + toTitleCase(data[i].name) + '">' + toTitleCase(data[i].name) + '</option>';
}
$('#kabupaten_kota').html(html);
$('#kabupaten_kota' + '_loading').html('');
}
});
return false;
});
register-page1 和 register-page2 ajax函数可获取并重新填充csrf_token
function get_token() {
var respon;
$.ajax({
type: 'GET',
async: false,
url: window.location.origin + "/umi-pnm/register/regenerate_csrf_token",
dataType: "html",
success: function(data) {
respon = data;
}
});
return respon;
}
function refill_token() {
var respon;
$.ajax({
type: 'GET',
async: false,
url: window.location.origin + "/umi-pnm/register/regenerate_csrf_token",
dataType: "html",
success: function(data) {
respon = data;
}
});
var els = document.getElementsByName('<?php echo $this->security->get_csrf_token_name(); ?>');
// console.log(els.length);
for (var i = 0; i < els.length; i++) {
els[i].value = respon;
}
}