在尝试以下步骤之前,请确保您的服务器身份验证基于会话 cookie。
解决方案对我有用:
您需要将第一个请求中的 cookie 添加到第二个请求中。在这种情况下,服务器将您的第二个请求视为经过身份验证的请求。在登录站点后的响应中,您的 cookie 将具有以下一组值,例如 cookie 名称、cookie 值、到期日期、路径、安全和 HTTPOnly。从 cookie 字符串中分解 cookie-name 和 cookie-value
登录响应后的示例会话 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();
在这里,我要删除“$client->resetParameters();” 因为您没有使用“$client->setParameterGet()”设置任何 GET 参数(对于 POST 也是如此)
如果使用“$client->setParameterGet()”或“$client->setParameterPost()”使用“$client->resetParameters();” 在设置第二个 uri 之前。
$client->resetParameters() 接受布尔值:
- FALSE :这是仅重置 POST 和 GET 参数的默认值。
- TRUE :重置所有参数,包括标头、最后一个请求和最后一个响应。