我有一个向服务器端发送请求的登录组件(我让 WAMPP 运行 PHP,同时在 npm 服务器上调试 React):
class Login extends React.Component {
constructor(props) {
super(props);
this.state = {
email: '',
pass: '',
sent: false,
error: null,
errmsg: null
}
}
handleFormSubmit(event) {
event.preventDefault();
axios({
method: 'post',
url: `${ENDPOINT}`,
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
},
data: this.state
}).then(result => {
//console.log("suuccess");
//console.log(result.data);
this.setState({
sent: result.data.sent,
error: result.data.error,
errmsg: result.data.message
})
}).catch(err => {
this.setState({error: err.message})
});
console.log(this.state);
}
handleLogin() {
console.log("Handle redirect");
}
render() {
return (
<main className="content">
<form>
{this.state.error &&
<div>{this.state.errmsg}</div>
}
<input type="email" id="email" name="email" placeholder="Email address"
onChange={e => this.setState({email: e.target.value})} />
<input type="password" id="password" name="password" placeholder="Password"
onChange={e => this.setState({pass: e.target.value})} />
<input type="submit" value="Login" onClick={e => this.handleFormSubmit(e)}/>
{this.state.sent && this.handleLogin()}
</form>
</main>
);
}
}
端点:
session_start();
header("Access-Control-Allow-Origin: *");
header("Content-type: application/json");
require("../config.php");
$rest_json = file_get_contents("php://input");
$_POST = json_decode($rest_json, true);
if (empty($_POST['email'])) die();
function login() {
$user = User::getByEmail($_POST['email']);
//Update last seen timestamp
$user->updateVisit();
$_SESSION['loggedin'] = true;
$_SESSION['loggedinuser'] = $user->email;
$_SESSION['loggedinname'] = $user->name;
}
function setError($msg) {
echo json_encode(["sent" => false, "error"=>true,"message" => $msg]);
}
if(isset($_POST)) {
http_response_code(200);
if(isset($_POST['email']) && isset($_POST['pass'])) {
$valid = tryToLogin($_POST['email'], $_POST['pass']);
if($valid) {
login();
echo json_encode(["sent" => true]);
}
$exist = User::getByEmail($_POST['email']);
//Email in use
//Invalid attempt
if(!$valid) {
$_SESSION['ERRORCODE'] = "LOG004";
setError("Wrong email address or password.");
} else if (!$valid && isset($exist) && !empty($exist)) {
$_SESSION['ERRORCODE'] = "LOG006";
setError("Email in use.");
}
} else {
setError("Please enter credentials.");
}
} else {
setError("Please enter credentials.");
}
我知道脚本可以按照我的意愿执行,因为前端传递了正确的信息。SESSION 似乎并没有留下来。
如您所见,我在处理程序开始时启动了一个会话,并且我有login()设置 SESSION 变量的函数。这将非常重要,因为我有另一个 PHP 文件从 SESSION 变量中检索某些信息并将其返回到前端,但它总是返回一个空数组,告诉我 SESSION 没有被存储。
这个文件是这样的:
<?php
session_start();
header("Access-Control-Allow-Origin: *");
header("Content-type: application/json");
require("../config.php");
print_r($_SESSION);
$rest_json = file_get_contents("php://input");
$_GET = json_decode($rest_json, true);
$loggedIn = isLoggedIn();
if($loggedIn) {
$user = User::getByEmail($_SESSION['loggedinuser']);
echo json_encode(["logged" => $loggedIn, "name" => $user->name]);
} else {
echo json_encode(["logged" => $loggedIn]);
}
?>
即使我单独打开这个文件,它也会告诉我会话中没有任何内容(我也在第一行开始会话)
我做错了吗?或者这是基本上两个并行工作的服务器(WAMPP 和 npm)的复杂性?