#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 предоставит больше методов и свойств, которые можно было бы установить. Думаю, полезно знать на потом 🙂