当前位置: 澳门新濠3559 > 编程 > 正文

PHP用SetCookie函数来设置Cookie,多个页面切换时

时间:2019-11-22 20:51来源:编程
正文: 上文》的最后提到了Cookie和Session,本文就这两种技术作一些介绍。Cookie我们都常把它念成“库记”,也叫它“小甜点”。它是一种存储在客户浏览器中的一个小文件。它是为解

正文: 上文》的最后提到了Cookie和Session,本文就这两种技术作一些介绍。 Cookie我们都常把它念成“库记”,也叫它“小甜点”。它是一种存储在客户浏览器中的一个小文件。它是为解决HTTP的一次连接而无崐记忆而发展起来的,可用来追踪使用者或是对重返的使用者进行确认。PHP对此提供了setcookie()函数,可以设定Cookie。因为Cookies算是崐HTTP标头的一部分。所以,setcookie()函数必须在网页数据传给浏览器之前调用。这同调用header()函数是一样的。 Cookie必须由主机端提供;所以,我们必须在CGI程序中送出一个设定了cookie的标头。如下是PHP中调用setcookie()函数设定cookie的崐例子: 其中,user为该cookie的名称;wind为该cookie的值;time()+3600为该cookie的有效时间;/php/为该cookie的相关路径; 其实,我们除了使用这种方式设定cookie外,还可使用header()函数如:header("Set-Cookie:user=wind"),不过这要对HTTP的头部信崐息有所了解才行,所以笔者不建议使用这种方式,还是使用setcookie()方便些。 读取cookie时,浏览器在连接某个网站时,会自动先检查是否有该站的cookie,有的话将会自动传给服务器,而在PHP中,会将传回的co崐okie作为一个变量。如上面所设的cookie返回后,会形成一个$user变量,其值为wind。 但是,cookie有个致命的缺点,就是若客户关了cookie接收,无法向客户端存放cookie时,一切操作就会出错。因此,在PHP4中提供了S崐ession来代替Cookie。 Session与Cookie的最大区别在于Cookie将信息存于客户端,而Session则是存于服务器端。其实,Session是对PHP脚本提供了一个全局崐变量。例子如下: 设置一个Session,名为user,值为wind 读Session,显示结果为“欢迎你!wind” 本文只是浅谈了一下Cookie和Session技术,对于想具体了解该技术的人,还请参考别的书藉。 ----

删除cookie:

setCookie(‘user’); 仅导入第一个参数cookie的识别名{生存时间为空,生存期限与浏览器一样}

