【问题标题】:jQuery ajax handle 401 UnauthorizedjQuery ajax 处理 401 未经授权
【发布时间】:2016-05-07 23:04:22
【问题描述】:

我正在使用 jQuery ajax 调用第三方网页。根据他们的页面,如果登录成功,他们会向我发送状态代码 200,如果登录不成功,则会向我发送 401。这是我的 jquery 代码示例。此代码在 IE 上运行良好,但在 Chrome 或 Firefox 上无法运行。可能是什么问题?

$.ajax({
  type: 'GET',
  url: hostURL + 'j_teo_security_check?callback=?',
  dataType: 'json',
  data: ({j_username : $("#inp_user_name").val(), j_password: $("#inp_user_pwd").val()}),
  statusCode: {
      401:function() { alert("401"); },
      404:function() { alert("404"); },
      200:function() { alert("200"); },
      201:function() { alert("201"); },
      202:function() { alert("202"); }
    },
    complete: function(httpObj, textStatus){
    alert(httpObj.status);
  },
  error: function(){
    alert("error");
  },
  async: false
});

我尝试了所有函数error、success、complete和statusCode。他们都没有处理 401 错误。

【问题讨论】:

  • firebug 上的请求/响应是否正常?
  • 在 IE 和 Chrome (console.log 他们) 上发送的数据是什么?您没有多个 ID 为 inp_user_nameinp_user_pwd 的元素吗?尝试添加cache: false 选项。此外,您可以删除 data: ([...]) 行上的括号。另外,你有使用的 HTML 代码吗?那些“inp_user_xxx”是什么类型的元素?
  • 没有。一切正常,符合要求。当我通过正确的密码时,状态码 200 没有问题。当我发送错误的密码时,它会得到响应代码 401。我想在它是 401 时捕捉它。但没有一个函数支持它。我尝试了所有的函数error、success、complete和statusCode。我的要求是捕捉 401 错误。不要阻止它。
  • 尝试将您的请求类型从 GET 更改为 HEAD,并通过 console.log 返回结果以查看标头中实际设置的状态代码。不确定它是否相关,但也尝试在代码后添加一个空格,例如401: function() {},已经多次使用 statusCode 设置而没有问题,也适用于 401,这样应该可以工作,但不确定它是否适用于 json。是否是同源请求等。
  • 您收到警报了吗?错误:函数(xhr,状态,抛出错误){警报(xhr.status)}

标签: jquery ajax jquery-mobile


【解决方案1】:

我可以像下面这样修复它。

$(document).ready(function(){
        $("#cmdLogin").click(function(){             
             var request = $.ajax({
                url : hostURL + 'j_teo_security_check',
                data: ({j_username : $("#inp_user_name").val(), j_password: $("#inp_user_pwd").val()}),
                dataType : "jsonp",
                timeout : 5000
            });

            request.success(function() {
                loginSuccess();
            });

            request.error(function(httpObj, textStatus) {       
                if(httpObj.status==200)
                    loginSuccess();
                else
                    loginFail();
            });
        });
    })

我所做的是添加超时,因为 401 错误再也没有出现。由于即使状态码为 200 并解析错误,它也会进入错误函数,因此我让它忽略了错误中的状态 200。

【讨论】:

  • 也许这是解决方法,但在我的情况下删除 async:false 解决了问题。我可以看到你也删除了这个。它在问题中,但不在答案中。我不明白为什么 async: false 会产生这样的问题。我的代码已经存在多年,但由于 async: false 而决定突然停止工作
【解决方案2】:

好的,看来您正在使用 jsonp,我认为这可能是 jsonp 的限制。看看吧。

http://forum.jquery.com/topic/jquery-ajax-with-datatype-jsonp-will-not-use-error-callback-if-request-fails

貌似上个帖子有解决办法。希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2018-10-08
    • 2023-03-23
    • 2017-06-02
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多