使用requestAction从cake'Filter中渲染ajax布局

时间:2015-02-05 14:15:28

标签: php ajax cakephp

我有一个场景在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

1 个答案:

答案 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>

这很好用。但是我仍然对我的第一个解决方案无效的原因感兴趣。任何意见都欢迎..干杯