在ajax请求中设置$ _SESSION

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

url="createUrl("security/login") ?>" $.ajax({ type:"POST", url:url, data:{}, success: function (jsonResponse) { var json=JSON.parse(jsonResponse); if(json.result == "SUCCESS") {  } }, 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请求中正确设置会话?

非常感谢你 :)

在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代码而不打开大量的安全漏洞。 (想象一下如果浏览器可以说“嘿,PHP,运行这个”会发生什么。我所要做的就是弹出一个JS控制台,看看你是怎么做的……至少,我可以在控制台中写一行JS来设置该变量,无论我是否登录。)

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