全部,
抱歉 - 这可能是一个非常奇怪的问题。
我正在研究 Flash RIA。它所做的其中一件事是调用一个 ASP 页面(位于另一个域中)来检索一些数据。
但是,该 ASP 页面要求用户在允许调用该 ASP 页面之前登录到该站点。
所以,我第一次尝试让这个在 Flash 应用程序中工作是使用 loadVars.sendAndLoad() 将登录变量发布到登录页面。这会设置 cookie/会话变量来建立我的“登录”状态。然后,稍后,当 Flash 应用程序调用 ASP 页面来请求它需要的数据时,一切正常。换句话说,对第一页的 loadVars.sendAndLoad 调用让我登录,并且保持登录状态(不知何故),因此当 Flash 应用程序稍后调用 ASP 页面时,ASP 页面认为我仍然登录在。
一个很好的解决方案,除了现在 Flash 应用程序将部署在另一个域上。换句话说,ASP 页面(和登录页面)在 domainA.com 上,但 Flash 应用程序将在 domainB.com 上。而且 Flash 应用程序不能调用不同域上的 URL(我知道跨域策略文件,但由于各种原因,这不是一个选项)。
所以,我的下一个想法是——在 domainB.com 上设置一个 PHP 页面,它使用 cURL 将登录变量传递给登录页面。在 domainB.com 上设置另一个 PHP 页面,该页面使用 cURL 调用 ASP 页面。
然后,我可以将我的 Flash 应用程序设置为调用那些充当“代理”的 PHP 页面。
但是,这不起作用。当我调用第一个 PHP 页面(将变量传递到 domainA.com 上的登录页面)时,我认为这是可行的。但是,如果我随后调用第二个 PHP 页面,domainA.com 上的 ASP 页面会拒绝该请求,就好像我没有登录一样。
换句话说,当我用 Flash 运行所有内容时 - 似乎从第一个请求到后续请求都保持“登录”状态。但是,当我从 PHP 页面运行所有内容时,不会保持登录状态。
第一个 PHP 页面似乎让我登录到系统中。但是第二个 PHP 页面没有被记录为已登录。
知道如何在 Flash 和 PHP 中以不同方式处理 cookie 来解释这种差异吗?
我很乐意根据任何建议或指导提供更多详细信息。
提前谢谢了!
- - 编辑 - -
基于极好的反馈和建议,我已经完成了这项工作。我还没有机会打磨它;可能某些 cURL 选项是不必要或多余的。但至少,它有效。这是代码:
<?php
$ckfile = tempnam (".", "CURLCOOKIE");
$url_1 = 'https://somedomain.com/loginService';
$url_2 = 'https://somedomain.com/getMyData.asp';
$fields_1 = array(
'field1'=>"blah",
'field2'=>"blah",
'field3'=>"blah",
);
$fields_2 = array(
'fieldX'=>"blah",
'fieldY'=>"blah",
'fieldZ'=>"blah",
);
$a='';
$postvars_1 = '';
foreach($fields_1 as $key=>$value) {
$postvars_1.= $a.urlencode($key).'='.urlencode($value);
$a='&';
}
$a='';
$postvars_2 = '';
foreach($fields_2 as $key=>$value) {
$postvars_2.= $a.urlencode($key).'='.urlencode($value);
$a='&';
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_COOKIESESSION, TRUE);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_COOKIEFILE, $ckfile);
curl_setopt($ch, CURLOPT_COOKIEJAR, $ckfile);
curl_setopt($ch, CURLOPT_COOKIE, session_name() . '=' . session_id());
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_POST, count($fields));
curl_setopt($ch, CURLOPT_POSTFIELDS, $postvars);
curl_setopt($ch, CURLOPT_URL, $url_1);
curl_setopt($ch, CURLOPT_POST, count($fields_1));
curl_setopt($ch, CURLOPT_POSTFIELDS, $postvars_1);
$result_1 = curl_exec($ch);
curl_setopt($ch, CURLOPT_URL, $url_2);
curl_setopt($ch, CURLOPT_POST, count($fields_2));
curl_setopt($ch, CURLOPT_POSTFIELDS, $postvars_2);
$result_2 = curl_exec($ch);
curl_close($ch);
header("Content-type: text/xml");
print $result_2;
unlink($ckfile);
?>
不用说,可能有更好的方法来实现这一点,或者我的代码存在一些严重问题。但就目前而言,工作总比没有好。如果没有社区和下面的人的帮助,我永远不会让它工作。非常感谢!