当前位置: 首页 > 面试题库 >

Java轴Web服务客户端setMaintainSession在多个服务上(Cookie?)

花阳秋
2023-03-14
问题内容

我正在实现Web服务的客户端(维护Web服务的家伙反应迟钝。。)我使用axis和WSDL2Java生成Java类,并且可以在身份验证服务上调用其登录方法好的,然后获取sessionId(例如z4zojhiqkw40lj55kgtn1oya)。但是,似乎我无法在任何地方将此sessionId用作参数。甚至在登录后直接调用其hasSession()方法也会返回false。我设法通过在此服务的Locator-
object上设置setMaintainSession(true)来解决此问题。但是问题在于,第一个服务Authentication-
service仅用于身份验证。如果随后在例如ProductServiceLocator上调用setMaintainSession(true),并对其调用某些方法,则由于会话未经身份验证,我将收到错误消息。我必须找到一种在客户端的服务之间共享会话的方法。查看他们的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->LoginResult;
    // 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!

那我该怎么做才能使这项工作呢?


问题答案:

Hooray,我终于自己解决了它:-D非常
感谢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会公开更多可以设置的方法和属性。很高兴知道以后我猜:-)



 类似资料:
  • 问题内容: 我有stfw,但是找不到在Java中创建Web服务客户端的简单/独立方法。 有人在此链接/示例吗? 问题答案: 使用Axis2怎么样? 只需按照快速入门指南进行操作,就可以轻松应对。 这是另一个更具描述性的指南

  • 我是web服务编程新手,我想使用netbeans 6在Grizzly服务器上使用Jersey创建一个restful web服务,然后创建一个客户端javascript,以便通过浏览器使用该web服务。因此,我开始了解更多关于restful web服务的知识,并在网上阅读了大量指南,然后通过阅读jersey用户指南http://jersey . Java . net/nonav/documentat

  • 我想在一些计算机之间建立点对点连接,这样用户就可以在没有外部服务器的情况下聊天和交换文件。我最初的想法如下: 我在服务器上制作了一个中央服务器插座,所有应用程序都可以连接到该插座。此ServerSocket跟踪已连接的套接字(客户端),并将新连接的客户端的IP和端口提供给所有其他客户端。每个客户端都会创建一个新的ServerSocket,所有客户端都可以连接到它。 换句话说:每个客户端都有一个Se

  • 问题内容: 在wsdl上使用wsimport创建了Java Web服务客户端之后,我需要为嵌入在HTTP请求中的每个肥皂消息设置Authorization标头。生成了javax.xml.ws.Service的子类后,如何将HTTP标头附加到每个传出请求中? 问题答案: 您可以将带有自定义标头的映射传递给BindingProvider(我相信您可以设置MessageContext.HTTP_REQU

  • 问题内容: 我有X.509证书保护的远程Web服务。 我生成了Web服务客户端的内容(使用jax-ws),但是需要配置是否用于证书的用途。 我应该如何进行? 我想我应该在本地信任的密钥库中注册证书,并且它们设置如下所示: 但是尚不清楚应提供哪些数据作为参数。 请帮忙。 谢谢。 问题答案: 密钥库属性定义用于向服务器标识您的证书: 这是带有x509证书的Java密钥库。您可以使用Java程序keyt

  • 问题内容: 我正在使用RMI编写密码系统的原型。 我有一个问题,因为当我启动两个客户端时,它们从OneTimePad类的服务器中的一个对象获得了响应。 因此客户端A获取为客户端b保留的密钥,由于特定的算法,这种情况不会发生。 服务器仅向客户端发送E和N变量(例如在RSA中),因此我无法序列化OneTimePad对象并通过网络发送它(因为它将具有所有密钥)。 如何为每个客户端创建OneTimePad