首先,我将在WampServer中显示我的项目目录以了解我的问题。 app
是PHP中使用Slim Framework的应用程序,可能在将来它成为一个Web服务(尚未)。此文件夹外的其余文件是用户的Web:
我在PHP中使用会话变量和Slim Framework。在页面login.php
上,我创建了两个会话变量。这个文件不在我正在做的Slim Framework app文件夹中。
这是文件login.php
:
<?php
session_start();
if (!empty($_SESSION) && array_key_exists("sesionIniciada", $_SESSION)) {
if ($_SESSION["sesionIniciada"] === true) {
header('Location: /index.php');
} else {
session_destroy();
$_SESSION["LLAVE_ACCESO_WEB"] = bin2hex(openssl_random_pseudo_bytes(32));
$_SESSION["LLAVE_PUBLICA"] = bin2hex(openssl_random_pseudo_bytes(32));
}
} else {
session_destroy();
$_SESSION["LLAVE_ACCESO_WEB"] = bin2hex(openssl_random_pseudo_bytes(32));
$_SESSION["LLAVE_PUBLICA"] = bin2hex(openssl_random_pseudo_bytes(32));
}
?>
当变量$_SESSION["sesionIniciada"]
不存在或为假时,我会销毁会话并创建两个新变量。没问题。
在同一页面中,我有一个HTML格式的登录表单,当我按下提交按钮时,我调用了一个jquery AJAX函数来登录。
这是Javascript中的函数:
var url = "./app/v1/acceso/web";
var data = JSON.stringify({
usuario: $.trim($("#usuario").val()),
clave: $.trim($("#clave").val())
});
$.ajax({
type: "POST",
url: url,
data: data,
processData: false,
headers: {
'S-Publica': $.trim($("#llave").val()),
'S-Hash': encriptacion(data, $.trim($("#llave").val())),
'Content-Type': 'application/json'
},
success: function (response){
console.log(response);
},
error: function (e){
console.log(e);
}
});
我对此功能没有问题,因为请求是正确的。
问题出在我通过AJAX调用的PHP文件中:var url = "./app/v1/acceso/web"
。在项目目录图像上是app/v1/index.php
,其中包含指向链接/acceso/web
的路由器。在我的文件中,我正在尝试获取我在login.php中创建的$_SESSION
变量,但它们不存在!这很奇怪,因为所有项目都在同一台服务器上(我假设它没有cookie ID的问题)。
这是index.php
:
<?php
session_start();
require '../libs/Slim/Slim.php';
\Slim\Slim::registerAutoloader();
$app = new \Slim\Slim(array(
'mode' => 'debug'
));
$app->post('/acceso/web', function () {
var_dump($_SESSION); //doesn't show the variables session created in login.php
});
我不知道出了什么问题!我在想是用于Slim的.htaccess文件,但我不确定!无论如何,我发布了.htaccess文件:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ %{ENV:BASE}index.php [QSA,L]
有什么问题?谢谢!
编辑:解决方案
我需要在login.php
文件中的会话销毁后重新启动会话变量:
<?php
session_start();
if (!empty($_SESSION) && array_key_exists("sesionIniciada", $_SESSION)) {
if ($_SESSION["sesionIniciada"] === true) {
header('Location: /index.php');
} else {
session_destroy();
session_start(); // SOLUTION
$_SESSION["LLAVE_ACCESO_WEB"] = bin2hex(openssl_random_pseudo_bytes(32));
$_SESSION["LLAVE_PUBLICA"] = bin2hex(openssl_random_pseudo_bytes(32));
}
} else {
session_destroy();
session_start(); // SOLUTION
$_SESSION["LLAVE_ACCESO_WEB"] = bin2hex(openssl_random_pseudo_bytes(32));
$_SESSION["LLAVE_PUBLICA"] = bin2hex(openssl_random_pseudo_bytes(32));
}
?>
感谢Alvaro Montoro的回答!
答案 0 :(得分:1)
根据http://php.net/manual/en/function.session-destroy.php:
session_destroy()会销毁与当前关联的所有数据 会话。它不会取消任何与之相关的全局变量 会话,或取消设置会话cookie。 使用会话变量 再一次,必须调用session_start()。
(大胆的部分是我突出我对上述问题所评论的内容)
因此解决方案是在销毁会话后调用session_start()
:
session_destroy();
session_start();
$_SESSION["LLAVE_ACCESO_WEB"] = bin2hex(openssl_random_pseudo_bytes(32));
$_SESSION["LLAVE_PUBLICA"] = bin2hex(openssl_random_pseudo_bytes(32));