因此,这是我第一次使用cookie,我在设置它们时遇到了一些问题。我想我做的每件事都是正确的(但你知道编程是怎么回事)。无论如何,我正在创建一个登录系统,它将通过在validateLogin.js中的jquery.ajax调用,到一个php脚本(autologin.php),检查用户和他们的密码是否在数据库中,通过另一个脚本(login.php)中的函数,在login.php中,如果用户存在并且密码相同,则设置cookie并将一些json数据返回到autologin.php,然后将一些json数据返回到原始的jquery.ajax方法success函数。然后,success函数将重定向到userarea.html,其中的js函数将自动加载用户数据,以便可以使用。这是通过loaduserdata.js中的另一个ajax调用来完成的,它调用loaduserdata.php来检查isset($_COOKIE['user'],然后根据发生的情况返回一些json数据。然而,isset($_COOKIE['user']失败了,我在控制台或任何日志(php,mysql,apache)中没有得到任何错误。所以我真的被难住了。下面是我的代码:
validateLogin.js
function validateLogin(){
$(document).ready(function(){
$("#loginform").submit(function(){
$.ajax({
type: "POST",
url: "./php/autologin.php",
data: {
'login': $("#login").val(),
'password': $("#password").val()
},
dataType: "json",
success:function(data){
if(data.status == "success"){
alert(data.message);
window.location = "./userarea.html";
} else if (data.status == "error"){
alert(data.message);
}
},
error:function(thrownError){
console.log(thrownError);
}
});
return false;
});
});
}autologin.php
<?php
include './login.php';
$login = $_POST['login'];
$password = $_POST['password'];
$loginattempt = login($login, $password);
$loginattemptdata = json_decode($loginattempt);
if ($loginattemptdata->{'status'} === "success") {
echo json_encode(array('status' => "success", 'user' => $loginattemptdata->{"user"}, 'message' => "Login Successful!"));
die();
} else {
echo json_encode(array('status' => "error", 'error' => "loginfailure", 'message' => $loginattemptdata->{"message"}));
die();
}
?>login.php
<?php
include './connect_to_mysql.php';
function login($log, $pass) {
$link = connect_to_mysql();
$linkdata = json_decode($link);
if ($linkdata->{'status'} === "success") {
$sqlquery = mysql_query("SELECT * FROM userdata WHERE login='$log' AND password='$pass'") or die(mysql_error());
if (mysql_num_rows($sqlquery) == 1) {
setcookie("user", $log, 86400, '/', 'localhost');
return json_encode(array('status' => "success", 'message' => "Login Successful.", 'user' => $log));
die();
} else {
return json_encode(array('status' => "error", 'error' => "loginfailure", 'message' => mysql_error()));
die();
}
} else {
return json_encode(array('status' => "error", 'error' => "connectionerror", 'message' => $linkdata->{'message'}));
die();
}
}
?>loaduserdata.js
$(document).ready(function(){
$.ajax({
type:"POST",
url:"./php/loaduserdata.php",
success:function(data){
if(data.status === "success"){
alert(data.status);
alert(data.user);
} else if (data.status === "error"){
alert(data.status);
alert(data.message);
window.location = "./index.html";
}
},
error:function(thrownError){
console.log(thrownError);
}
});
});loaduserdata.php
<?php
if (isset($_COOKIE['user'])) {
$user = $_COOKIE['user'];
echo json_encode(array('status' => "success", 'message' => $user));
die();
} else {
echo json_encode(array('status' => "error", 'message' => "Please login before continuing."));
die();
}
?>根据我所读到的,您需要刷新或重定向后设置cookie,使其可用于新的脚本,我相信这就是我正在做的。任何帮助或指导都将不胜感激。谢谢!
发布于 2012-06-18 04:45:37
依靠客户端cookie获取登录状态不是一个好主意。想象一下,如果用户使用随机(有效)用户名制作自己的cookie,会发生什么?他将无需密码即可访问您的系统。
您是否考虑过切换到基于$_SESSION的身份验证过程?
其概念是为每个访问者分配一个惟一的ID (会话ID),该ID作为cookie客户端存储。当访问者加载页面时,sessid cookie被传递,php从会话存储中加载它(如果您还没有配置会话,很可能是/tmp/中的一个文件)。这个文件由$_SESSION变量反映,在这个变量中,您可以保存只有对应的会话ID才能访问的数据。因此,用户名或登录状态是在服务器端处理的,而不是客户端。
<?php
# login.php
include './connect_to_mysql.php';
function login($log, $pass) {
$link = connect_to_mysql();
$linkdata = json_decode($link);
if ($linkdata->{'status'} === "success") {
$sqlquery = mysql_query("SELECT * FROM userdata WHERE login='$log' AND password='$pass'") or die(mysql_error());
if (mysql_num_rows($sqlquery) == 1) {
session_start();
$_SESSION['user'] = $log;
return json_encode(array('status' => "success", 'message' => "Login Successful.", 'user' => $log));
} else {
return json_encode(array('status' => "error", 'error' => "loginfailure", 'message' => mysql_error()));
}
} else {
return json_encode(array('status' => "error", 'error' => "connectionerror", 'message' => $linkdata->{'message'}));
}
}
?>更改:(1)在返回后丢弃骰子()。它们永远不会被执行。(2)通过session_start()和$_ session‘’user‘=$log保存到会话,而不是使用您自己的cookie。
<?php
# loaduserdata.php
session_start();
if (isset($_SESSION['user'])) {
$user = $_SESSION['user'];
echo json_encode(array('status' => "success", 'message' => $user));
die();
} else {
echo json_encode(array('status' => "error", 'message' => "Please login before continuing."));
die();
}
?>更改:使用session_start()和$_SESSION‘use’,而不是依赖客户端cookie。
https://stackoverflow.com/questions/11074602
复制相似问题