setCookie(‘age’,’’,time; 把目标cookie设定为’已过期’状态{系统会自动删除超时的客户端cookie程序}

code…..

2.1.1 通过cookie传送sessin ID

     使用session_start()调用session,服务器端在生成session文件的同时,生成session ID哈希值和默认值为PHPSESSID的session name,并向客户端发送变量为(默认的是)PHPSESSID(session name),值为一个128位的哈希值。服务器端将通过该cookie与客户端进行交互。
     session变量的值经php内部系列化后保存在服务器机器上的文本文件中,和客户端的变量名默认情况下为PHPSESSID的coolie进行对应交互。
     即服务器自动发送了http头:header('Set-Cookie: session_name()=session_id(); path=/');
     即setcookie(session_name(),session_id());
    当从该页跳转到的新页面并调用session_start()后,PHP将检查与给定ID相关联的服务器端存贮的session数据,如果没找到,则新建一个数据集。

2.1.2 通过URL传送session ID

只有在用户禁止使用cookie的时候才用这种方法,因为浏览器cookie已经通用,为安全起见,可不用该方法。 <a href="p.php?<?php print session_name() ?>=<?php print session_id() ?>">xxx</a>,也可以通过POST来传递session值.

Session的配置

php.ini文件中和Session有关的,一些有意义的选项

  • session.auto_start user访问任何页面时,都自动开启并初始化Session, 默认禁用

{类定义必须在会话启动之前被载入,打开此项,不能在会话中存放对象,

Session.auto_start = 1 则无需在每个脚本中使用Session-start()函数来开启session

}

  • session.cookie_domain 传递会话ID的Cookie的作用域。 默认none
  • session.cookie_lifetime 默认 0
  • session.cookie_path 默认 /
  • session.name 会话名称,。 默认 PHPSESSID
  • session.save_path 对于files处理器, 创建会话数据文件的路径 默认 /tmp
  • session.use_cookies 是否使用Cookie 在客户端保存会话ID,1允许 默认 1
  • session.user_trans_sid 是否使用明码在URL中显示SID 默认禁止

{基于URL的会话管理宗洪超比基于Cookie的会话管理有更多的风险,应当禁用}

  • session.gc_probability /session.gc_divisor

定义在每次初始化会话时,启动垃圾回收程序的概率。对会话页面访问越频繁,概率越小。建议值(1/1000~5000) 默认值 1/100 开发值默认1/1000

  • session.gc_maxlifetime 超过次参数设置的秒数后,保存的数据将被是为’垃圾’,并有垃圾回收程序清理 默认 1440
  • session.save_handler 存储和检索与会话关联的数据的处理器名字,

可以使用(files/user/sqlite/memcache)中的一个值, 默认 files

如果想要使用自定义的处理器(数据库/MemCache),可用”user”

PHP相关函数

1.5 常见问题解决

1) 用setcookie()时有错误提示,可能是因为调用setcookie()前面有输出或空格。也可能你的文档使从其他字符集转换过来,文档后面可能带有BOM签名(就是在文件内容添加一些隐藏的BOM字符)。解决的办法就是使你的文档不出现这种情况。还有通过使用ob_start()函数有也能处理一点。
2) $_COOKIE受magic_quotes_gpc影响,可能自动转义
3) 使用的时候,有必要测试用户是否支持cookie
<!--[if !supportLineBreakNewLine]-->

注册一个会话变量和读取session:

一、 注册和读取Sesson变量,都要通过访问$_SESSION数组完成,必须在开启session_start()之后 {Session_start(); $_SESSION[‘username’] = ‘sky’;}

二、 保存Session变量的文件 变量名|类型:长度:值

三、 读取值的时候,先从session文件中获取全部数据信息进入$_SESSION数组中

*****************其中文件名是session-name,内容是PHP序列化的格式

2. PHP的Session

session使用过期时间设为0的cookie,并且将一个称为session ID的唯一标识符(一长串字符串),在服务器端同步生成一些session文件(可以自己定义session的保存类型),与用户机关联起来。web应用程序存贮与这些session相关的数据,并且让数据随着用户在页面之间传递。

访问网站的来客会被分配一个唯一的标识符,即所谓的会话 ID。它要么存放在客户端的 cookie,要么经由 URL 传递。

会话支持允许用户注册任意数目的变量并保留给各个请求使用。当来客访问网站时,PHP 会自动(如果 session.auto_start 被设为 1)或在用户请求时(由 session_start() 明确调用或 session_register() 暗中调用)检查请求中是否发送了特定的会话 ID。如果是,则之前保存的环境就被重建。 

在PHP脚本中读取Cookie:

$_COOKIE, 单个信息通过$name ,批量处理 遍历数组

在设置Cookie的脚本中,第一次读取cookie information不会生效,必须刷新或到另一个页面才可以看到;因为要先设置到客户端,再次访问时,才能被发送回来!

如果启用该选项,用户的每次请求都会初始化session。不推荐使用,最好通过session_start()显示地初始化session。

2.2 session基本用法实例

<?php
// page1.php
session_start();
echo 'Welcome to page #1';
/* 创建session变量并给session变量赋值 */
$_SESSION['favcolor'] = 'green'; 
$_SESSION['animal'] = 'cat';
$_SESSION['time'] = time();

// 如果客户端使用cookie,可直接传递session到page2.php
echo '<br /><a href="page2.php">page 2</a>';

// 如果客户端禁用cookie
echo '<br /><a href="page2.php?' . SID . '">page 2</a>'; 
/* 
 默认php5.2.1下,SID只有在cookie被写入的同时才会有值,如果该session
 对应的cookie已经存在,那么SID将为(未定义)空
 */
?>

<?php
// page2.php
session_start();
print $_SESSION['animal']; // 打印出单个session
var_dump($_SESSION); // 打印出page1.php传过来的session值
?>

