我正在使用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',
答案 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();
}