【发布时间】:2015-02-05 20:10:26
【问题描述】:
首先,我将在 WampServer 中显示我的项目目录以了解我的问题。 app 是带有 Slim 框架的 PHP 应用程序,将来可能会成为 Web 服务(还没有)。此文件夹之外的其余文件是用户的网络:
我在 PHP 中使用会话变量和 Slim 框架。在login.php 页上,我创建了两个会话变量。这个文件不在我正在做的 Slim Framework 应用程序文件夹中。
这是文件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 的回答!
【问题讨论】:
-
我一直认为如果你想使用会话变量,你必须在
session_destroy()之后调用session_start()。这可能是一个问题吗? -
当你显然没有完成会话时,为什么要销毁它?
标签: javascript php jquery session slim