缘由:

访问web页面要使用’ HTTP 协议’ 实现, 而HTTP 协议是无状态协议,即,其没有一个内建机制来维护两个事物之间的状态!

但一个用户在请求一个页面后再请求另一个页面是,要让服务器知道是同一个用户,为了应对这种情况的发生,提供了三种页面之间传递数据的方法

使用a 超链接或header() 函数等重定向方式,在URL的GET请求中附加参数的形式。

也可以通过网页中的隐藏表单来储存user的信息,在post提交表单时传递

{俩个脚本之间的简单数据传送,例如:表单修改或删除数据时,传递对应行ID}

使用Cookie 将用户的状态信息,存放在客户端计算机中,其他程序通过存取cookie来存放user的信息

使用 Session 将用户信息存放在服务器中

{传递的数据较多,次数频繁,需要传递数组,例如:在项目中跟踪一个用户,要为不同权限用户提供不同的动态页面,让每个页面知道who is user now?即,ervery 页面都能获得user的 information,

使用URL需要在跳转的时候都加上同样的信息,带来很大的困难。针对这种情况,选用Cookie 和 Session 技术}

再看session文件:sess_cpt2ah3pi4cu7lo69nfbfllbo7

1.2 Cookie的读取

直接用php内置超级全局变量 $_COOKIE就可以读取浏览器端的cookie.
上面例子中设置了cookie"TestCookie",现在我们来读取:

print $_COOKIE['TestCookie'];

概念:

在同一个网站上,多个页面切换时,保持用户登录状态,访问的都登录用户是自己的信息;

在网站中跟踪一个用户,处理在同一个网站中同一个用户在多个页面为其共享数据!

允许服务器跟踪同一个客户端做出的连续请求!

指定保存session文件的目录,可以指定到别的目录,但是指定目录必须要有httpd守护进程属主(比如apache或www等)写权限,否则无法回存session数据。它还可以写成这样session.save_path = “N;/path” 其中N是整数。这样使得不是所有的session文件都保存在同一个目录中,而是分散在不同目录。这对于服务器处理大量session文件是很有帮助的。(注:目录需要自己手工创建)

最近读了一点《PHP核心技术与最佳实践》,看了cookie和session,有所收获,结合之前的认识参考了几篇博客,总结一下~~

会话控制

3,session.auto_start = 0

1.6 cookie工作机理

a) 服务器通过随着响应发送一个http的Set-Cookie头,在客户机中设置一个cookie(多个cookie要多个头). 
b) 客户端自动向服务器端发送一个http的cookie头,服务器接收读取.

HTTP/1.x 200 OK
X-Powered-By: PHP/5.2.1
Set-Cookie: TestCookie=something from somewhere; path=/
Expires: Thu, 19 Nov 2007 18:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-type: text/html

这一行实现了cookie功能,收到这行后
Set-Cookie: TestCookie=something from somewhere; path=/
浏览器将在客户端的磁盘上创建一个cookie文件,并在里面写入:

TestCookie=something from somewhere;
/

这一行就是我们用setcookie('TestCookie','something from somewhere','/');的结果。也就是用header('Set-Cookie: TestCookie=something from somewhere; path=/');的结果。

注销变量和销毁session

1) Session_destroy()函数 结束当前会话, 并清空会话中的所有资源,关闭session运作,删除session文件。成功返回true,失败返回false {但不会释放和当前session相关的变量,也不会删除保存在客户端Cookie中的Session ID}

2) unset()函数来释放session中的单个变量 unset($_SESSION[‘user’]);

{一定注意,不要使用unset($_SESSION)删除整个$_SESSION数组,这将不能通过$_SESSION来注册变量,}

需要删除session中注册的所有变量,给$_SESSION赋值空数组 $_SESSION= array();

3) session_name()获取session的名称,删除session ID setcookie(session_name(),’’,time-1,’/’)

4) 注销Session的完整过程,4步走:

<?php

//第一步: 开启session并初始化

session_start();

//第二步: 删除所有Session的变量,

$_SESSION = array();

//第三步: 使用基于cookie 的session ,使用setCookie()删除包Session Id的Cookie

