在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
,否则我不会考虑它。