Laravel DataTables处理401 Unauthorized错误

时间:2017-12-04 19:36:19

标签: laravel datatables

我继承了一个使用Yajra DataTables在页面中显示网格内容的Laravel应用程序。

如果Laravel的会话到期,DataTable将抛出以下警告:

  

DataTables警告:table id = dataTableBuilder - Ajax错误。有关此错误的详细信息,请参阅http://datatables.net/tn/7

在Chrome中查看“网络”标签显示,DataTable的AJAX响应是401 Unauthorized。这是所有预期的行为,但我不想向用户显示任意错误,而是希望将用户发送到登录页面,并显示一条消息,说明"您的会话超时,请再次登录。 "什么的。

我无法弄清楚如何做到这一点。

传统的DataTables集成允许我将错误处理程序传递给AJAX响应(即{ajax: { error: function () {...} }}),但似乎没有办法用Laravel DataTables来做到这一点。

Laravel DataTables有一个html()方法,我可以这样覆盖:

public function html() {
    return $this->builder()
           ->ajax([
             error => ''
           ]);
}

但构建器上的ajax方法不允许我将JavaScript处理程序传递给error属性。

当会话超时时,无论如何都要完成强制登录吗?

2 个答案:

答案 0 :(得分:1)

鉴于上面的评论链,我的建议是在错误响应中添加一个唯一的字符串,如:

code: 401

然后,使用全局$.ajaxError来捕获错误,并根据响应文本执行不同的操作:

$( document ).ajaxError(function( event, jqxhr, settings, thrownError ) {
    if (typeof settings === "string" && settings.indexOf('401') > -1) {
        //you can probably do something here
    }
});

您甚至可以以更有效的方式执行此操作,因为401响应类型应该可以在4个属性中的一个中观察到(不记得哪个)

答案 1 :(得分:0)

对DataTables更具体的选项(不需要全局覆盖)是使用$.fn.dataTable.ext.errMode的函数

    $.fn.dataTable.ext.errMode = function (settings, tn, msg) {
      if (settings && settings.jqXHR && settings.jqXHR.status == 401) {
         // Handling for 401 specifically
      }
      // Handling for all other errors, this implements the DataTables default 
      // behavior of throwing an alert
      alert(msg)
    };