If(isset($_COOKIE[session_name{

setCookie(‘seesion_name()’,’’,time()-1,’/’)
}

//第四步: 最后彻底销毁Session

session_destroy();

注意:

$_SESSION = array(); 清空$_SESSION数组的同时,也将服务器对应的Session文件内容清空。

session_destroy();将服务器对应的Session文件删除

当退出的时候使用:

2.4 删除session

要三步实现

<?php
session_destroy();                                      // 第一步: 删除服务器端session文件,这使用 
setcookie(session_name(),'',time()-3600);  // 第二步: 删除实际的session: 
$_SESSION = array();                                  // 第三步: 删除$_SESSION全局变量数组
?>

session的应用:

session将资料存放在服务器,user无法停止使用。打个比方session是商场给你办理并保存会员卡,用户只需提供卡号就能查到相关信息!

在客户端仅需保存有服务器为user创建的一个session标识符,称为Session ID;而在服务器端(文件/数据库/MemCache)保存session变量的值。

Session ID是一个不重复,不容易找到规律的,32位十六进制数组成的字符串

Session ID保存在 客户端Cookie里,如果user 组织Cookie的使用,则可以将Session ID保存在用户浏览器地址的URL中。

可以防止header提示错误);

1.3 删除cookie **

Cookie没有显示的删除,如果要删除Cookie,应该将Cookie的expire设置成过期的时间,如一个小时前、1970年,这回自动触发浏览器的删除机制,或者把值设置为空。例如:

setcookie("name","",time()-1);

用header()类似。

Cookie的应用:

Cookie是服务器发给客户端的片段信息!.存储在客户端浏览器的内存或硬盘上,在客户请求该服务时发回它!打个比方就像是商场提供用户会员卡或积分卡,有期限!

通过验证,成功登陆网站后,以键值对的形式设置到cookie中(通过HTTP 响应头信息发送给客户端)

再次访问同一个服务器其他php脚本,自动携带Cookie中的information一起访问(通过HTTP 响应头信息返回给服务器)

Windows系统中,cookie文件存放在”C:Document and Setting用户名Cookies ” 文件夹

Session介绍

2.5 session在PHP大型web应用中的使用

对于访问量大的站点,用默认的session存贮方式并不适合,目前最优的方法是用数据库存取session。这时,函数bool session_set_save_handler ( callback open, callback close, callback read, callback write, callback destroy, callback gc )就是提供给我们解决这个问题的方案。 该函数使用的6个函数如下:

1.   bool open() 用来打开会话存储机制。

2.   bool close() 关闭会话存储操作。

3.  mixde read() 从存储中装在session数据时使用这个函数。

4.   bool write() 将给定session ID的所有数据写到存储中。

5.   bool destroy() 破坏与指定的会话ID相关联的数据。

6.   bool gc()  对存储系统中的数据进行垃圾收集。

例子见php手册session_set_save_handler() 函数。
如果用类来处理,用
session_set_save_handler(
    array('className','open'),
    array('className','close'),
    array('className','read'),
    array('className','write'),
    array('className','destroy'),
    array('className','gc'),

调用className类中的6个静态方法。className可以换对象就不用调用静态方法,但是用静态成员不用生成对象,性能更好。

session存入mysql数据库表可以使用MEMORY引擎,MEMORY引擎采用内存表,所有数据存储在内存,操作速度快,对于session这种形式的数据正好适用,但在大流量的网站中,Session入库存在效率不高、占数据库connection资源等问题。针对这种情况,可以使用Memcached、Redis等Key-Value数据存储方案实现高并发、大流量的Session存储。

Session 的声明与使用 :

Session的设置不同于Cookie,必须先启动,在PHP中的调用session_start()函数,以便让PHP核心程序,将和Session相关的内建环境变量预先载入至内存中。

bool session_start() 1/没有参数 2/返回值均为TRUE

3/两个主要作用:①开启一个会话②返回已经存在的会话

第一次访问网站, Session_start()函数会创建一个唯一的 Session ID,

并自动通过HTTP响应头,保存到客户端cookie中,

同时在服务器创建一个以这个Session ID命名的文件,用于保存user的会话信息

再次访问这个网站,会自动通过HTTP请求头将客户端Cookie中保存的Session ID在携带过来,Session_start()不会再去新分配一个新的Session ID,而是在服务器硬盘中去寻找和此 Session ID同名的Session文件,将之前保存的user信息读出,在当前脚本应用

使用基于Cookie的session,在开启session之前,不能有任何输出,session_start()要设置cookie值,类似setCookie()的原因

 

1.1.2. 使用header()设置cookie

header("Set-Cookie: name=$value[;path=$path[;domain=xxx.com[;...]]");

后面的参数和上面列出setcookie函数的参数一样.
比如:

<?php
$value = 'something from somewhere';
header("Set-Cookie:name=$value");
?>

设置Cookie:

Cookie的建立十分简单,只要浏览器支持,就可以使用内建的setCookie()函数来建立

Cookie是HTTP标头的一部分,因此setCookie()函数必须在其他信息被输出到浏览器之前使用。

① 不能有空行空格 ,

② 引入的文件在<?php ?>后面有空行空格

③ 保存为dom+utf8形式

setcookie( $name[, $value, $expire] )

$name Cookie识别名称

$value Cookie值

$expire 生存期限 unix时间戳

存储数组形态的cookie

setcookie() 第一个参数标识名称带数组下标的形式设置

setcookie(“user[name]”,”lili”);

注意:当前设置的Cookie不是立即生效的,而是要等到下一个页面时才能看到.这是由于在设置的这个页面里Cookie由服务器传递给客户浏览器,在下一个页面浏览器才能把Cookie从客户的机器里取出传回服务器的原因。

2.6 常用session函数

bool   session_start(void); 初始化session
bool   session_destroy(void): 删除服务器端session关联文件。
string session_id() 当前session的id
string session_name() 当前存取的session名称,也就是客户端保存session ID的cookie名称.默认PHPSESSID。
array  session_get_cookie_params() 与这个session相关联的session的细节.
string session_cache_limiter() 控制使用session的页面的客户端缓存
ini    session_cache_expire() 控制客户端缓存时间
bool   session_destroy()     删除服务器端保存session信息的文件
void   session_set_cookie_params ( int lifetime [, string path [, string domain [, bool secure [, bool httponly]]]] )设置与这个session相关联的session的细节
bool session_set_save_handler ( callback open, callback close, callback read, callback write, callback destroy, callback gc )定义处理session的函数,(不是使用默认的方式)
bool session_regenerate_id([bool delete_old_session]) 分配新的session id

我们可以这样理解:

1.1.1 使用setcookie()函数设置cookie

bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, bool secure [, bool httponly]]]]]] )
     name:   cookie的名称,即$_COOKIE这个全局数组的键值
     value:   cookie变量的值,参数为空,Cookie的值为空。Cookie不能保存boolean值,应用0表示false,1表示true。
     expire:  有效期结束的时间,以秒为单位。
     path:    有效目录,默认为“/”,即整个域名下有效。如果有需要,可以设置仅在某目录下有效。
     domain: 有效域名,顶级域唯一,默认在本域名下。
     secure:  是否对Cookie进行加密传输,默认为false.如果值为true,则cookie只能在https连接上有效,如果为默认值false,则http和https都可以。
    httponly: 是否只使用HTTP访问Cookie。如果为1或true,客户端的javascript就无法操作Cookie,使用此参数可以减少XSS攻击的风险,但不是所有的浏览器都支持这个参数。此参数只在PHP5.2.0以上的版本有效。

