【问题标题】:PHP and Jquery Ajax not starting sessionPHP 和 Jquery Ajax 未启动会话
【发布时间】:2016-10-20 17:36:22
【问题描述】:

我正在创建一个站点作为主站点www.example.com 的子域www.login.example.com。当用户(从子域)登录时,用户名和密码通过这个 ajax 脚本传递到主站点:

 <script>

    var xmlhttp;

    if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }

    else{// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }

    function loginano() {

        var div= document.getElementById('thes').value;
        var username = document.getElementById('username').value;
        var password = document.getElementById('password').value;

        xmlhttp.open('POST', "https://example.com/sess.php", true);

        xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");

        xmlhttp.send('username='+username+'&password='+password);

        xmlhttp.onreadystatechange=function() {

            if (xmlhttp.readyState==4 && xmlhttp.status==200) {

                var resp = JSON.parse(xmlhttp.responseText);

                if(resp.status) {
                    div.innerHTML = "Great"; 
                }else {
                    div.innerHTML = "Nope";    
                }
            }else{ 
                    div.innerHTML = "Wait";
            }
        }
    }

</script> 

这个PHP代码接收和处理post数据:

<?php
header("Access-Control-Allow-Origin: *");
session_start();
$servername = "localhost";
$username = "username";
$password = "pass";
$dbname = "dbname";

$loginusername = $_POST["username"];
$loginpassword = md5($_POST["password"]);

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$sql="SELECT * FROM tbl_users WHERE username='$loginusername' ";

$result = $conn->query($sql);

if ($result->num_rows > 0) {
    // output data of each row
	
    while($row = $result->fetch_assoc()) {
                            $sessionid = $row['id'];
                            $sessionuser = $row['username'];
		$userpassword = $row['password'];
	
}}
	if($loginpassword == $userpassword){
 $_SESSION ["sessionid"]= $sessionid;
 $_SESSION ["sessionuser"]= $sessionuser;
$return_arr["status"]=1;
} else {
	$return_arr["status"]=0;	
}
echo json_encode($return_arr); // return value 
exit();
$conn->close();
?>

登录成功,但会话未启动。我错过了什么或可能是什么问题?

【问题讨论】:

  • 你怎么知道会话没有开始?有什么错误吗?之后你会在哪里尝试获取$_SESSION
  • 它没有启动会话,因为我已经写了一个脚本来检查会话,这里;
  • codecode

标签: php jquery ajax session subdomain


【解决方案1】:

默认情况下,会话 ID 使用 cookie 传递。由于您的网站位于不同的域(子域是不同的域)上,会话 cookie 不会传输过来,因此这是阻止跨域会话工作的一件事。

即使 cookie 没有问题,您也需要将会话数据保存在您的域通常可以访问的某些存储上。您可以使用文件系统或数据库来共享会话数据。

另一种方法可能是将会话 ID 附加到所有请求的查询字符串中(PHP 甚至对此有一定程度的内置支持)。然而,这种做事方式有很多缺点——最重要的是人们一直在复制/粘贴 URL,这意味着揭示有效和重复使用无效的会话 ID——因此强烈不推荐。

更好的方法是使用 Javascript 跨所有感兴趣的域发出跨域请求(可能实现中介设计模式)。通过这种方式,您可以根据需要在任意数量的服务器之间无缝传输会话 ID。

编辑:请记住,要使用基于 cookie 的会话,必须在向浏览器发送任何内容之前调用 session_start(),在 header("Access-Control-Allow-Origin: *");

【讨论】:

  • 但会话未传递到子域。子域页面从用户那里获取用户名和密码,然后将它们传递到 www.example.com 处理数据并创建会话。
  • 会话仅在网站 [www.example.com] 内使用,不与任何其他子域共享
  • 这段时间内 $sessionid 的值是多少,在 $_SESSION ["sessionid"]= $sessionid; 行?
  • 该值为数据库上的用户ID
  • 我问是因为如果指定了 id,它将替换当前会话 id。 session_id() 需要在 session_start() 之前调用。根据会话处理程序,会话 ID 中不允许所有字符。例如,文件会话处理程序只允许 a-z A-Z 0-9 、(逗号)和 -(减号)范围内的字符!
猜你喜欢
  • 2023-03-25
  • 2011-08-03
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多