2011-12-16 79 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。