首页 > 关于ajax提交后,服务端设置cookie的问题

关于ajax提交后,服务端设置cookie的问题

在登录界面用ajax提交用户名和密码,服务端通过login()方法进行验证。

正确后存入session,同时判断客户端是否勾选记住登录,如果有setcookie。

问题出在服务端setcookie这语句应该是被执行的。但是从客户端里读取不到值。

不用ajax提交,直接页面调用login()是可以的。

可否帮忙分析下原因。
之前查到说是ajax提交会带头部信息,所以会导致服务端setcookie失效。但是服务端并没有报错。
然后用isset去检测这个cookie变量,是被设置的。但是echo $_COOKIE['xx']的时候,不显示。

补充:
这个是ajax代码

 $.ajax({
            type: "post",
            data: {action: "login", username: $("#login_username").val(), password: $("#login_password").val(),remember:remember},
            url: "../lib/ajax_test.php",
            async: false
        });

服务端就这样setcookie的代码

   $cookie_state=setcookie("uid",$uid,time() + 3600);//设置cookie

本地cookie有cookie名,cookie值是空的

array (size=2)
  'uid' => string '' (length=0)

那么问题是出现哪里呢?

自己打开chrome的开发者工具看看


设置cookie 使用setcookie('yy',xx)的同时建议也使用$_COOKIE['yy'] = xx; 赋值,会立即生效


楼主可否提供你的代码? 或者可否正确描述你的代码流程?

根据你目前的描述, 不可能出现得不到值的情况:

证明:

附相关文件的代码:
cookie.html

<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript">

    //提交登陆, 后端写Cookie
    $.post('login.php', {username:'test',password:'test'}, function(){
        //123.php用于输出 login.php 写入的Cookie
        $.get('123.php', function(v){
            alert(v + '\n' + document.cookie);
        });
    });

</script>

login.php

<?php
//写入Cookie, 名字为 xx 值为 当前时间戳(此处直接模拟登陆成功)
setcookie('xx', time());

123.php

<?php

var_dump(isset($_COOKIE['xx']));

var_dump($_COOKIE['xx']);

根据楼主更新后的内容, 我大概明白了他的问题了:

你的情况是同一个文件中, 在使用 setcookie 之后, 想用 $_COOKIE 来获取刚写入的那个值, 对吧?

如果是这样的话, 你可能需要了解一下 setcookie$_COOKIE 的真正含义是什么:
setcookie 在HTTP响应头中增加 set-cookie 字段, 浏览器在接收后会记录下来.
$_COOKIE 获取本次HTTP会话中, HTTP请求头中的Cookie信息.

所以你的问题就是 你写入的Cookie浏览器还没接收到, 所以在本次请求的时候也就不会带上去, 所以你在你处理登陆的那个文件中它后面的代码里使用 $_COOKIE 是取不到的.

解决方法有:

  1. 就像楼上其他人说的那样在你使用setcookie写值的时候, 顺便 $_COOKIE['xx'] = $uid; 一下.

  2. 在你的登陆的那个代码中使用 $uid 来代替 $_COOKIE['xx']

PS:

$.ajax({
            type: "post",
            data: {action: "login", username: $("#login_username").val(), password: $("#login_password").val(),remember:remember},
            url: "../lib/ajax_test.php",
            async: false
        });

//再发一个请求去获取Cookie信息(123.php的代码请参考上面)
$.get('123.php', function(v){
    alert(v);//这里是可以使用 $_COOKIE 得到你上面 ajax_test.php 中写入的Cookie的.
});        

这是cookie的特性, 当前页面设置cookie, 再读取是读不到的...必须要在下一个页面或者当前页面刷新后才可以读的到...

【热门文章】
【热门文章】