【问题标题】:Trigger.io PHP session expiresTrigger.io PHP 会话过期
【发布时间】:2012-11-02 21:57:52
【问题描述】:

伙计们!

我正在尝试在 Trigger.io 中运行 HTML 应用程序。这个应用程序调用 ajax 从 PHP 页面加载一些数据。此时,我对用户进行身份验证并启动会话。在此之后,我必须调用另一个 PHP 页面。因此,我检查了会话是否已启动,我发现该会话不再处于活动状态。第二个调用是在第一个调用之后进行的。

当我尝试使用 iOS 模拟器(我使用的是 Mac - OS X Mountain Lion)从 Trigger.io ToolKit 运行应用程序时会发生这种情况。当我在 Safari 中测试同一个应用程序时,它运行良好:我的 PHP 服务器识别出之前启动的会话,并且第二个页面由 ajax 加载。

我需要设置什么参数吗?还是 Trigger.io 不支持 PHP 会话?

谢谢。

马西奥

【问题讨论】:

  • 您能否提供一个示例来说明您如何在 PHP 代码中管理会话?这样我们就有更好的机会追踪它。另外,您是如何在您的应用程序中发出请求的,您使用的是 forge.request.ajax 吗?使用 Trigger 时,cookie 应该在请求之间持续存在,但这里可能会发生其他事情。
  • @Connorhd,请看下面我的“答案”。我描述了有关问题的详细信息。谢谢!!!

标签: trigger.io


【解决方案1】:

您应该使用forge.request.ajax(params) 发出ajax 请求,这是因为跨域限制,因为在iOS 上Forge 应用程序加载为file:// url。

forge.ajax.request 采用与 jQuery 的 $.ajax 类似的输入,因此如果您想在网站和 Forge 应用中使用相同的代码,您可以轻松地在它们之间切换。

我们的文档中提供了更多文档:http://docs.trigger.io/en/v1.4/modules/request.html#ajax

【讨论】:

    【解决方案2】:

    @Connorhd,非常感谢您的帮助!

    首先,我向“app_authUser.php”发出 ajax 请求来验证用户身份。然后,如果好的,我向“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 编译器上的应用程序进行调用时,函数“session_id()”在两个 ajax 请求中返回不同的值,但当应用程序在 Sarari 上运行时返回相同的值:

    例子:

    • 来自 Trigger.io 的请求: 第一个请求:echo $idSession 返回“m7dbsv7qqem92os39lv5ao2ta1” 第二个请求:echo $idSession 返回“h49pble06n7ao9pum06kt4dph0”

    • 来自 Safari 的请求:
      第一个请求: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 !做得好!这是一个寻找“有趣的东西”的好地方!恭喜!

    非常感谢您的帮助!!!

    马西奥·克卢姆

    【讨论】:

      猜你喜欢
      • 2011-04-07
      • 2013-03-06
      • 2012-01-12
      • 2013-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-13
      相关资源
      最近更新 更多