2013-07-06 42 views
2

我正在開發一個項目,以在我的路由器管理頁面中自動登錄......但它在源代碼中使用了Cookie。當我做一個GET與我的網頁瀏覽器(Chrome),我得到這個:INDY - 我真的需要cookies嗎?

GET http://192.168.1.1/ HTTP/1.1 
Host: 192.168.1.1 
Proxy-Connection: keep-alive 
Cache-Control: max-age=0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4 
Cookie: FirstMenu=Admin_0; SecondMenu=Admin_0_0; ThirdMenu=Admin_0_0_0; Language=en 

當我正在做一個GET與印第安納波利斯的結果是:

GET http://192.168.1.1/ HTTP/1.1 
Host: 192.168.1.1 
Accept: text/html, */* 
Accept-Encoding: identity 
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV2) 

好吧,我想登錄在URL中以與HTML表單相同的方式進行POST,傳遞相同的參數,但是結果是,我得到一個頁面,說'未知錯誤'... 這是我在Chrome瀏覽器中進行POST時:

POST http://192.168.1.1/index/login.cgi HTTP/1.1 
Host: 192.168.1.1 
Proxy-Connection: keep-alive 
Content-Length: 34 
Cache-Control: max-age=0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Origin: http://192.168.1.1 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36 
Content-Type: application/x-www-form-urlencoded 
Referer: http://192.168.1.1/ 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4 
Cookie: SessionID_R3=479900075; FirstMenu=Admin_0; SecondMenu=Admin_0_0; ThirdMenu=Admin_0_0_0; Language=en 

Username=admin&Password=YWRtaW4%3D 

這是後在我的項目與印:

POST http://192.168.1.1/index/login.cgi HTTP/1.0 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 36 
Proxy-Connection: keep-alive 
Host: 192.168.1.1 
Accept: text/html, */* 
Accept-Encoding: identity 
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV2) 

Username=admin&Password=YWRtaW4%3D 

好吧,我幾乎可以肯定,我越來越因爲餅乾的這個「未知錯誤」。但他們真的需要在這裏?我將如何設置它們?我嘗試使用Cookie管理器,但沒有成功,我在Delphi 2010中,不知道Indy的Cookies Manager是否在此版本中正常工作。這裏是我的項目的代碼:

http := TIDHttp.Create(nil); 
    PostData:= TStringList.Create; 
    AnswerData:= TStringStream.Create(''); 
    http.ReadTimeout := 5000; 
    http.Request.UserAgent:='Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV2)'; 
    http.ProxyParams.ProxyServer:= '127.0.0.1'; 
    http.ProxyParams.ProxyPort:= 8080; 
    PostData.Text:= 'Username=admin&Password=YWRtaW4='; 
    try 
    http.Post('http://192.168.1.1/index/login.cgi', PostData, AnswerData); 
    except 
    on E: EIdHTTPProtocolException do 
     begin 
     HttpCode:= HTTP.ResponseCode; 
     HttpHeader:= HTTP.Response.RawHeaders.Values['Server']; 
     end; 
    end; 
    Memo1.Lines.Add(AnswerData.DataString); 
end; 

回答

1

在這種情況下,我剛剛創建了一個'假'餅乾,只是在瀏覽器中傳入了相同的參數。路由器頁面使用javascript cookies,因此Indy無法使用它們,我需要必要時手動添加它們。但是對於我的工作過程是這樣:

http.Request.CustomHeaders.Text:= 'Cookie: FirstMenu=Admin_0; SecondMenu=Admin_0_0; ThirdMenu=Admin_0_0_0; Language=en'; 

我只是把餅乾作爲標題,其實我沒有cookie管理器,只有這個假頭......對我來說,它解決了。

1

網絡瀏覽器的請求包括您以前收到的cookie,您顯然還沒有收到。您需要從Web瀏覽器開始接收Cookie的相同起始頁開始。另外,因爲您發送多個請求,所以您需要確保每次都重新使用相同的TIdCookieManager實例,以便在請求之間持續存在Cookie。如果您沒有將TIdCookieManager分配給TIdHTTP.CookieManager屬性,則TIdHTTP會在內部創建一個,因此您需要爲每個請求重新使用相同的TIdHTTP,或者需要創建一個TIdCookieManager,並將其分配給您創建的每個TIdHTTP 。