CodeIgniter 4调用AJAX触发Session timeout是否需手动校验会话?
CodeIgniter AJAX会话超时校验问题解答
不需要在每个控制器的方法中手动重复编写会话状态校验逻辑,可以通过框架自带的能力做统一处理,具体实现方案如下:
方案1:继承统一基类控制器
- 在
application/core目录下创建自定义核心控制器MY_Controller,继承原生CI_Controller - 在
MY_Controller的构造方法中统一实现会话校验逻辑:
首先判断会话是否失效,再调用$this->input->is_ajax_request()方法判断当前请求类型:- 普通请求:直接跳转至登录页面
- AJAX请求:返回约定格式的JSON错误响应,示例:
{"code":401,"msg":"会话已过期,请重新登录"}
- 所有需要会话校验的业务控制器都继承
MY_Controller即可,无需在每个方法中重复写校验逻辑 - 若存在不需要校验的方法(比如登录、公开接口),可以在基类中维护免校验名单,校验逻辑执行前先判断当前请求方法是否在名单内,在名单内则直接跳过校验
方案2:通过钩子实现全局校验
如果需要对全站所有控制器做统一校验,还可以使用CodeIgniter的钩子特性:
- 开启钩子配置,在
application/config/hooks.php中注册post_controller_constructor类型的钩子 - 在钩子对应的执行方法中实现和上述基类一样的会话校验逻辑,会在控制器实例化之后、方法执行前自动触发,不需要修改业务控制器的继承逻辑
前端配套处理
前端可以统一封装AJAX请求拦截器,只要收到约定的401会话过期错误码,就自动执行跳转到登录页的逻辑,不需要每个接口单独处理过期场景。
内容的提问来源于stack exchange,提问作者Novice
相关产品推荐
相关产品推荐

