клиент веб-службы java axis устанавливает сеансовую поддержку для нескольких сервисов (файлов cookie?)

#java #web-services #cookies #axis

#java #веб-сервисы #файлы cookie #ось

Вопрос:

Я внедряю клиент в веб-службу (и ребята, поддерживающие веб-службу, немного не отвечают ..) Я использовал axis и WSDL2Java для создания классов Java, и я могу вызвать их метод входа в систему в их службе аутентификации ok и получить обратно идентификатор сеанса (например, z4zojhiqkw40lj55kgtn1oya). Однако, похоже, я нигде не могу использовать этот идентификатор сеанса в качестве параметра. Даже вызов их метода hasSession() непосредственно после входа в систему возвращал false. Мне удалось решить эту проблему, установив setMaintainSession(true) для объекта-локатора для этой службы. Но проблема в том, что эта первая служба, служба аутентификации, используется только для аутентификации. Если я затем вызову setMaintainSession(true), например, для ProductServiceLocator, и вызову для него какой-либо метод, я получу сообщение об ошибке из-за не прошедшего проверку подлинности сеанса. Я должен найти способ разделить сеанс между службами на стороне клиента. Глядя на их пример кода php — он видит их так, как будто они хранят сеанс в файле cookie. Как я могу имитировать это поведение в моем java-клиенте? php-код:

 $authentication = new SoapClient ( "https://webservices.24sevenoffice.com/authenticate/authenticate.asmx?wsdl", $options );
// log into 24SevenOffice if we don't have any active session. No point doing this more than once.
$login = true;
if (!empty($_SESSION['ASP.NET_SessionId'])){
    $authentication->__setCookie("ASP.NET_SessionId", $_SESSION['ASP.NET_SessionId']);
    try{
        $login = !($authentication->HasSession()->HasSessionResult);
    }
    catch ( SoapFault $fault ) {
        $login = true;
    }
}
if( $login ){
    $result = ($temp = $authentication->Login($params));
    // set the session id for next time we call this page
    $_SESSION['ASP.NET_SessionId'] = $result->LoginResu<
    // each seperate webservice need the cookie set
    $authentication->__setCookie("ASP.NET_SessionId", $_SESSION['ASP.NET_SessionId']);
    // throw an error if the login is unsuccessful
    if($authentication->HasSession()->HasSessionResult == false)
        throw new SoapFault("0", "Invalid credential information.");
}
  

Мой код следующий:

 AuthenticateLocator al = new AuthenticateLocator();
al.setMaintainSession(true);
Credential c = new Credential(CredentialType.Community,username,password,guid);
AuthenticateSoap s = al.getAuthenticateSoap();
String sessionId = s.login(c);
System.out.println("Session id was: " sessionId);
System.out.println("Has Session: " s.hasSession()); //Hooray, now works after setMaintainSession(true)
//And now trying to call another Service
CompanyServiceLocator cl = new CompanyServiceLocator();
cl.setMaintainSession(true);
CompanyServiceSoap css = cl.getCompanyServiceSoap();
css.getCountryList(); //FAILS!
  

Итак, что я могу сделать, чтобы это сработало?

Ответ №1:

Ура, я наконец-то решил это сам: -Большое спасибо за отличную статью на http://www.nsftools.com/stubby/ApacheAxisClientTips.htm Я должен был сделать следующее с моим кодом, чтобы заставить его работать:

 CompanyServiceLocator cl = new CompanyServiceLocator();
cl.setMaintainSession(true);
CompanyServiceSoap css = cl.getCompanyServiceSoap();
((Stub)css)._setProperty(HTTPConstants.HEADER_COOKIE, "ASP.NET_SessionId=" sessionId); //New line that does the magic
css.getCountryList(); //SUCCESS :-D
  

Работая в высокоуровневой абстракции автоматически созданных классов, мне было неизвестно, что приведение классов служб к Stub предоставит больше методов и свойств, которые можно было бы установить. Думаю, полезно знать на потом 🙂