【问题标题】:Ajax setting cookiesAjax 设置 cookie
【发布时间】:2014-01-20 02:41:22
【问题描述】:

我有一个带有 ajax 的登录表单,如果选中了“记住我”复选框,我正在尝试设置 cookie。我已经有代码在用户选中“记住我”框但未设置 cookie 时运行。执行var_dump($_COOKIE) 输出array(1) { ["PHPSESSID"]=> string(26) "xxxxxxxxxxxxxxxxxxxxxxxxxx" } 并且即使在执行secookie() 之后它也输出相同的东西。

登录.php

<?php
require_once (dirname(__FILE__) . '/../../inc/inc.all.php');
$username;
$password;
$remember;
$token;

if (!isset($_POST['username'])) {
    echo "Username field must be set!";
    die();
}
$username = $_POST['username'];

if (!isset($_POST['password'])) {
    echo "Password field must be set";
    die();
}
$password = md5($_POST['password']);

$remember = $_POST['remember'];

if (!isset($_POST['token'])) {
    echo "There was a problem logging you in securly, Prehaps you are trying to log in from a different window?";
    die();
} else {
    $token = $_POST['token'];
}

// Validate token
if (!isset($token) || $token != $_SESSION['token']) {
    echo "Invalid token: There was a problem logging you in securley, Prehaps you are trying to log in from a different window?";
    die();
}

// Log the user in
$sql = "SELECT ID FROM cs_users WHERE username = '{$username}' AND password = '{$password}'";
$query = $db -> query($sql);
if ($query -> num_rows) {
    list($id) = @array_values($query -> fetch_assoc());
    if ($remember) {
        $expire = time() + 60 * 60 * 24 * 180;
        echo $id.'<br>'.$username.'<br>'.$password.'<br>';
        setcookie("id", $id, $expire);
        setcookie("username", $username, $expire);
        setcookie("password", $password, $expire);
        // header("LOCATION:{$_SERVER['PHP_SELF']}");
    } else {
        $_SESSION['id'] = $id;
        $_SESSION['username'] = $username;
        $_SESSION['password'] = $password;
    }
    echo true;
} else {
    echo "Invalid username/password";
    die();
}
?>

【问题讨论】:

  • 为什么不用jQuery Cookie之类的东西在客户端设置cookie?这样你就可以在 AJAX .done() 上设置它。
  • @r3mus 我不想通过 javascript 设置 cookie。否则需要做大量工作才能保存 cookie(我需要保存一个用 password_hash() 加密的密码 cookie)
  • 您可以在 php 端执行所有必要的散列等(无论如何您都必须这样做?)并将结果返回给 jQuery,然后弹出 cookie。
  • 所以你的意思是条件 if ($remember) 被执行为真,并且 (echo $id.'
    '.$username.'
    '.$password.'
    ';) 正在回显但 setcookie("id", $id, $expire);实际上并没有在浏览器中创建 cookie,对吗?
  • 您使用的是an unsuitable hashing algorithm,需要take better care的用户密码。

标签: javascript php jquery ajax cookies


【解决方案1】:

您需要通过调用session_start();来启动会话

【讨论】:

  • 会话已经开始并且工作正常。我处理的是 COOKIES 而不是 SESSION
  • 您确定会话是在您的 AJAX 脚本中启动的吗?如果您不在“页面”脚本和“AJAX”脚本中使用相同的包含,则可能不会。是在inc.all.php中完成的吗?
  • 是的,是在inc.all.php中启动的
【解决方案2】:

*执行 var_dump($_COOKIE) 输出 array(1) { ["PHPSESSID"]=> string(26) "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx" } 并且它输出相同的东西 即使在执行 secookie() 之后。*

这里的问题,你能从另一个脚本设置另一个cookie吗?如果没有说明服务器配置有问题,否则需要调试当前脚本。

  1. 根据我从您的问题中了解到,您无法检查测试 $_COOKIE 来自设置它的同一脚本。换句话说, 执行后不能直接测试var_dump($_COOKIE) secookie()。在发出新的页面请求之前,您无法读取 $_COOKIE 的值。这是因为每次请求时浏览器都会发送 cookie 数据的值。

  2. 我认为设置 cookie 可能需要一些时间才能解决。测试您是否已创建 cookie 的最佳方法是检查您的浏览器 cookie 并查看 cookie 是否存在。

  3. 当你运行命令setCookie();它只会在 脚本完成并将输出传递给浏览器。然后 浏览器将创建 cookie。

  4. 检查setcookie函数的返回值可能是什么 如果在函数之前已经发送了输出,则返回 FALSE 打电话。

  5. 检查PHP配置和.htaccess查看设置cookies是否启用(无论登录过程是否尝试设置cookie,设置一个测试cookie看看是否有效)。

    李>
  6. 尝试添加域路径,setcookie('name','14', time()+3600, '/', 'yourSite.com')

  7. 为 IP 地址和本地主机禁用 cookie 是一项设计决策,您有域名吗?

希望对您有所帮助。

【讨论】:

  • 1) 我正在从不同的测试页面读取它,但 cookie 仍然不存在。 2) Chrome 表示 cookie 集是 PHPSESSID ID username from /cloudshop/internal/ajax/login username from /cloudshp/internal/ajax` password from /cloudshop/internal/ajax password from /internal/ajax/loginid from @ 987654338@ 4) setCookie(); 为所有这些输出1 5) 如果使用jQuery Cookie,则正确设置cookies 7. 我没有域,但可以从localhost 设置cookies
  • @mrkirby153 这很奇怪。无论如何,由于您正在使用本地主机,它是否在 chrome 中说 cookie 来自本地主机(这是您的项目目录 /cloudshop/internal/ajax )?如何创建一个新项目和一个单独的脚本页面,然后使用最少的行数设置一个 cookie,看看它是否有效。
【解决方案3】:

我自己修好了。它正在设置 cookie。对于域/internal/cloudshop/login。将 setCookie 更改为 setCookie("username", $username, "/") 解决了问题

【讨论】:

    猜你喜欢
    • 2013-03-31
    • 2014-06-10
    • 2013-08-22
    • 2014-02-08
    • 2017-03-30
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    相关资源
    最近更新 更多