0

我有这个 Jquery Ajax 函数来登录网页。

url="<?php echo Yii::app()->createUrl("security/login") ?>"

                $.ajax({                      
                    type:"POST",
                    url:url,
                    data:{},
                    success: function (jsonResponse) {
                        var json=JSON.parse(jsonResponse);

                        if(json.result == "SUCCESS")
                        {
                            <?php $_SESSION['LOGGED_USER']="USER"; ?>
                        }

                    },
                    error: function (jqXHR, textStatus, errorThrown) {
                            console.log(errorThrown);
                    }     
                });

在我的视图布局中,我有这个

session_start();

if( isset($_SESSION['LOGGED_USER']) )
{
    print_r("LOGGED");
}
else
{
    print_r("NOT LOGGED");
}

当我第一次进入页面时,它会打印“NOT LOGGED”,但它似乎会自动设置会话,因此当我重新加载页面时它会打印“LOGGED”。

如何在我的 ajax 请求中正确设置会话?

非常感谢 :)

4

1 回答 1

0

当谈到 Ajax 时,似乎很多人对客户端与服务器感到困惑。让我看看我是否可以清除它:

  • 您的 JS 在浏览器(客户端)中运行。PHP 在服务器上运行。两者是在完全不同的机器上运行的不同语言。他们不共享相同的变量或任何东西。他们不直接交谈,甚至不知道彼此的任何事情。他们唯一的通信方式是通过 HTTP 请求。(嗯,也有 WebSockets ......但这有点先进。)

  • JS 和 PHP 通常甚至不会同时运行。根据您的设置和此脚本所在的位置,会发生两件事之一,在这种情况下,这两件事都不是您想要的。

    • JS 位于服务器不提供给 PHP 的某种类型的文件中。当浏览器看到它时,PHP 代码仍在文件中——并且是无效的 JS,当您尝试运行它时会导致语法错误。可能在您完成 Ajax 帖子之前。

    • JS 位于服务器提供给 PHP的某种类型的文件中PHP 解释器尽职尽责地遍历文件,找到其中的所有 PHP 代码,然后解析并运行它。其中的 PHP 代码在服务器上运行,甚至可能在页面发送到浏览器之前。(而且由于 PHP 不会说 JS,甚至不关心它生成的是有效的 HTML 还是 JS……页面中的任何非 PHP 代码都是无关紧要的。)无论如何,当浏览器运行你的脚本时上面,它看起来像这样:

      ...
              success: function (jsonResponse) {
                  var json=JSON.parse(jsonResponse);
      
                  if(json.result == "SUCCESS")
                  {
                       }
      
              },
      ...
      

    因为 PHP 已经浏览了该文件并解释了有关设置的部分$_SESSION['LOGGED_USER']。如果用户有一个活动会话,无论是否登录,LOGGED_USER 变量都会在他的浏览器请求该页面时设置。

处理请求的 PHP 脚本security/login需要设置会话变量。你的 JS 将无法做到这一点,因为会话数据完全是服务器端的,你不能让浏览器启动并告诉服务器运行任意 PHP 代码而不打开一个巨大的安全漏洞。(想象一下如果浏览器可以说“嘿,PHP,运行这个”会发生什么。我所要做的就是弹出一个 JS 控制台,看看你是怎么做的......至少,我无论我是否登录,都可以在控制台中编写一行 JS 来设置该变量。)

或者,如果您真的想要,您可以创建另一个页面,让 JS 发布到该页面,以设置会话数据。不过,这似乎是一种浪费……而且要安全地做到这一点可能非常困难。(如果 PHP 还不知道您已登录,则必须重新进行身份验证等等。)除非由于某种原因security/login无法修改,否则我不会考虑它。

于 2013-07-08T22:57:02.930 回答