用戶登陸優化網絡異常的處理

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章