Hello stackoverflow专家。 我在网页上有一个按钮。当我单击该按钮时,它运行一个javascript函数,该函数对服务器上的.php程序进行AJAX调用,并等待响应。当它到来时,处理程序函数从它接收的xml数据生成一个很好的报告。一切正常。
现在问题出现了.php程序从它请求数据的服务器获得“未经过身份验证”的响应。在这种情况下,它会发回一个链接以进行身份验证。现在,AJAX响应处理程序失去了控制权,因为它在处理“未经过验证”的响应时完成了它的工作。
如果我点击链接,我会被带到另一个网站。然后我输入我的用户名和密码,然后该站点将数据重定向回原始请求.php程序。 .php程序只是回显我的网页上显示的数据。整个网页就是那些数据。它没有任何处理。
我的问题是如何重新获得控制权以便再次正确处理数据并生成一个好的报告?
以下是html按钮代码段:
Get report<button onclick='getCCDfromHV()'>Copy</button>
<div id="uploadResponse"></div>
这是getCCDfromHV javascript:
function getCCDfromHV() {
document.getElementById("uploadResponse").innerHTML= "Connecting ...";
var xmlhttp;
if (window.XMLHttpRequest) xmlhttp=new XMLHttpRequest(); // code for IE7+, Firefox, Chrome, Opera, Safari
else xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");// code for IE6, IE5
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4 && xmlhttp.status==200) {
ccdXml = xmlhttp.responseText;
if (ccdXml.length < 400) {
document.getElementById("uploadResponse").innerHTML= ccdXml; //not authenticated or expired
}
else {
document.getElementById("uploadResponse").innerHTML= "Report has been retrieved!<br>";
var decoded = htmlDecode(ccdXml);
xmlDom = createXmlDOM(decoded); //create and fill global variable xmlDom
createReport();
}
}
}
xmlhttp.open("GET","GetCCDfromHV.php",true);
xmlhttp.send();
}
这里有点简化了GetCCDfromHV.php:
<?php
$appId = file_get_contents('app2.id');
session_start();
ob_start();
ob_flush();
try {
$hv = new HVRawConnector(
$appId,
file_get_contents('app.fp'),
'app.pem',
$_SESSION
);
$hv->connect();
$hv->authenticatedWcRequest('GetPersonInfo');
$recordId = $hv->getQueryPathResponse()->find('selected-record-id')->text();
$thingId = '9c48a2b8-other-digits-identifying-data-type';
$hv->authenticatedWcRequest(
'GetThings',
'3',
'<group max="30"><filter><type-id>' . $thingId . '</type-id></filter><format><section>core</section><xml/></format></group>',
array('record-id' => $recordId)
);
print htmlentities($hv->getRawResponse()); //this prints the report which I format in javascript
ob_flush();
}
catch (HVRawConnectorUserNotAuthenticatedException $e) { //handle it here instead of returning to javascript?
print "You are not authenticated! ";
printAuthenticationLink();
}
catch (HVRawConnectorAuthenticationExpiredException $e) {
print "Your authentication expired! ";
printAuthenticationLink();
}
catch (Exception $e) {
print $e->getMessage() . '<br>';
print $e->getCode() . '<br>';
printAuthenticationLink();
}
function printAuthenticationLink() {
global $appId;
$url = '"' .HVRawConnector::getAuthenticationURL($appId,'http' . (!empty($_SERVER['HTTP_SSL']) ? 's' : '') . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'],$_SESSION) .'"';
print '<a href=' .$url .'>Authenticate</a>';
ob_flush();
}
?>