为何JSON.session返回值始终为0?会话检测异常求助
问题解决:前端始终收到session=0的问题
核心原因
- 未同步session字段值:当
$_SESSION['id_armero']存在时,初始化的$result['session']一直保持默认值0,从未根据实际会话状态更新,导致前端拿到的会话状态始终错误。 - switch语法错误:代码中写了
switch (isset($_GET['action'])),这会判断布尔值,永远匹配不上'getUser'这类字符串case,导致getUser的逻辑根本不会被执行。 - Header拼写错误:
aplication/json应为application/json,可能导致浏览器无法正确识别响应格式。
修复方案
1. 修正switch判断逻辑
将switch (isset($_GET['action']))改为switch ($_GET['action']),确保接口动作能正确匹配对应的处理逻辑。
2. 同步session字段状态
- 检测到
$_SESSION['id_armero']存在时,立即将$result['session']设为1; - 用户登录成功时,同样设置
$result['session'] = 1; - 注销会话后,将
$result['session']设回0,保持状态一致。
3. 修正响应头拼写
把header('content-type: aplication/json; charset=utf-8')改为header('content-type: application/json; charset=utf-8')。
完整修复后的PHP代码
<?php require_once('../entities/dto/armero.php'); if (isset($_GET['action'])) { session_start(); $armero = new Armero; $result = array('status' => 0, 'session' => 0, 'message' => null, 'exception' => null, 'dataset' => null, 'username' => null); if (isset($_SESSION['id_armero'])) { // 标记会话已存在 $result['session'] = 1; // 修复switch判断条件 switch ($_GET['action']) { case 'getUser': if (isset($_SESSION['correo_armero'])) { $result['status'] = 1; $result['username'] = $_SESSION['correo_armero']; } else { $result['exception'] = 'Alias de usuario indefinido'; } break; case 'logOut': if (session_destroy()) { $result['status'] = 1; $result['message'] = 'Sesion eliminada correctamente'; // 注销后会话不存在 $result['session'] = 0; } else { $result['exception'] = 'Ocurrio un problema al cerrar la sesion'; } break; default: $result['exception'] = 'Acción no disponible dentro de la sesión'; } } else { switch ($_GET['action']) { case 'readUsers': if ($armero->readAll()) { $result['status'] = 1; $result['message'] = 'Debe autenticarse para ingresar'; } else { $result['exception'] = 'debe crear un usuario para comenzar'; } break; case 'signUp': $_POST = Validator::validateForm($_POST); if (!$armero->setNombre($_POST['nombre'])) { $result['exception'] = 'Nombres incorrectos'; } elseif (!$armero->setApellido($_POST['apellido'])) { $result['exception'] = 'Apellidos incorrectos'; } elseif (!$armero->setCorreo($_POST['email'])) { $result['exception'] = 'Correo incorrecto'; } elseif (!$armero->setTelefono($_POST['telefono'])) { $result['exception'] = 'Alias incorrecto'; } elseif ($_POST['codigo_ser'] != $_POST['confirmar']) { $result['exception'] = 'Claves diferentes'; } elseif (!$armero->setCodigo($_POST['codigo_ser'])) { $result['exception'] = Validator::getPasswordError(); } elseif ($armero->createRow()) { $result['status'] = 1; $result['message'] = 'Usuario registrado correctamente'; } else { $result['exception'] = Database::getException(); } break; case 'logIn': $_POST = Validator::validateForm($_POST); if (!$armero->checkUser($_POST['email'])) { $result['exception'] = 'Alias Incorrecto'; } elseif ($armero->checkPassword($_POST['clave']) && $armero->checkState()) { $result['status'] = 1; $result['message'] = 'Autenticacion Correcta'; $_SESSION['id_armero'] = $armero->getId(); $_SESSION['correo_armero'] = $armero->getCorreo(); // 登录成功标记会话存在 $result['session'] = 1; } else { $result['exception'] = 'Clave incorrecta o usuario no activo'; } break; default: $result['exception'] = 'Acción no disponible fuera de la sesión'; } } // 修复Header拼写错误 header('content-type: application/json; charset=utf-8'); print(json_encode($result)); } else { print(json_encode('Recurso no disponible')); }
验证修复
修改完成后,前端调用getUser接口时,若会话存在,JSON.session会返回1,前端的if (JSON.session)判断会正常进入hello分支,会话状态检测逻辑恢复正常。
内容的提问来源于stack exchange,提问作者Contreras Chiquillo Christian
相关产品推荐
相关产品推荐

