我目前正在处理一个带有jquery的用户脚本,它在http网页上调用https请求来登录论坛。 但现在我遇到了一个cookie问题:无法通过ajax请求设置cookie。
这里有两张图片显示了传统登录和ajax登录之间的区别:
传统的一个:
Ajax one:
$.post()
发布用户名和密码,然后获取set-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'});
有人可以帮帮我吗?
答案 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做到这一点。
您可以尝试以下方法来模拟:
我认为最好从客户信任级别重定向到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'});
});