2011-12-16 33 views
1

我目前正在使用jQuery,它会在http网页上调用https请求来登录论坛。 但现在我遇到了一个cookie问题:无法通过ajax请求设置cookie。无法通过ajax登录到https服务器

下面两幅图显示了传统的登录和Ajax登陆区别:

传统之一:

  1. 帖子的用户名和密码,得到的Set-Cookie
  2. 发送cookies到服务器来访问一些网页 traditional login

阿贾克斯之一:

  1. 使用$.post()发表用户名和密码,并得到的Set-Cookie
  2. 不发送的cookie服务器

ajax login

这里我发表我的Greasemonkey userscript:

// ==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'}); 

有人可以帮我吗?

+0

你有什么编码吗? – Hristo 2011-12-16 16:08:00

+0

你可以包括你使用的代码来设置Cookie .. – ManseUK 2011-12-16 16:08:03

+0

@Hristo好吧,我发布了我的脚本的主要部分。其余部分是关于事件绑定的,我不认为它们是相关的。 – Rufus 2011-12-16 16:14:23

回答

2

因为你的登录是在http:和你的网站发布到https :,你正在处理浏览器内部和jquery内置的跨网站脚本限制。在同一台服务器上使用jQuery来访问Web服务时,遇到了类似的问题,但使用了不同的端口(您也试图这么做)。

一些选项: - 通过正常的表单按钮 做后 - 移动jQuery来HTTPS域(这需要在登录之前HTTPS访问,这给安全密码传输,但你必须阻止访问内容与https访问分开) - 使用一些服务器端脚本来填补空白。我发现http://benalman.com/projects/php-simple-proxy/非常有用。为了诊断问题(检查我的假设是否正确),您可以使用内置于Firefox(我更喜欢FireBug)的Web控制台或Chrome的可选开发人员软件包。

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

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

希望这会有所帮助。

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'}); 
     }); 
1

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

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

你可以尝试以下操作来模拟:

  • 如果不是postMessage的浏览器的支持,然后通过HTTPS直接张贴到登录页面或使用iframe哈希变化轮询技术。
  • 如果postMessage浏览器支持,那么您可以跨iframe通过JavaScript本地支持跨域通信,因此您可以将表单操作发布到iframe。
  • 这可能是一个有争议的问题,因为人是犯罪嫌疑人目前的URL是不是HTTPS摆在首位

我认为这是最好的一个客户的信任水平重定向到HTTPS的网站的安全性的看法同样,HTTPS如何在电子商务中发生。

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