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

ReactJS前端搭配CodeIgniter后端构建登录系统session不生效问题求解

核心问题原因

PHP的会话依赖PHPSESSIDCookie维持用户身份,fetch API 默认不会在跨域请求中携带、也不会接收后端返回的Cookie凭证,而你之前使用的jQuery Ajax默认开启了凭证携带能力,这就是两种请求方式表现不一致的根本原因。

前端修复方案

所有和后端交互的fetch请求,都需要在配置参数中添加credentials: 'include',明确要求fetch携带/接收Cookie:

  1. 修改App组件的鉴权请求:
fetch('http://localhost/forReact/index.php/general/authenticate',{
  method:'GET',
  headers: {'Accept': 'application/json', 'Content-Type': 'application/json'},
  mode: 'cors',
  cache: 'no-cache',
  // 新增这一行
  credentials: 'include'
})
  1. 修改登录面板的登录请求:
fetch('http://localhost/forReact/index.php/general/login',{
  method:'POST',
  headers: {'Accept': 'application/json', 'Content-Type': 'application/json'},
  body: JSON.stringify(toServer),
  mode: 'cors',
  cache: 'no-cache',
  // 新增这一行
  credentials: 'include'
})
  1. 补充登录成功后的状态更新逻辑:当前登录请求成功后仅弹出提示,没有触发App组件的鉴权状态刷新,建议登录成功后调用父组件传入的回调,重新发起鉴权请求或者直接修改isUserAuthenticated状态,实现登录成功后自动跳转到仪表盘。

后端CORS配置修复

当请求携带凭证时,CORS策略不允许使用通配符*作为允许的源,需要对CodeIgniter的CORS响应头做两处调整:

  • 将Access-Control-Allow-Origin设置为你React应用的实际访问地址,比如本地开发就是http://localhost:3000
  • 新增响应头Access-Control-Allow-Credentials: true
    如果存在预检OPTIONS请求,还要单独处理OPTIONS方法的返回,返回200状态码和上述响应头即可。

额外校验项

可以检查CodeIgniter的session配置:确认$config['cookie_domain']、$config['cookie_path']和你前后端的访问地址匹配,没有额外的跨域限制。

内容的提问来源于stack exchange,提问作者Gajen Dissanayake

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:57:01