Не удалось сохранить сеанс для второго клиентского запроса с использованием Zend_Http_Client - PullRequest
2 голосов
/ 09 марта 2011

Я отправляю несколько запросов одному клиенту. 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);

Может кто-нибудь сказать мне, как сохранить сеанс для второго запроса.

Ответы [ 2 ]

0 голосов
/ 06 мая 2011

Actuall, 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

0 голосов
/ 24 марта 2011

Прежде чем пытаться выполнить следующие шаги, убедитесь, что аутентификация вашего сервера основана на сеансовых куки.

Решение сработало для меня:

Вам необходимо добавить куки из первого представления во второй запрос. В этом случае сервер рассматривает ваш второй запрос как аутентифицированный. В ответе после входа на сайт ваш cookie будет иметь следующий набор значений, таких как cookie-name, cookie-value, Expiration Date, Path, Secure и HTTPOnly. Из строки cookie взрываются cookie-name и cookie-value

Пример Session 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"

Добавление удобного метода для создания строки cookie из массива zend_http_client "Set-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 ();" потому что вы не устанавливаете какие-либо GET-параметры, используя "$ client-> setParameterGet ()" (тоже самое для POST)

Если вы используете "$ client-> setParameterGet ()" или "$ client-> setParameterPost ()", используйте "$ client-> resetParameters ();" перед установкой второго URI.

$ client-> resetParameters () принимает логические значения:

  • FALSE: это значение по умолчанию, которое сбрасывает только параметры POST и GET.
  • TRUE: сброс всех параметров, включая заголовки, последний запрос и последний ответ.
...