用户登陆优化网络异常的处理

用户登陆的详细过程见此文: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)登陆超时。


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