【问题标题】:How to transfer SESSION created in soap server to soap client code?如何将肥皂服务器中创建的会话传输到肥皂客户端代码?
【发布时间】:2019-08-12 10:29:26
【问题描述】:

我已经使用 PHP 创建了一个非 wsdl SOAP 服务器来运行我拥有的所有服务器的功能。从我的个人资料中可以看出,这方面存在很多问题,但我希望这是可以解决的。我无法在服务器和客户端之间传输 SESSION 数据。

已经用过了

$server->setPersistence(SOAP_PERSISTENCE_SESSION);

并手动设置 session_id

session_id ('ID');
session_start ();

但没有运气将 SESSION 数据传输到客户端。

有没有办法将soap-server.php上创建的SESSION数据传输到soap-client.php?

【问题讨论】:

  • 看看stackoverflow.com/questions/13732307/…是否有任何关于如何访问cookie数据的提示我可以看到php.net/manual/en/soapclient.setcookie.php也存在stackoverflow.com/questions/13388613/…
  • 我已经阅读了这些内容,但如果我没记错的话,__setCookie 可以在客户端工作。我需要将在 server.php 上创建的 SESSION 数据传输到 client.php,我做错了我想是因为我还有很多其他问题,比如these
  • 我没有办法对此进行测试,但我假设客户端使用$SoapClient->_cookies 从服务器响应中读取,然后使用$client->__setCookie() 在后续请求中设置cookies服务器
  • 您必须将 $client 视为一个忘记了 cookie 的浏览器,它会在客户端的生命周期内记住 cookie,但一旦您的脚本终止,它就会忘记它们。

标签: php session soap soap-client soapserver


【解决方案1】:

鉴于此肥皂服务器

class MyClass
{
  public function __construct(){
    session_start();
  }
  public function login( $user )
  {
    $_SESSION['user'] = $user;
    return true;
  }
  public function getUserName()
  {
    return isset( $_SESSION['user'] ) ? $_SESSION['user'] : false;
  }
}
$server = new SoapServer( null, array( 'uri' => 'http://localhost/scratch/soap.server.php' ) );
$server->setClass('MyClass');
$server->handle();

还有这个肥皂客户端

$url = 'http://localhost/scratch/soap.server.php';
$config = array( 'location' => $url, 'uri' => $url );

// Call the "login" function to set the user name
$firstClient = new SoapClient(null, $config);
$firstClient->login( array( 'MyUserName' ) ); // ONLY CALL LOGIN ONCE
var_dump( $firstClient->getUserName() ); // TRUE

// Track the cookies
$cookies = $firstClient->__getCookies();

// Second Client fails because we didn't set cookies
$secondClient = new SoapClient(null, $config);
var_dump( $secondClient->getUserName() ); // FALSE

// Works because we've set cookies from the first request
$thirdClient = new SoapClient(null, $config );
$thirdClient->__setCookie( 'PHPSESSID', $cookies['PHPSESSID'][0] );
var_dump( $thirdClient->getUserName() ); // TRUE
  1. 你可以看到我正在创建三个单独的soap客户端,第一个执行登录,你可以看到随后的getUserName()工作,因为我们使用相同的连接上下文并且它在内部重新使用初始cookie。
  2. 第二个客户端是独立的,不知道现有会话,并按预期失败。
  3. 第三个客户端从第一个客户端注入 cookie,并且能够通过会话跟踪用户名,getUserName() 能够在没有 login() 函数的情况下恢复。

理想情况下,您应该以编程方式自动注入 cookie,而不是出于本次测试的目的而使用我的“硬编码”

所以从这里开始,您必须自己管理soap客户端的cookies。


如果您想要会话数据本身,没有什么可以阻止您创建导出函数...例如,在此示例中为 getSessionData

class MyServerClass
{
  public function __construct(){
    session_start();
  }
  public function login( $user )
  {
    $_SESSION['user'] = $user;
    $_SESSION['SomeObject'] = new stdClass();
    $_SESSION['SomeObject']->foo = 'bar';
    return true;
  }
  public function getSessionData()
  {
    return $_SESSION;
  }
}

【讨论】:

  • 感谢您的宝贵时间,非常感谢。但这不是 __setCookie 重置了在 client.php 中实际创建的 cookie 吗?还是每次连接时都应该使用它?您能否检查一下我已经问过的其他 2 个肥皂问题,以便更好地理解我的问题?我可能无法说出我的问题是因为我缺乏语言能力...question 1question 2
  • 这取决于您的应用程序设计如何存储soap cookie。在生成 $client 的脚本中,您可以将它们存储在会话中,甚至可以将它们存储在传递给用户浏览器的 cookie 中。请记住,在使用 API 时,我们有两层深度,浏览器 cookie 和肥皂 cookie 目前是分开的,直到您对它们进行操作。
  • 这样想,如果你想为你的用户创建一个presitant状态,由你决定如何存储$cookies,因为现在我不知道你实际上是怎样的在您的应用程序中使用 SOAP。
猜你喜欢
  • 1970-01-01
  • 2019-01-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2018-04-27
  • 1970-01-01
相关资源
最近更新 更多