Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Can';t通过ajax登录到https服务器_Javascript_Jquery - Fatal编程技术网

Javascript Can';t通过ajax登录到https服务器

Javascript Can';t通过ajax登录到https服务器,javascript,jquery,Javascript,Jquery,我目前正在使用jquery编写一个用户脚本,它在http网页上调用https请求以登录论坛。 但是现在我遇到了一个cookies问题:cookies不能通过ajax请求设置 这里有两幅图显示了传统登录和ajax登录的区别: 传统的: 发布用户名和密码并获取设置cookie 向服务器发送cookie以访问某些网页 Ajax one: 使用$.post()发布用户名和密码,并获取设置cookie 不向服务器发送cookie 在这里我发布了我的greasemonkey用户脚本: // ==User

我目前正在使用jquery编写一个用户脚本,它在http网页上调用https请求以登录论坛。 但是现在我遇到了一个cookies问题:cookies不能通过ajax请求设置

这里有两幅图显示了传统登录和ajax登录的区别:

传统的:

  • 发布用户名和密码并获取设置cookie
  • 向服务器发送cookie以访问某些网页
  • Ajax one:

  • 使用
    $.post()
    发布用户名和密码,并获取设置cookie
  • 不向服务器发送cookie
  • 在这里我发布了我的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'});
    

    有人能帮我吗?

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

    问题是,您不需要使用php设置cookie,也可以使用JavaScript设置cookie

    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");
        });
    
    如果这不起作用,也可能是您向fast发出第二个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'}); 
            });
    

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

    一些选择: -通过一个普通的表单按钮进行发布 -将jquery移动到https域(登录前需要https访问;这提供了安全的密码传输,但您必须单独阻止对https访问之外的内容的访问) -使用一些服务器端脚本来弥补这一差距。我发现它非常有用

    要诊断这个问题(检查我的假设是否正确),您可以使用Firefox内置的web控制台(我更喜欢FireBug),或者Chrome的可选开发者软件包

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

    另一个选项:。但请注意:当允许跨域时,注意不要为任何其他域打开后门


    希望这有帮助。

    @adriaan直接回答了这个问题,我给了他一分

    您不能通过AJAX实现这一点

    您可以尝试以下方法进行模拟:

    • 如果不支持postMessage浏览器,则通过https直接发布到登录页面,或使用iframe哈希更改轮询技术
    • 如果postMessage浏览器支持,那么您可以通过跨iframe的JavaScript本机支持跨域通信,这样您就可以将表单操作发布到iframe
    • 这可能是一个没有实际意义的问题,因为人们首先怀疑当前URL不是HTTPS
    我认为最好从客户信任的角度重新定向到HTTPS,以了解网站的安全性,就像在电子商务中强制使用HTTPS一样


    有关此示例,请参见KitGUI.com。

    是否可以包含用于设置cookies的代码。@Hristo好的,我发布脚本的主要部分。其余部分是关于事件绑定的,我认为它们不相关。@ManseUK我不使用js设置cookie,`因为我不认为jquery可以访问http网页上另一个https域的cookie。你能检查请求发出后cookie是否存在吗?@Rufus请尝试使用内置的忽略同源策略的cookie。仍然不能这样做,我想这与浏览器的策略有关。我会向mozilla寻求帮助。谢谢你,一个合理的答案终于出现了,我几乎放弃了希望。欢迎你,谢谢你的承认;在我看到曙光之前,我自己也经历过这场斗争(同一台机器上的不同端口也是跨域的)