我有这个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请求中正确设置会话?
非常感谢:)
答案 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
无法修改。