2014-01-16 43 views
1

我制作了一个名为auth的过滤器,用于检查用户是否已登录。如果没有记录它在主页面上重定向,但如果是一个调用Ajax?我只是检查是否。如果是我只是发送一个JSON状态“无日志”。现在我的客户端收到了我的json响应“no-log”,并且我想为请求登录名和密码打开一个模式。我认为的解决方案很容易为每个ajax请求一个if语句来检查响应状态是否为“no-log”并显示模态函数。但是课程对未来的更新并不好,我正在寻找一个很好的解决方案,我可以绑定这个事件,如果我想在将来添加其他状态。任何建议?登录后会发生绑定事件

Route::filter('auth', function() 
{ 
    if (Auth::guest()) { 
     if (!Request::ajax()) { 
      Session::put('loginRedirect', Request::url()); 
      return Redirect::to('/'); 
     } else { 
      $status = "no-log"; 
      return json_encode(array('status' => $status)); 
     } 
    } 
}); 

如果返回所有没有的loggedIn请求401呼叫AJAX

$(document).on("click", ".delete", function() { // delete POST shared 
      var id_post = $(this); 
      bootbox.confirm("Are you sure do want delete?", function(result) { 
       if (result) { 
        $.ajax({ 
         type: "POST", 
         url: '/delete_post/' + USER, 
         data: { id_post: id_post.attr('id') }, 
         beforeSend: function(request) { 
          return request.setRequestHeader("X-CSRF-Token", $("meta[name='token']").attr('content')); 
         }, 
         success: function(response) { 
          if (response.status == "success") { 
           id_post.parents('div.shared_box').fadeOut(); 
          } 
         }, 
         error: function(){ 
          alert('error ajax'); 
         } 

        }); 

       } else { 
        console.log("close"); 
       } 
      }); 
     }); 
+0

为什么你说这不是一个好的解决方案,以供将来更新? – Fractaliste

+0

,因为我有更多的时间在我的应用程序上调用ajax,我应该将检查放在每个函数中?我希望有一些快速解决方案。 – Fabrizio

+0

我不知道Javascript中是否存在“过滤器”的概念。当然,如果你使用Ajax API,你可以重写它的一个回调函数。你可以在这里发布你的基本Ajax调用吗? – Fractaliste

回答

1

后探索的想法10天,我发现了一种覆盖 AJAX的行为举止:

它只是需要你通过一个自定义更换每$.ajax()

如果我重新使用您的代码:

$(document).on("click", ".delete", function() { // delete POST shared 
    var id_post = $(this); 
    bootbox.confirm("Are you sure do want delete?", function(result) { 
     if (result) { 
      myCustomAjax({ // In place of $.ajax({ 
       type: "POST", 
       ... 

然后这个自定义功能允许您之前或每次Ajax回调后,加一些动作:

例如检查,以JSON的返回值决定我是否触发成功回调,或者我会显示警告:

function myCustomAjax(options) {  
    var temporaryVariable = options.success; 

    options.success = function (data, textStatus, jqXHR) { 
     // Here you can check jqXHR.responseText which contain your JSON reponse. 
     // And do whatever you want 

     // If everithing is OK you can also decide to continue with the previous succeed callback 
     if (typeof temporaryVariable === 'function') 
      temporaryVariable(data, textStatus, jqXHR); 
    }; 
    return $.ajax(options); 
} 
+0

这个想法并不坏,说得有道理。我不明白如何调用myCustomajax()函数来代替'$ .ajax({'该函数不会调用ajax。 – Fabrizio

+0

@Fabrizio自定义函数的最后一行是调用ajax,I认为你没有看到它。 – Fractaliste

1

的例子,你可以用$.ajaxSetup来处理应用程序中的所有的Ajax错误。

$.ajaxSetup({ 
    error: function(jqXHR, exception) { 
    if (jqXHR.status == 401) { 
     window.location = 'your-login-page'; 
    } 
    } 
}); 
+0

我已经看了这个方法,但是如果我能找到一个响应json的解决方案会更有帮助。感谢您的帮助 – Fabrizio

+0

您不能在'$ .ajaxSetup()'和'$ .ajax()'中使用成功。 '.ajax()'会覆盖'$ .ajaxSetup()'。 – JackPoint

相关问题