用戶登陸的詳細過程見此文: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)登陸超時。