在登录界面用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
是取不到的.
解决方法有:
就像楼上其他人说的那样在你使用
setcookie
写值的时候, 顺便$_COOKIE['xx'] = $uid;
一下.在你的登陆的那个代码中使用
$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, 再读取是读不到的...必须要在下一个页面或者当前页面刷新后才可以读的到...