0

我有一个向服务器端发送请求的登录组件(我让 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)的复杂性?

4

0 回答 0