用户登陆的详细过程见此文:http://blog.csdn.net/looksunli/article/details/9799395
开发过程中,发现这样的一个问题:
重现做法:用户双开浏览器两个页面,一个用于登陆游戏,一个用于注册游戏。首先用户注册,注册成功后,再在另一个页面登陆。结果是登陆不成功。理解这个做法,需要明白的如下几点:
1)登陆使用ajax请求。
// 登陆按钮
$("#btn_login").h().on(__clickEvent, function() {
var btnObj = this;
var email = $.trim($('#email').val());
var password = $.trim($('#password').val());
$(btnObj).disabled();
$._getJSON('/auth/login', {
"email" : email,
"password" : password,
"submit" : 'yes'
}, function (resp) {
// 错误处理
// 登入成功
location.href = '/main/?is_login=1&' + vClient.getMobileParams();
});
});
2)用户注册成功后,可以获取到用户的基本信息,保存在userIndex数组中,但是用户还没有初始化,即选择游戏角色,游戏名。正常情况下,应该是跳转到用户初始化界面选择角色和游戏名。
// 错误提示
if (resp.status == 'error') {
} else {
// 注册成功
location.href = '/user/initialize/?is_login=1&' + vClient.getMobileParams();
}
3)父类控制器中,当检测到用户没有初始化的时候,页面需要跳转角色初始化页面
// 如果已登录
if ($this->_userIndex) {
// 获取当前用户 uid
$this->_uid = $this->_userIndex['id'];
// 实例化一个玩家实例
$this->_user = new Model_User($this->_uid);
// 角色创建
if (! $this->_user['initialized']
&& ! $this->isBaseUri('/user/initialize')
&& ! $this->isBaseUri('/user/ajaxgenname')
) {
$this->vRedirect('/user/initialize');
}
这个时候问题就来了:当用户在第一个浏览器页面注册成功但没有初始化,然后在另一个浏览器页面用另一个用户登陆,此时,浏览器已经记录了第一个用户的信息(cookie记录),即判断第一个用户成功,但第一个用户未初始化,即跳转到/user/initiize页面中。问题就出现在这里,因为登陆的时候 使用ajax请求,页面并不会跳转。
这个就是模拟网络异常,注册成功后没有初始化角色,然后再登陆这个账号时却无法登陆成功。
解决方法:
public function vRedirect($url)
{
if ($this->isAjax()) {
throws('AjaxJump::' . $url);
}
// 清除防刷间隔
Plugin_AntiRefresh::clearReqInterval($this->_request);
$this->redirect($url);
exit();
}
如果检测到执行跳转函数的请求时ajax请求,则抛出一个异常,然后在页面中处理这个异常,实现跳转:
// 错误提示
if (resp.status == 'error') {
// 跳转URL
if (resp.msg.indexOf('AjaxJump::') != -1) {
location.href = resp.msg.replace('AjaxJump::', '');
}
}
还有一些其他的异常需要捕捉处理:
1)登录过程断网。
2)登陆超时。