记录一次自己项目中遇到的session跨域问题
项目框架: TP6.0
功能需求: 后台登录时需要添加验证码验证,前后端分离,不同域名。
点我进入官方手册
安装验证码扩展
点我查看验证码安装和使用详情
开启中间件
#文件路径:app/middleware.php
<?php
// 全局中间件定义文件
return [
// 全局请求缓存
// \think\middleware\CheckRequestCache::class,
// 多语言加载
// \think\middleware\LoadLangPack::class,
// Session初始化
#开启session
\think\middleware\AllowCrossDomain::class,
#开启跨域
\think\middleware\SessionInit::class,
];
配置cookie
配置cookie的原因是设置session的作用域
#文件路径:config/cookie.php
<?php
// +----------------------------------------------------------------------
// | Cookie设置
// +----------------------------------------------------------------------
return [
// cookie 保存时间
'expire' => 0,
// cookie 保存路径
'path' => '/',
// cookie 有效域名
'domain' => 'baidu.com',
// cookie 启用安全传输
'secure' => false,
// httponly设置
'httponly' => false,
// 是否使用 setcookie
'setcookie' => true,
];
比如你配置的前端是m.baidu.com,api是api.baidu.com,那这个作用于就是baidu.com。
作用域只能配置同级或低于当前等级的域名,比如配置的是baidu.com,那在baidu.net中是不生效的
如果上面配置好以后还是来不起,那么只能通过前端协助把session_id传到后端
配置session
配置session主要是配置前端传输session_id的参数键名
前端传输session_id只能通过GET方式传输,POST或head头传输TP框架获取不到,除非自己重写TPsession初始化,改变获取session_Id的方式
return [
// session name 这个不用动,一般默认的就是PHPSESSID
'name' => 'PHPSESSID',
// SESSION_ID的提交变量,解决flash上传跨域
#前端传输的参数键名
'var_session_id' => "session_id",
// 驱动方式 支持file cache
'type' => 'file',
// 存储连接标识 当type使用cache的时候有效
'store' => null,
// 过期时间
'expire' => 1440,
// 前缀
'prefix' => '',
];
到这一步骤基本上都能来得起,如果还是来不起,欢迎解决以后留言交流!