Yii CGridView捕获Ajax响应并解决会话超时

时间:2014-03-04 09:59:17

标签: php jquery ajax session yii

我正在使用Yii MVC;

用户已登录;

我正在使用带有2个标签的浏览器;

从第二个标签中,我注销了用户,现在,用户也从第一个标签中被记录为oput;

现在,我正在尝试使用db中的ajax call查询gridview;

用户已注销,因此,我收到了302状态代码;

这是我想要捕获此错误的地方,并将用户重定向到登录页面,因为会话已过期;

在内部,Yii尝试将我重定向到login页面,但失败了;

我看到login操作带有200状态代码,但没有重定向;

我发现了一些有关此行为的信息,但它不起作用:

Using loginRequiredAjaxResponse to solve ajax session timeout

我尝试使用一个新的yii项目,因为我怀疑user module应该受到责备;

它不是用户模块,它的yii;

在框架中,在CAccessControlFilter中,调用以下函数;

如果会话已过期并刷新页面,我可以看到消息;

但是如果会话已经过期且我有一个ajax调用,则重定向不会发生;

protected function accessDenied($user,$message)
    {
        die(__FUNCTION__);
        debug_print_backtrace();
        if($user->getIsGuest())
            $user->loginRequired();
        else
            throw new CHttpException(403,$message);
    }

main.php文件中,在组件下 - >用户,我设置'loginRequiredAjaxResponse' => 'YII_LOGIN_REQUIRED',

1 个答案:

答案 0 :(得分:1)

http://www.yiiframework.com/wiki/321/using-loginrequiredajaxresponse-to-solve-ajax-session-timeout/

在模板或视图中输入此代码:

<?php
        /*
         * if ajax call and session has expired, then redirect to user/login
         */
        if (Yii::app()->components['user']->loginRequiredAjaxResponse) {
            Yii::app()->clientScript->registerScript('ajaxLoginRequired', '
            jQuery("body").ajaxComplete(
                function(event, request, options) {
                    if (request.responseText == "' . Yii::app()->components['user']->loginRequiredAjaxResponse . '") {
                        window.location.href = "'.Yii::app()->createUrl('/user/login').'";
                    }
                }
            );
        ');
        }
        ?>

在自定义成员控制器中,将其放在init方法

    if (Yii::app()->user->isGuest) {
        /*
         *  covers even the ajax requests if user session has expired
         */
        Yii::app()->user->loginRequired();
    }