转到正文

浪淘沙

静观己心,厚积薄发

存档

标签: cookie

最近遇到了几个session无效的问题。总结起来有以下几点:

1、session_start       查看session 是否正确开启了 (php.ini 查看 session.auto_start 设置)

2、如果使用了session_set_cookie_params 方法 查看当前domain和设置的domain是否一致

3、php.ini 如果设置 session.save_handler = files  查看 session.save_path = “N;/path” 是否有写权限 (如果系统安装多套php环境的话更要注意这个问题)

4、php.ini 如果设置 session.use_cookies = 1  查看cookie是否可以正确使用(cookie中 PHPSESSIONID 是否正确生成)

5、php.ini 如果设置了 session.cookie_domain ,查看当前域名是否和该domain一致。

6、查看cookie是否正确设置(cookie domain和path是否和当前domain和path一致)。

基本上就这些问题。

咱们做WEB都知道COOKIE和SESSION这对好基友。他们2个总是如影相随。大部分人也是知道如果客户端禁用COOKIE(发送request的时候不发送COOKIE或者直接unset($_COOKIE)来模拟禁用COOKIE)SESSION还是可以用了。只需要通过GET或者POST的方式传递过来SESSIONID即可。具体的做法如下:


<?php
unset($_COOKIE);//禁用cookie
$sid = isset($_REQUEST['sid']) ? $_REQUEST['sid'] :'';
if ($sid) {//如果将sessionid传递了过来,先设置sessionid 然后 开启session PS:session_id方法必须在session_start()之前调用,否则无效
session_id($sid);
}
session_start();
$sid = session_id();

if (isset($_SESSION['content'])) {
echo 'get session:',$_SESSION['content'],'<br/>';
} else {
$_SESSION['content'] = 'content';
echo 'save session<br/>';
}
echo '<a href="./session.php?sid='.$sid.'">one more</a>';

1、session保存在服务器,客户端不知道其中的信息;cookie保存在客户端(也就是session一般用在后台,而cookie一般用在前台!),服务器能够知道其中的信息。

2、session中保存的是对象,cookie中保存的是字符串。

3、session不能区分路径,同一个用户在访问一个网站期间,所有的session在任何一个地方都可以访问到。而cookie中如果设置了路径参数,那么同一个网站中不同路径下的cookie互相是访问不到的。
4、session需要借助cookie才能正常工作。如果客户端完全禁止cookie,session将失效。
5、 session在用户会话结束后就会关闭了,但cookie因为保存在客户端,可以长期保存
6、 COOKIE:是服务端向客户端写入的小的片段信息。session信息保存在服务器缓存区,不会在客户端显现。当你第一次登陆一个网站,服务器向你的机器写得片段信息。你可以在Internet选项中找到存放cookie的文件夹。如果不删除,cookie就一直在这个文件夹中。下次访问时会自动发送对应的Cookie到服务器端。 继续阅读

一、术语session
在我的经验里,session这个词被滥用的程度大概仅次于transaction,更加有趣的是transaction与session在某些语境下的含义是相同的。

session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。有时候我们可以看到这样的话“在一个浏览器会话期间,…”,这里的会话一词用的就是其本义,是指从一个浏览器窗口打开到关闭这个期间①。最混乱的是“用户(客户端)在一次会话期间”这样一句话,它可能指用户的一系列动作(一般情况下是同某个具体目的相关的一系列动作,比如从登录到选购商品到结账登出这样一个网上购物的过程,有时候也被称为一个transaction),然而有时候也可能仅仅是指一次连接,也有可能是指含义①,其中的差别只能靠上下文来推断②。

然而当session一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这样两个含义,“面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道,比如打电话,直到对方接了电话通信才能开始,与此相对的是写信,在你把信发出去的时候你并不能确认对方的地址是否正确,通信渠道不一定能建立,但对发信人来说,通信已经开始了。“保持状态”则是指通信的一方能够把一系列的消息关联起来,使得消息之间可以互相依赖,比如一个服务员能够认出再次光临的老顾客并且记得上次这个顾客还欠店里一块钱。这一类的例子有“一个TCP session”或者“一个POP3 session”③。 继续阅读