在ajax请求中设置$ _SESSION

时间:2013-07-08 22:52:24

标签: php jquery ajax session

我有这个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请求中正确设置会话?

非常感谢:)

1 个答案:

答案 0 :(得分: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变量都会被设置为浏览器请求该页面的第二个变量。

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

或者,如果您真的想要,可以创建另一个JS发布的页面,用于设置会话数据。这似乎是浪费,但安全地做起来可能相当困难。 (如果PHP不知道您已经登录,则必须重新进行身份验证以及所有这些。)除非出于某种原因,否则我不会考虑它security/login无法修改。