【问题标题】:Get rid of a 401 (unauthorized) ajax error in browser console摆脱浏览器控制台中的 401(未经授权)ajax 错误
【发布时间】:2012-12-29 13:28:38
【问题描述】:

我正在使用jQuery.ajax 调用通过javascript 调用api。如果用户未通过身份验证,api 会以 401 响应,我只想在此调用中忽略此错误。

我已经尝试了 jQuery 选项中描述的所有回调选项,但错误仍然会在浏览器控制台中弹出(在 Firefox 和 Chrome 中)。

这是一个触发错误的示例代码:

$.ajax({
    type: 'GET',
    url: '/url-with-auth',
    dataType: 'json',
    statusCode: {
        401: function (error) {
            // simply ignore this error
            console.log(error);
        }
    },
    complete: logall,
    error: function () {
        // simply ignore this error
        console.log(error);
    },
    async: false
}).fail(function () {
        // ignore the error and do nothing else
        console.log("$.get failed!");
    });

这也具有在受 .htaccess 文件保护的登台机器上再次请求用户凭据的副作用,因为浏览器认为用户未经过身份验证,因此在以下请求中,用户需要重新输入他的 http 凭据.

有什么办法可以完全忽略这个错误?

编辑

目前我有一个完全缓存应用程序端的 HTML 模板,出于性能原因,我想保留此行为。布局中唯一更改的部分是当前用户的登录信息,因此我使用未登录用户的默认标记呈现(缓存)页面,然后使用 jQuery 我将标记的相关元素替换为ajax 调用返回的登录信息。因此,如果用户没有登录并且 ajax 端点返回 401 我不需要任何东西,那么标记应该保持不变。

此时一切正常,唯一丑陋的是我在控制台中有 401 javascript 错误,我想摆脱它。

这是我正在谈论的消息的屏幕截图:

【问题讨论】:

  • @RachelGallen 已经这样做并尝试了那里的所有建议,处理程序已执行,但仍然显示错误。我想完全避免它,因为在这种情况下,脚本仅在用户登录时才添加一个 dom 元素,如果他不是,我想简单地忽略该调用。
  • 嗯嗯嗯,希望你早日找到答案。
  • 你能否提供更多关于你所期望的行为的细节。例如,当您说“忽略”时,您希望发生什么?
  • @MattRay 我已经用更多细节更新了这个问题。

标签: jquery http browser http-status-code-401


【解决方案1】:

我也遇到了这个问题,想在 JavaScript 控制台中抑制 HTTP 401 和 404 等错误的异常。我发现了这个问题,但不明白为什么 error() 和 statusCode() 处理程序没有消除异常,所以我自己研究了一下。

据我所知,这是浏览器中本机 ajax XMLHttpRequest 对象的问题,而不是 jQuery。为了证明这一点,我使用了以下测试代码:

function xhrTest(index) {
    var ajaxObjects = [
        $.ajaxSettings.xhr(), // what jquery returns
        new XMLHttpRequest()  // the native one in the browser
    ];
    var ajax = ajaxObjects[index];
    ajax.onreadystatechange = function() {console.log("xhrTest: state: " + ajax.readyState)};
    var errorHandler = function() {console.log("xhrTest: error");};
    ajax.onerror = errorHandler;
    ajax.onabort = errorHandler;
    ajax.open("GET", "/fileThatDoesNotExist", true);
    ajax.send();    
}

请注意,当使用绕过 jQuery 的 xhrTest(0) 或 xhrTest(1) 调用(我从 JavaScript 控制台执行此操作)时,结果是相同的:

【讨论】:

    【解决方案2】:

    你能在页面上添加一个隐藏字段吗(我猜它是动态生成的),比如:

    <input type="hidden" name="isLoggedIn" value="true" (or false) />
    

    然后在你的javascript中,放置

    if ($('input[name=isLoggedIn"]').val() == "true")
    {
         //your ajax call here
    } 
    

    【讨论】:

    • 坦率地说,我认为大多数用户不会关注控制台。我使用控制台的唯一原因是用于开发或网站行为怪异
    • 我知道如何编写条件代码 ;-) 主要要求是不要更改已登录用户的 html 以使模板完全可缓存。这段代码打破了这一要求。
    • 页面上是否有任何内容表明用户已登录?使用 jquery 代替 isLoggedIn 查找元素的值
    • 不,这就是整件事的目的。我想为登录和未登录的用户使用相同的标记。区别在于使用 ajax 处理服务器端。
    • 用户的身份验证状态可能会在页面生成和ajax调用之间发生变化。鉴于此,最好押注支持真实状态的机制。
    猜你喜欢
    • 2023-03-23
    • 2015-12-13
    • 2017-03-01
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多