You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CakePHP 4.3.9中AJAX获取对应国家州列表时出现403禁止错误

解决CakePHP 4.3.9中AJAX请求获取州列表的403 Forbidden错误

以下是针对你遇到问题的具体修复步骤:

1. 处理CSRF令牌验证(最可能的触发原因)

CakePHP默认启用CSRF中间件,所有POST请求必须携带有效CSRF令牌,否则会直接返回403禁止访问。需要在AJAX请求中加入令牌:

前端代码修改(signup.php)

先确保页面头部包含CakePHP自动生成的CSRF meta标签,再在AJAX请求中传入令牌:

<!-- 页面头部需包含该meta标签,CakePHP通常会自动生成,若缺失可手动添加 -->
<meta name="csrfToken" content="<?= $this->request->getAttribute('csrfToken') ?>">

<script>
$(document).ready(function() {
    $('#country_id').change(function() {
        $('#mydiv').hide();
        var countryId = $(this).val();
        var csrfToken = $('meta[name="csrfToken"]').attr('content');
        
        $.ajax({
            url: '/users/getStatesByCountryID/' + countryId, // 改用绝对路径避免相对路径跳转错误
            type: 'post',
            dataType: 'json',
            data: {
                _csrfToken: csrfToken // 传入CSRF令牌
            },
            beforeSend: function(){
                $('#mydiv').show();
            },
            success: function(data) {
                $('#mydiv').hide();
                $('#stateid').html('');
                // 修正遍历对象:后端返回的是stateList数组,直接遍历即可
                $.each(data, function(key, value) {
                    $('#stateid').append('<option value="' + key + '">' + value + '</option>');
                });
            },
            error: function(jqXHR, textStatus, errorThrown) {
                $('#mydiv').hide();
                console.error("Error fetching states:", textStatus, errorThrown);
            }
        });
    });
});
</script>

2. 修正控制器逻辑与返回格式

当前控制器存在两处错误:查询表错误(查了Countries而非States)、未指定JSON返回格式。

UsersController.php修改

public function getStatesByCountryID($id){
    $this->request->allowMethod(['post']); // 前端用POST请求,这里仅允许POST即可
    // 修正:查询对应国家的州列表,假设States表通过country_id关联Countries表
    $stateList = $this->fetchTable('States')
        ->find('list')
        ->select(['id', 'name'])
        ->where(['country_id' => $id]) // 根据传入的国家ID过滤州数据
        ->order(['name' => 'ASC'])
        ->toArray();

    // 指定返回JSON格式,跳过视图渲染
    $this->set(compact('stateList'));
    $this->viewBuilder()->setOption('serialize', 'stateList');
}

3. 其他验证点

  • 确认路由配置在$routes->scope('/')作用域内,你的现有路由配置是正确的,无需修改
  • 确认beforeFilter中已将getStatesByCountryID加入未认证动作列表(你已配置正确)
  • 检查States表是否存在country_id字段,且与Countries表的id字段关联

内容的提问来源于stack exchange,提问作者chirag p

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 21:45:32