我有一个场景在AppController的beforeFilter中,我有一个会话检查方法,它检查是否设置了一些会话数据。如果不是,则将用户重定向到登录页面。
这适用于服务器端动作调用,但是当进行ajax调用时,beforeFilter似乎忽略了requestAction ..这里是我的代码
AppController beforeFilter
public function beforeFilter(){
if($this->RequestHandler->isAjax()) {
echo $this->requestAction("/users/ajax_login", array('return'));
}else{
$this->redirect('/login');
}
}
ajax_login action
function ajax_login() {
$this->render('ajax_login', 'ajax');
}
ajax_login view
<script type="text/javascript">
window.location = '<?php echo 'http://'.$_SERVER['HTTP_HOST'].$html->url('/login').'"'; ?>';
</script>;
基本上这应该呈现ajax布局。但是,视图未呈现,因此重定向不起作用。
当然我收到错误,因为通过ajax调用的操作仍然被调用,由于会话到期而触发错误net::ERR_CONNECTION_RESET
。
答案 0 :(得分:0)
我找到了另一种有效的解决方案。这是代码:
class AppController extends Controller {
var $components = array('Auth', 'RequestHandler');
function beforeFilter() {
if($this->RequestHandler->isAjax()) {
if(!$this->Session->check('data')) {
header('Requires-Auth: 1'); // set header and make sure to exit
exit;
}
}
}
}
然后只有一个jquery(acaxComplete)事件监听器来检查标头,如果它设置为1,则重定向到登录页面。
<script>
$(document).ready(function() {
$(document).ajaxComplete(function(event, request, settings){
var requiresAuth;
try { requiresAuth = request.getResponseHeader('Requires-Auth') }
catch(e) {}
if (requiresAuth == 1) {
window.location = "<?php echo $this->Html->url(array('controller' => 'users', 'action' => 'login')); ?>";
return false;
}
});
});
</script>
这很好用。但是我仍然对我的第一个解决方案无效的原因感兴趣。任何意见都欢迎..干杯