在前后端分离的开发模式中,跨域请求已成为常见场景。然而由于浏览器的同源策略限制,Session在跨域访问时无法被共享,这会导致用户登录状态无法在不同域名之间保持。为了实现Session跨域共享,我们可以采用Cookie或Token等方式进行处理。
Cookie可以在一定条件下实现跨域传递,因此是一种较为常见的Session共享方案。以下是实现步骤:
第一步,在服务端创建Session:
session_start();
$_SESSION['user'] = 'example';
第二步,将Session ID写入Cookie,并设置Cookie作用域:
setcookie(session_name(), session_id(), time() + 60*60*24*30, '/', 'www.example.com', false, true);
其中,www.example.com应根据实际域名修改。
第三步,在前端跨域请求时携带Cookie:
fetch('http://www.example.com/api', {
credentials: 'include',
});
这里的credentials: 'include'用于确保浏览器在请求中发送Cookie信息。
第四步,服务端接收请求并解析Cookie中的Session:
session_id($_COOKIE[session_name()]);
session_start();
if(isset($_SESSION['user'])){
// session 跨域共享成功
}else{
// session 跨域共享失败
}
通过上述配置,即可在跨域环境下共享Session信息。
另一种更灵活的方案是使用Token机制来实现跨域Session共享。这种方法不依赖Cookie,因此更适合API接口或移动端场景。
实现步骤如下:
第一步,用户登录时在服务端生成一个Token:
$token = bin2hex(random_bytes(16));
// 将token存入数据库并与用户绑定
// 返回token给客户端
第二步,前端将Token保存到localStorage或sessionStorage中。
第三步,跨域请求时将Token添加到请求头或参数中发送至服务端:
fetch('http://api.example.com/userinfo', {
headers: {
'Authorization': 'Bearer ' + localStorage.getItem('token')
}
});
第四步,服务端通过解析Token验证用户身份,并根据验证结果恢复Session状态。
在使用Token方案时,需要注意安全性问题。Token应设置有效期,并可通过刷新机制定期更新;服务端还应定期清理过期Token,以防止安全风险。
本文介绍了两种常见的PHP Session跨域共享方案:通过Cookie共享Session和通过Token机制实现Session验证。前者实现简单,适合同主域下的子域共享;后者更灵活、安全性更高,适用于复杂的分布式或多端系统。开发者可根据项目架构与安全需求选择合适的实现方式。