例子:

<?php
$value = 'something from somewhere';

setcookie("TestCookie", $value); /* 简单cookie设置 */
setcookie("TestCookie", $value, time()+3600); /* 有效期1个小时 */
setcookie("TestCookie", $value, time()+3600, "/~rasmus/", ".example.com", 1); /* 有效目录 /~rasmus,有效域名example.com及其所有子域名 */
?>

设置多个cookie变量: setcookie('var[a]','value');用数组来表示变量,但他的下标不用引号。这样就可以用$_COOKIE[‘var’][‘a’]来读取该COOKIE变量。

setrawcookie的功能和参数与setcookie基本一样,唯一的区别是setrawcookie不会对Cookie中的value进行urlencode转码。

PHP在当前页面设置的Cookie不能立即生效,要等到下一个页面才能看到,如果是javascript设置的,是立即生效的。

setcookie('name','PHP淮北');

2.7 session安全问题

攻击者通过投入很大的精力尝试获得现有用户的有效会话ID,有了会话id,他们就有可能能够在系统中拥有与此用户相同的能力。
因此,我们主要解决的思路是效验session ID的有效性.

<?php

if(!isset($_SESSION['user_agent'])){
    $_SESSION['user_agent'] = $_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'];
}

/* 如果用户session ID是伪造 */
elseif ($_SESSION['user_agent'] != $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']) {
    session_regenerate_id();
}
?>

