问题描述

近期做了一个前后端分离的项目,我开发 API 供前端调用。

在开发过程中遇到了一个问题:用户通过登录接口登录成功后,在后台记录 session 值表明用户的登录状态,但该用户请求其他接口时无法获取到该 session 值,即用户始终处于非登录状态。

解决方法

问题本质上是一个跨域问题,在后续的请求过程中请求头里都不带有登录时返回的 cookies,因此无法判别用户的正常登录状态。

若要在跨域情况下带上 cookies 值必须在 ajax 请求头中加上:

1
2
3
4
5
6
{
crossDomain: true,
xhrFields: {
withCredentials: true
}
}

在服务端中支持 cookies 跨域,我的服务端使用 PHP 编写:

1
header("Access-Control-Allow-Credentials: true");

因配置了 allow-credentials,无法将 allow-origin 设置为 *。若需要配置多个 allow-origin,可以参考《PHP 设置多个 Access-Control-Allow-Origin》

参考资料