无法通过ajax登录https服务器

时间:2011-12-16 16:05:38

标签: javascript jquery

我目前正在处理一个带有jquery的用户脚本,它在http网页上调用https请求来登录论坛。 但现在我遇到了一个cookie问题:无法通过ajax请求设置cookie。

这里有两张图片显示了传统登录和ajax登录之间的区别:

传统的一个:

  1. 发布用户名和密码并获取set-cookie
  2. 将Cookie发送到服务器以访问某些网页 traditional login
  3. Ajax one:

    1. 使用$.post()发布用户名和密码,然后获取set-cookie
    2. 不向服务器发送Cookie
    3. ajax login

      在这里,我发布了我的greasemonkey用户名:

      // ==UserScript==
      // @name           test
      // @namespace      test
      // @description    test
      // @include        http://solidot.org/*
      // @require        http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js
      // ==/UserScript==
      //after events dealing and blahblahblah
      $.post('https://bbs6.sjtu.edu.cn/bbslogin',{id:'some',pw:'password'});
      $.post('https://bbs6.sjtu.edu.cn/bbssnd',{board:'SJTUNews',title:'some',text:'article'});
      

      有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:2)

因为您的登录位于http:并且您要发布的网站位于https:,您正在处理浏览器和jquery中内置的跨站点脚本限制。在将jquery用于同一服务器上的Web服务时,我遇到了类似的问题,但是不同的端口(您也尝试这样做)。

一些选择: - 通过普通表格按钮发帖 - 将jquery移动到https域(在登录之前需要https访问;这会提供安全的密码传输,但是您必须分别阻止访问内容与https访问) - 使用一些服务器端脚本来弥补差距。我发现http://benalman.com/projects/php-simple-proxy/非常有用。

要诊断问题(检查我的假设是否正确),您可以使用Firefox内置的Web控制台(我更喜欢FireBug)或Chrome的可选开发人员包。

看看控制台;检查post命令。请注意您的帖子将要访问的域/端口。我希望从帖子中删除域/端口信息。

另一种选择:Cross domain with jQuery。但请注意:当允许跨域时,请注意不要为任何其他域打开后门!

希望这有帮助。

答案 1 :(得分:1)

@adriaan直接回答了这个问题,我给了他一点意见。

你不能通过AJAX做到这一点。

您可以尝试以下方法来模拟:

  • 如果不是postMessage浏览器支持,则通过https直接发布到登录页面或使用iframe hash change polling技术。
  • 如果postMessage浏览器支持,那么您可以通过iframe中的JavaScript本地支持跨域通信,这样您就可以将表单操作发布到iframe。
  • 这可能是一个没有实际意义的点,因为人们怀疑当前的网址首先不是HTTPS

我认为最好从客户信任级别重定向到HTTPS对网站安全性的感知,类似于在外部电子商务中强制使用HTTPS。

请参阅KitGUI.com以获取此示例。

答案 2 :(得分:0)

我不知道为什么会这样,但我想我知道如何解决。

问题是你不需要用php设置cookie,你也可以用JavaScript设置它。

var login = $.post('https://bbs6.sjtu.edu.cn/bbslogin', {id: 'some', pw: 'password'})
    .success(function() {
        if (login.getResponseHeader("Set-Cookie") != null)
            /**
             * Normally this returns a string but if not just do it with each value of the array
             */
            document.cookie = login.getResponseHeader("Set-Cookie");
        else
            alert("Login failed");
    })
    .error(function() {
            alert("Login failed");
    });

如果这不起作用,也可能是你快速发出第二个ajax请求,所以尝试将其更改为:

$.post('https://bbs6.sjtu.edu.cn/bbslogin', {id: 'some', pw: 'password'})
        .success(function() {
                $.post('https://bbs6.sjtu.edu.cn/bbssnd', board:'SJTUNews',title:'some',text:'article'}); 
        });
相关问题