2.8 Session通过cookie传递和通过SID传递的不同

在php5.2.1的session的默认配置的情况下,当生成session的同时,服务器端将在发送header set-cookie同时生成预定义超级全局变量SID(也就是说,写入cookie和抛出SID是等价的.),当$_COOKIE['PHPSESSID']存在以后,将不再写入cookie,也不再生成超级全局变量SID,此时,SID将是空的。

  1. 首先是必须在HTML文件的内容输出之前设置(Cookie是HTTP协议头的一部分,用于浏览器和服务器之间传递信息,所以必须在任何属于HTML文件本身的内容输出之前调用Cookie函数。

2.9 session使用实例

<?php
/**
 * 效验session的合法性
 *
 */
function sessionVerify() {
    if(!isset($_SESSION['user_agent'])){
        $_SESSION['user_agent'] = MD5($_SERVER['REMOTE_ADDR']
        .$_SERVER['HTTP_USER_AGENT']);
    }
    /* 如果用户session ID是伪造,则重新分配session ID */
    elseif ($_SESSION['user_agent'] != MD5($_SERVER['REMOTE_ADDR'] 
    . $_SERVER['HTTP_USER_AGENT'])) {
        session_regenerate_id();
    }
}

/**
 * 销毁session
 * 三步完美实现,不可漏
 *
 */
function sessionDestroy() {
    session_destroy();
    setcookie(session_name(),'',time()-3600);
    $_SESSION = array();
}
?> 

注明:

session 出现头信息已经发出的原因与cookie一样.``    在php5中,所有php session 的注册表配置选项都是编程时可配置的,一般情况下,我们是不用修改其配置的。要了解php的session注册表配置选项,请参考手册的Session 会话处理函数处。

 代码如下

2.1 sessionID的传送

要删除一个已经存在的Cookie,有两个办法:

1. PHP的COOKIE

cookie 是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制。
PHP在http协议的头信息里发送cookie, 因此 setcookie() 函数必须在其它信息被输出到浏览器前调用,这和对 header() 函数的限制类似。

使用Cookie的注意事项:

2.3 使用session函数控制页面缓存

很多情况下,我们要确定我们的网页是否在客户端缓存,或要设置缓存的有效时间,比如我们的网页上有些敏感内容并且要登录才能查看,如果缓存到本地了,可以直接打开本地的缓存就可以不登录而浏览到网页了。使用session_cache_limiter('private');可以控制页面客户端缓存,必须在session_start()之前调用。控制客户端缓存时间用 session_cache_expire(int);单位(s)。也要在session_start()前调用。这只是使用session的情况下控制缓存的方法,我们还可以在header()中控制控制页面的缓存。

session_register():注册session变量

1.1 设置cookie

    可以用 setcookie() 或 setrawcookie() 函数来设置 cookie。也可以通过向客户端直接发送http头来设置。

5.函数session_destroy()主要用于在系统注销和退出时,销毁所有的session变量,它没有参数,直接调用即可。

1.4 Cookie跨域与P3P协议

正常的Cookie只能在一个应用中共享,即一个Cookie只能由创建它的应用获得。实现Cookie的跨域是为了统一应用平台,即实现目前流行的单点登录。最简单的方式是使用P3P协议。

P3P由万维网协会研制,它为Web用户提供了对自己公开信息的更多的控制。支持P3P的Web站点可以为浏览者声明他们的隐私策略。支持P3P的浏览器 则可以将Web站点的策略与用户的隐私偏好进行对比,并为用户提出不匹配的警告。因此,用户可以被通知有关Web隐私的处理方式。

首先介绍第一方Cookie和第三方cookie: 

第一方Cookie是来自当前正在查看的网站,或者发送到当前正在查看的网站。 

第三方Cookie是来自当前正在查看的网站以外的网站,或者发送到当前正在查看的网站以外的网站。第三方网站通常提供正在查看的网站上的内容。例如,许多站点使用来自第三方网站的广告,或者iframe的别的网站的url,这些第三方的网站可能使用的Cookie。

在第三方的网页上加入P3P的header,想浏览器发送P3P协议就可以解决COOKIE共享的问题,如下

header("P3P","CP="NON DSP COR CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa CONa HISa TELa OTPa OUR UNRa IND UNI COM NAV INT DEM CNT PRE LOC"");

总结:

  1. 不同的浏览器对Cookie的处理机制不一样
  2. cookie限制是在客户端的。一个浏览器能创建的Cookie数量最多为30个,并且每个不能超过4KB,每个WEB站点能设置的Cookie总数不能超过20个。
  3. 当前设置的Cookie不是立即生效的,而是要等到下一个页面时才能看到

1,session.use_cookie = 1
是否采用Cookie方法传递session id值。默认是1,表示启用。
2,session.name = PHPSESSID
不管是Cookie传递sessioin_id,还是GET方法传递session_id,都需要使用键值。他们的格式分别是Cookie:  sess_name=session_id;和/path.php?sess_name=session_id,其中sess_name就是由这里指定的。
3,session.use_only_cookies = 0
表示只使用Cookie 的方法传递session id。我们说过,传递cookie的方法,除了cookie,还有GET方法,GET方法是不安全的方法。在用户端禁用了cookie的时候,会采用GET方法传递session_澳门新濠3559,id,可以通过这个设置尽用GET方法传递session_id。
4,session.cookie_lifetime = 0, session.cookie_path = / 以及session.cookie_domain =
如果使用Cookie方法传递session_id的话,这里分别指定了cookie有效域、目录和时间。分别对应setcookie()函数的形参$expire、$path和$domain。其中cookie_lifetime=0表示直到关闭浏览器才删除Cookie。还可以使用session_set_cookie_params()函数修改这些值。
5,session_name([string $name])
获取或更新session_name。如果传了name,则表示不使用默认的名称PHPSESSID(由session.name)指定,否则获取当前session_name。注意:如果设置session_name,则必须在session_start()之前调用才生效。
6,session_id([string $id])
与session_name()类似,但它是读取或者设置session_id的方法。同样,设置session_id的话,必须在session_start()之前调用才有效。
7,session_set_cookie_params()和session_get_cookie_params()
通过session_set_cookie_params()可以重新设定session.cookie_lifetime, session.cookie_path以及session.cookie_domain这三个php.ini设置。而session_get_cookie_params()则是获取这些设定的值。

 

cookie与session的区别和关系

  $val = "session value";

cookie 常用于识别用户。cookie 是服务器留在用户计算机中的小文件。每当相同的计算机通过浏览器请求页面时,它同时会发送 cookie。通过 PHP,您能够创建并取回 cookie 的值。

3,删除Cookie

比如设置一个名为MyCookier的Cookie,PHP会自动从WEB服务器接收的HTTP头里把它分析出来,并形成一个与普通变量一样的变量,名为$myCookie,这个变量的值就是Cookie的值

 

3.函数session_unregister()与上面函数用法完全相同,但功能相反,上面函数是注册

其中PHPSESSID就是关联服务器session的重要参数

2,会话cookie,没有设置cookie时间,cookie的生命周期也就是关闭浏览器前就消失,一般不会保存在硬盘,而是保存在内存上)

