各位!
我正在尝试在Trigger.io中运行一个超文本标记语言应用程序。这个应用程序调用ajax从PHP页面加载一些数据。此时,我对用户进行身份验证并启动会话。在此之后,我必须调用另一个PHP页面。因此,我检查会话是否已启动,并发现该会话不再处于活动状态。第二个调用紧跟在第一个调用之后。
当我尝试使用Mac模拟器(我使用的是Trigger.io - OS Lion )从iOS ToolKit运行这个应用程序时,就会出现这种情况。当我在Safari中测试同一个应用程序时,它工作得很好:我的PHP服务器识别前面启动的会话,第二个页面由ajax加载。
有什么参数需要我设置吗?或者Trigger.io不支持PHP会话?
谢谢。
马西奥
发布于 2012-11-05 17:41:34
您应该使用forge.request.ajax(params)发出ajax请求,这是因为跨域限制,因为Forge应用程序是作为file:// urls加载到iOS上的。
forge.ajax.request采用类似于jQuery的$.ajax的输入,所以如果你想在网站和你的Forge应用中使用相同的代码,你可以很容易地在它们之间切换。
我们的文档中提供了更多文档:http://docs.trigger.io/en/v1.4/modules/request.html#ajax
发布于 2012-11-05 02:26:57
@Connorhd,非常感谢你的帮助!
首先,我向"app_authUser.php“发出一个ajax请求来验证用户身份。然后,如果Ok,我向"app_loadFeed.php“发出另一个ajax请求,以便从服务器加载数据。
在第一个ajax请求中,我在post参数中传递了用户数据(登录和密码),以便在数据库上对用户进行身份验证。我在php文件"app_authUser.php“上调用的第一个命令是"session_start()",如下所示:
服务器端"app_authUser.php“的代码:
<?php
session_start();
// Just for test;
$idSession = session_id();
echo $idSession;
/*
Test user authenticate. If ok, then I assign idUser to $_SESSION['idUser'] variable.
*/
if( $loginOk == true ){
$_SESSION[ 'idUser' ] = $User->idUser;
}
?> 在上面的代码中,用户已通过身份验证,并且$_SESSION‘’idUser‘已正确启动。在第二个ajax请求中,我测试是否设置了变量$_SESSION 'idUser‘。这就是重点:它不再是设置的。同样,我首先调用"session_start()“:
服务器端"app_loadFeed.php“的代码:
<?php
session_start();
// Just for test;
$idSession = session_id();
echo $idSession;
if( isset( $_SESSION[ 'idUser' ] ) ){
/* Load data from database to return to user.... */
echo ...
}
else{
echo '0';
}
?>当我从Trigger.io编译器调用我的应用程序时,上面的测试总是返回false。但是,当我从Safari调用我的应用程序时,它总是返回true。
我发现,当从运行在Trigger.io编译器上的app进行调用时,函数"session_id()“在两个ajax请求中返回不同的值,但当app在Sarari上运行时返回相同的值:
示例:
来自Trigger.io的
第一个请求: echo $idSession返回"2cbhin1185fm5ehvbb15k6n0b1“第二个请求: echo $idSession返回"2cbhin1185fm5ehvbb15k6n0b1"
这意味着会话在第一个示例中是不同的。这一切为什么要发生?
我没有在我的应用中使用forge.request.ajax。这是我的ajax代码,在我的javascript中:
<script>
function openAjax()
{
try
{
var ajax = new XMLHttpRequest();
}
catch(e)
{
try
{
var ajax = new ActiveXObject("Msxml2.XMLHTTP");
}
catch(ee)
{
try
{
var ajax = new ActiveXObject("Microsoft.XMLHTTP");
}
catch(eee)
{
var ajax = false;
alert("Seu navegador não suporta AJAX!")
}
}
}
return ajax;
}
// This is the function called at second time, just after I authenticate my user and have session opened.
function loadFeed(){
var url = CT_URLBase + 'app_loadFeed.php'; // CT_URLBase = 'http://192.168.1.100/' in my local environment.
var parameters = '';
var ajax = openAjax();
ajax.open('POST', url, true);
ajax.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=iso-8859-1');
ajax.onreadystatechange = function(){
if (ajax.readyState == 4){
if (ajax.status == 200){
var retorno = ajax.responseText;
if( retorno != '0' ){
/* Return OK!!! */
}
else{
/* Error: return is 0 (zero), that means session is not started.
}
}
}
}
ajax.send(parameters);
}
</script>最让我产生误解的是,同样的代码在Safari中可以完美地工作,但在Trigger.io中却不能。
顺便说一下,我访问了你的网站,connorhd.co.uk!干得好!这是一个寻找“有趣的东西”的好地方!祝贺你!
非常感谢您的帮助!
马西奥·克劳姆
https://stackoverflow.com/questions/13203588
复制相似问题