2011-03-09 23 views
2

我正在向同一客戶端發送多個請求。 zend_Http_Client無法重定向,因爲我們的網站給予了JavaScript重定向。從那個JavaScript我得到了重定向網址,並再次調用客戶端,現在我得到訪問被拒絕。這是因爲我無法從第一個客戶端請求存儲會話。無法使用Zend_Http_Client存儲第二個客戶端請求的會話

我用下面的代碼..

$client = new Zend_Http_Client(
     $loginUrl, 
     array(
      'keepalive' => true, 
      'timeout' => 1000 
     ) 
    ); 
$response = $client->request()->getBody(); 
$redirectUrl = $this->_getResponseRedirectUrl($response); 

$client->resetParameters();   
$client->setUri($redirectUrl); 
$response = $client->request()->getBody(); 

$resultUrl = $this->_getResponseRedirectUrl($response); 

誰能告訴我如何在會話存儲第二請求。

回答

0

在嘗試以下步驟之前,請確保您的服務器身份驗證基於會話Cookie。

解決方案爲我:

您需要從第一養神Cookie添加到第二請求。在這種情況下,服務器將您的第二個請求視爲已驗證的請求。在登錄到站點後的響應中,您的Cookie將具有以下一組值,如Cookie名稱,Cookie值,到期日期,路徑,安全和HTTPOnly。從cookie字符串爆炸cookie的名稱和cookie的值

例會話Cookie登錄響應後:

"JSESSIONID=DQl3NKXXmy3yntp3NW2GMlcn8pLn9PR9rl0lnR6vbtfdVpyHWdnq!598502565; path=/" 
"CK_LanguageID_252085=1; expires=Friday, 23-Mar-2012 05:31:03 GMT; path=/; secure" 
"CK_TimeZone_252085=4; expires=Friday, 23-Mar-2012 05:31:03 GMT; path=/; secure" 

創建在下面的模式進行進一步服務器通信新cookie字符串:

"JSESSIONID=DQl3NKXXmy3yntp3NW2GMlcn8pLn9PR9rl0lnR6vbtfdVpyHWdnq!598502565; CK_LanguageID_252085=1; CK_TimeZone_252085=4" 

添加一個方便的方法從zend_http_client「Set-cookie」數組創建cookie字符串。

/** 
* Get clean cookie string with only name,value pair 
* This method filer all the follwoing cookie information 
* Expiration Date, Path, Secure and HTTPOnly 
* @access public 
* @param {Array} $cookies 
* @return {String} $cookieString 
*/ 
public function getCookieString(array $cookies){ 
    $cookieString = null; 
    foreach($cookies as $cookie){ 
     $part = explode(';',$cookie); 
     $cookieString = ($cookieString == null)? $part[0] : $cookieString . '; ' . $part[0]; 
    } 
    return $cookieString; 
} 

使用一個Zend_Http_Client使得連續請求:

//Login 
$client = new Zend_Http_Client($loginUrl); 
$response = $client->request(); 

//Get Header from response 
$headers = $response->getHeaders(); 
//Create second header 
$header = array("Cookie" => $this->getCookieString($headers["Set-cookie"])); 
$client->setHeaders($header); 

//Second request 
$client->setUri($redirectUrl); 
$response = $client->request(); 

在這裏,我刪除 「$客戶 - > resetParameters();」因爲您沒有使用「$ client-> setParameterGet()」設置任何GET參數(同樣也適用於POST)

如果使用「$ client-> setParameterGet()」或「$ client-> setParameterPost()」使用「$ client-> resetParameters();」在設置第二個uri之前。

$客戶機 - > resetParameters()接受布爾值:

  • FALSE:這是復位POST和僅GET PARAMS的默認值。
  • TRUE:重置所有參數,包括標題,上次請求和上次響應。
+0

感謝bstpierre格式化:) – Vijay 2011-03-24 19:06:40

0

實際上,Zend_Http_Client提供了一種非常簡單的方法來完成您所做的事情,無需在此重新發明輪子。

$client = new Zend_Http_Client(
     $loginUrl, 
     array(
      'keepalive' => true, 
      'timeout' => 1000 
     ) 
    ); 

// this is the magic line... 
$client->setCookieJar(); 

$response = $client->request()->getBody(); 
$redirectUrl = $this->_getResponseRedirectUrl($response); 

$client->resetParameters();   
$client->setUri($redirectUrl); 
$response = $client->request()->getBody(); 

$resultUrl = $this->_getResponseRedirectUrl($response); 

在這裏閱讀更多:http://framework.zend.com/manual/en/zend.http.cookies.html