1

我在为用 JQuery 编写的移动应用程序创建会话时遇到困难。我希望我的应用程序检查是否存在用户会话,如果不存在,它将用户重定向到登录表单。我使用 ajax 检查登录凭据,并以 JSON 格式返回用户详细信息。

如何将这些 JSON 变量存储在会话中,以便我可以在我的应用程序中访问这些变量?

function ajaxPost(LoadUrl, redirect) {
    jQuery.ajax({ 
        type: "POST", 
        url: LoadUrl, 
            data: "email=" + $("#email").val() + "&pw=" + $("#pw").val(),
            complete: function(xhr, statusText){ 
                if (xhr.status == 401){     
                    alert('Unauthorised');
                } 
        } ,

        success:function(response){ 
                if(redirect != null){
                    alert(response);
                    <? 
                    //session_start(); 
                    //$_SESSION['user'] = $response;  // this is JSON: {"id":"45454","name":"Joe Blog","username":"joebloguser"} 
                    ?>
                   app.navigate(redirect);

                }
            }
    });                 
}

我已经注释掉了启动 PHP 会话的 PHP 代码,因为无论是否进行 ajax 调用,这似乎都会启动一个会话,因此总是有一个 $_SESSION 集,这显然是我不想要的。任何人都可以建议进行此操作的最佳方法吗?

4

2 回答 2

1

有几种方法可以解决这个问题(问题是嵌入式 JS 脚本和驻留在服务器端的 PHP 数据之间的即时通信)

一种方法是简单地将 JSON 字符串回显到隐藏元素中(如果它存在于会话中),然后使用 jquery 获取并将其解析为对象文字(如果存在)。

PHP:

<?php
if(isset($_SESSION['some_var'])) {
?>
<div id="#jsondata">
<?php echo json_encode($_SESSION['some_var']); ?>
</div>

JS

var jsonData = JSON.parse($('#jsondata').html());

由于 PHP 会立即输出这些数据,所以当 PHP 完成向浏览器输出时,它会被渲染到 DOM 中,当 JQuery 触发时,它会呈现出来以供读取。显然,这会在源代码中暴露您的数据结构,因此在使用这种方法时需要考虑这一点。

另一种方法是有一个 PHP 端点,如果存在则输出用户数据,mimetyped 为 json,如果没有用户会话,则输出失败值,并让 JS 根据输出值引导体验:

PHP:

//in some accessible url
<?php
if(isset($_SESSION['some_var'])){
  $data = array('flag'=>1,'obj'=>$_SESSION['some_var']);
}else{
  $data = array('flag'=>0);
}
header('Content-type:application/json');
echo json_encode($data);

然后,您可以像在给定示例中一样在页面加载时为此进行 ajax,并检查重定向的标志值。

您通常需要在设计这类事情时考虑到一种通用的方法来解决问题,因为它需要在经过身份验证的页面上普遍复制。您是否真的需要在客户端检查身份验证,或者您可以让服务器端代码操纵身份验证的分支(也许通过选择性地包含 javascript/模板文件。)最好考虑一下普遍适用于您的目的.

于 2012-06-19T14:51:07.987 回答
1

如果你把 php 放在你的 javascript 之间,它会在页面第一次加载时运行(在任何 javascript 运行之前......),这样就行不通了。

您需要将会话逻辑移至loadUrl脚本;验证那里的登录并在必要时启动会话。

于 2012-06-19T14:46:46.427 回答