繁体   English   中英

无法通过Ajax登录到https服务器

[英]Can't login to https sever via ajax

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

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

传统的:

  1. 发布用户名和密码并获取set-cookie
  2. 将cookie发送到服务器以访问某些网页 传统登录

Ajax一:

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

Ajax登录

在这里,我发布了我的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'});

有人可以帮帮我吗?

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

一些选项:-通过常规形式的按钮进行发布-将jquery移至https域(登录前需要https访问;这提供了安全的密码传输,但是您必须将访问内容与https访问分开来进行阻止) -使用一些服务器端脚本弥合差距。 我发现http://benalman.com/projects/php-simple-proxy/非常有用。

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

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

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

希望这可以帮助。

@adriaan直接回答了这个问题,我对此给予了要点。

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

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

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

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

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

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

事实是,您不需要使用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'}); 
        });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM