2

我正在向同一个客户端发送多个请求。zend_Http_Client 无法重定向,因为我们的网站提供了 javascript 重定向。从那个javascript我得到重定向url并再次调用客户端,现在我被拒绝访问。这是因为我无法存储来自第一个客户端请求的会话。

我正在使用以下代码..

$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);

谁能告诉我如何为第二个请求存储会话。

4

2 回答 2

0

在尝试以下步骤之前,请确保您的服务器身份验证基于会话 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 :重置所有参数,包括标头、最后一个请求和最后一个响应。
于 2011-03-24T09:15:19.197 回答
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

于 2011-05-05T20:49:10.033 回答