使用session配合前后端分离开发,在服务端记录session的方法
问题原因
传统实现用户登录一般采用session记录用户的登录信息,前后端分离后依然可以使用,不同的是传统形式一次成功登陆请求后,再点击其他页面时,session一直是存在的,在一定时间内是有效的;而前后端分离的方式请求一次成功登陆后,再次发送新的请求,则会产生新的session,为避免这个问题需要记录session的id,并在整个请求过程中都记录并传递这个id,才能保证session的一致性。
在看解决方式之前,您可能还需要在系统最开始,酌情添加如下ini_set:
// 只要在php页面的最开始(要在任何输出之前,并且在session_start()之前)的地方进行以下设置
ini_set('session.cookie_path', '/');
// 注意domain.com换成你自己的域名
ini_set('session.cookie_domain', '.wubin.work');
// 设置session在浏览器中的生存周期
ini_set('session.cookie_lifetime', '1800');
或者使用如下函数:
session_set_cookie_params(1800 , '/', '.wubin.work');
解决方式
比如,login.html向login-api.php发送验证登录的请求,且请求通过:
session_start();
$_SESSION['u_name'] = 'wubin.work';
$_SESSION['u_id'] = 55;
// 获取当前的session_id
$sid = session_id();
最终,返回的json:
{
code: 0,
msg: 登录成功
data: {
sid: xxxxxxxxxxxxxx
}
}
前端拿到sid后,存到sessionStorage或者其他存储器中.
在后续发送其他请求时,带着这个sid,在后台进行验证,看是否存在该记录,如果存在,那么证明已经登录。
比如,在Index.html中,发送请求logcheck-api.php验证是否已经登录。
$sid = @$_GET['sid'];
// 设置session_id 注意这个必须在session_start之前!
session_id($sid);
session_start();
if(isset($_SESSION['u_name']) &&
isset($_SESSION['u_id'])
) {
echo '用户已登录';
} else {
echo '用户未登录';
}