澳门新濠3559 1

PHP用SetCookie函数来设置Cookie。

参数说明:cookie名称,cookie值,过期时间(int),有效路径,有限域名,https传递才有效

第二行是打印session值

右侧:第一行是echo serialize($_SESSION['name']);//序列化

澳门新濠3559 2

带失效时间的: 
setcookie('name','PHP淮北',time()+24*60*60);//1day

从上面的图可以看到:

ob_start();//开启

当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识 (称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来 使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相 关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应 中返回给客户端保存。保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给 服务器。一般这个cookie的名字都是类似于SEEESIONID

使用例子:

  • 存储位置:

需要注意下面几个方面:

session_distroy(): 销毁所有session变量(所有session变量销毁,包括文件)

上图:左侧是保存在xammp/tmp/下的session文件,内容是PHP序列化的格式

 

1.函数session_start()必须在程序最开始执行,在其前面不能有任何输出内容,否则

cookie通过http报头发送:

普通使用:

session变量,而其则是删除指定的session变量.

ob_end_flush(); //刷新缓存

?>

在PHP页面可以先使用

  1. session存储在服务器位置上,可以通过php.ini里面配置session相关配置
  2. cookie存储在客户端上的上(其实可以分两种:

val即为要注册的session变量名,在注册时一定不要加上"$"符号,只写其变量名称即可.

  1. 服务端session的相对于客户端的cookie安全性要较高一点
  2. session在服务器集群的时候容易不同步,而cookie不会

4.函数session_is_registered()用于判断session变量是否注册.

session_start():启用session机制,在需要用到session的程序文件的最开始调用它.

php.ini里面关于session和cookie有关的配置

  1. 一是调用只带有name参数的SetCookie,那么名为这个name的Cookie将被从关系户机上删掉;例如:setcookie('name','');
  2. 另一个办法是设置Cookie的失效时间为time()或time()-1,那么这个Cookie在这个页面的浏览完之后就被删除了(其实是失效了)。 例如:setcookie('name','PHP淮北',time()-24*60*60);
         要注意的是,当一个Cookie被删除时,它的值在当前页在仍然有效的。 

Cookie是面向路径的 ,默认存储在当前文件下,如果没有设置路径,不同文件下的cookie默认保存在不同文件夹下,如图:默认保存在mytest文件夹下

1,持久性cookie,设置了cookie的时间,以文件方式存在硬盘上,

session_unregister(): 删除session变量(一个一个删除)

在PHP中有关Session的函数比较多,不过我们最常用到的也就这么几个函数:

setcookie('username','',time()-3600);
    setcookie('name','',time()-3600);
理论上cookie应该正常清除,测试的时候发现第一登录退出完全正常,但是再次登录就是退出不了,cookie始终存在,很是郁闷,使用firebug查看原来页面设置了缓存,使用nginx设置了页面缓存,原因也就是找到了

session_is_registered(): 判断session变量是否注册

用于读取/回写session数据的方式,默认是files。它会让PHP的session管理函数使用指定的文本文件存储session数据

 

Cookie  name=PHP%BB%B4%B1%B1; PHPSESSID=cpt2ah3pi4cu7lo69nfbfllbo7

  session_register("val");

cookie和session的关系

ps:下午关于使用cookie退出出现的问题

澳门新濠3559 3

SetCookie函数定义了一个Cookie,并且把它附加在HTTP头的后面,SetCookie函数的原型如下:
int SetCookie(string name, string value, int expire, string path, string domain, int secure);

用户端与服务端的web通信协议是http。而PHP通过http取得用户数据惯用的三种方法分别是:POST方法、GET方法还有Cookie。而PHP默认传递方法正是Cookie,也是最佳方法。

 

Session与PHP.ini的关系配置

   sent"类似这样的警告信息.

2,session.save_path = “/xammp/temp/”

    就会出现“Warning:Cannot send session cookie - headers already

session_id的生成格式就是:sess_加上一串PHPSESSID的值

2、接收和处理Cookie

session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息,每一个网站访客都会被分配给一个唯一的标志符,即会话ID,它的存放形式无非两种:要么经过url传递,要么保存在客户端的Cookies里.当然,你也可以将Session保存到数据库里,这样会更安全,但效率方面会有所下降.url方式传递安全性肯定太差,PHP的会话机制是通过设置Cookie,在Cookie中保存会话id(Session ID),在服务器端会生成session文件,与用户进行关联,Web应用程序存储与这些Session相关的数据,并在各页面间进行传递.

<?php

2.函数session_register()用于注册要保存在session中的相关变量,其用法如下:

1,session.save_handler = file

编辑:编程 本文来源:PHP用SetCookie函数来设置Cookie,多个页面切换时

关键词: