【问题标题】:Trouble with jquery ajax and safari when passing a username/password传递用户名/密码时 jquery ajax 和 safari 出现问题
【发布时间】:2011-03-30 15:51:55
【问题描述】:

我们正在尝试通过 jquery ajax 将凭据传递给我们的站点(不使用 php [是的,我知道这是不安全的])。

Safari 似乎在使用 ajax 方法的 username/password 属性时遇到问题。 (jquery ajax) 我们使用的是jquery 1.5.1

这里是示例代码:

$.ajax({
    url: "/some/url",
    type: 'GET',
    cache: true,
    dataType: 'json',
    processData: false,
    data: 'get=login',
    timeout: 7000,
    username: "user",
    password: "pass",
    success: function (data, textStatus, response) {
        Log("success");
    },
    error: function (data, textStatus, response) {
        Log("fail");
    }
});

这在 Firefox、Chrome 和 IE7/8 中运行良好,但 Safari 甚至不会将 ajax 发送到服务器(使用 wireshark 进行了跟踪,并且没有任何事情发生)。奇怪的是,error 函数被调用了。

如果我注释掉用户名和密码,则发送 ajax。

【问题讨论】:

    标签: jquery safari


    【解决方案1】:

    更简单:

    $.ajax({
        url: "/some/url",
        type: 'GET',
        cache: true,
        dataType: 'json',
        processData: false,
        data: 'get=login',
        timeout: 7000,
        headers: {
            "Authorization": "Basic " + Base64.encode("username:password")
        },
        success: function (data, textStatus, response) {
            Log("success");
        },
        error: function (data, textStatus, response) {
            Log("fail");
        }
    });
    

    这对我有用。

    问候

    【讨论】:

      【解决方案2】:

      我能够通过使用beforeSend 并创建请求标头来解决此问题。显然,如果这不包括在内,Safari 就会窒息并且不会发送任何内容。代码如下:

      $.ajax({
          url: "/some/url",
          type: 'GET',
          cache: true,
          dataType: 'json',
          processData: false,
          data: 'get=login',
          timeout: 7000,
          username: "user",
          password: "pass",
          beforeSend: function (req) {
              req.setRequestHeader('Authorization', "Basic " + btoa("user:password"));
          }
          success: function (data, textStatus, response) {
              Log("success");
          },
          error: function (data, textStatus, response) {
              Log("fail");
          }
      });
      

      【讨论】:

      • 这不起作用:您缺少对凭据和“基本”标签进行编码。 req.setRequestHeader('Authorization', "Basic " + btoa("username:password"));
      【解决方案3】:

      您是否看到当您单击包含用户名和密码的 URL 时 Safari 显示的反网络钓鱼警告?

      http://username:password@example.com/

      很可能是同一件事阻止了您的 AJAX 请求甚至被发送(因为它实际上不会加载站点,因此发送请求,直到您单击忽略按钮)。

      尝试在主浏览器中加载 AJAX 请求,单击“忽略警告”,然后再次尝试 AJAX 请求以查看是否触发。

      【讨论】:

      • 不,这不会发生。事实上,当我访问该站点和 firefox/chrome(也是 webkit)/ie 都可以使用我创建的 ajax 登录过程时,Firefox 会显示类似的消息
      • 您的示例代码与实际发生的代码有何不同?我制作了一个基本身份验证保护的 .json 文件,使用 jquery 1.5.1 可以使用上面的代码成功检索 Safari (v5.0.3) 中的内容。您正在检索纯 JSON,使用相同的域,而不是执行任何跨域 JSONP?
      【解决方案4】:

      我刚刚注意到在用户名或密码中添加“@”会导致您遇到相同的行为。 Safari 似乎对可以使用的字符很挑剔……

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-22
        • 2014-05-03
        • 1970-01-01
        • 2011-06-19
        • 1970-01-01
        相关资源
        最近更新 更多