php cookie和session的代码操作

1 篇文章 0 订阅
1 篇文章 0 订阅

一、Cookie

cookie是 在客户端保持用户数据

使用PHP代码函数操作cookie

1.1、添加和读取Cookie

setcookie & setrawcookie

两者用法一致

setcookie : 会对cookie的值进行url编码

setrawcookie: 不对cookie的值进行url编码

<?php

/**
 * 读取Cookie
 * @param $param
 */
function read($param){
    //读取Cookie
    print_r($param);
}


//内存存储Cookie
setcookie('username1','lvfk');

//设置过期时间
setcookie('username2','lvfk', time()+30);//10秒后过期

//设置有效路径
setcookie('username3','lvfk', time()+60);//默认当前路径
//设置有效路径,表示同目录及其子目录有效,在上层目录无效,
//同目录及子目录有效:/var/www/,/var/www/a,/var/www/b
//上层目录无效:/var/,或者/var/bb/
setcookie('username4','lvfk', time()+60,'/var/www/');//设置路径
//整个根目录有效
//此时对/var/,/var/bb/,/var/www/,/var/www/a,/var/www/b  等均有效
setcookie('username5','lvfk', time()+60,'/');//根路径

//设置Domain,设置Cookie的作用域,默认在本域下面
//setcookie('username6','lvfk', time()+60,'/','.test.com');
setcookie('username6','lvfk', time()+60,'/','10.168.1.216');

//设置Cookie是否只能通过HTTPs传输,默认为False
setcookie('username7','lvfk', time()+60,'/','10.168.1.216',false);
setcookie('username8','lvfk', time()+60,'/','10.168.1.216',true);

//是否只使用HTTP方案Cookie,默认为False,设置为True时JS无法访问Cookie,可减少XSS攻击
setcookie('username9','lvfk', time()+60,'/','10.168.1.216',false,false);

read($_COOKIE);

1.2、更新cookie

<?php

/**
 * 更新Cookie
 * @param $param
 */


//设置过期时间
//setcookie('username','lvfk', time()+3600);//1小时后过期

//修改cookie(只要对同一个cookie key 操作)
setcookie('username','lvfk123', time()+3600);

1.3、删除cookie

<?php

/**
 * 删除Cookie:原理为对cookie设置过期即可
 * @param $param
 */


//设置过期时间
//setcookie('username','lvfk', time()+3600);//1小时后过期

//删除cookie(只要对cookie设置过期即可)
setcookie('username','lvfk123', time()-1);

二、使用header函数的方式操作cookie

<?php

/**
 * 通过Header函数操作cookie
 * @param $param
 */

//设置内存cookie
header("Set-Cookie: username=yy;");

//设置cookie的过期时间
//先来看看gmdate函数使用方法
//header('Date: '.gmdate('D, d M Y H:i:s \G\M\T', time()));
//header('Last-Modified: '.gmdate('D, d M Y H:i:s \G\M\T', time()));
//header('Expires: '.gmdate('D, d M Y H:i:s \G\M\T', time() + 3600));

//or if you prefer double quotes and don't want to bother with double backslashes:
//header("Date: ".gmdate("D, d M Y H:i:s", time())." GMT");
//header("Last-Modified: ".gmdate("D, d M Y H:i:s", time())." GMT");;
//header("Expires: ".gmdate("D, d M Y H:i:s", time() + 3600)." GMT");

//设置1小时过期
header("Set-Cookie: a=xx;expires=" .gmdate('D, d M Y H:i:s \G\M\T', time() + 3600));

//设置Domain
header("Set-Cookie: b=xx;expires=" .gmdate('D, d M Y H:i:s \G\M\T', time() + 3600).";domain=10.168.1.216;");

//设置path
header("Set-Cookie: e=fe; path=/;");
header("Set-Cookie: ee=fw; path=/;");

//设置安全
header("Set-Cookie: ad=dd; secure");


三、通过JS操作cookie

/**
 * 通过JS操作cookie
 */

var Cookie={
    set: function(key, value, expiresDays){//设置Cookie
		//判断是否设置过期时间
		if(expiresDays){
			var date = new Date();
			date.setTime(date.getTime()+expiresDays*24*3600* 1000);//格式化时间
			//转换为cookie过期时间格式
			var expires = "expires="+date.toGMTString()+";";
		}else{
			var expires = "";
		}
		//使用escape对value进行编码
		document.cookie = key+'='+escape(value)+expires;
	},
	get: function(key){//获取Cookie
		var cookies = document.cookie.replace(/[ ]/g, '');
		var cookieArr = cookies.split(';');
		var res;
		for(var i=0;i<cookieArr.length;i++){
			var arr = cookieArr[i].split('=');
			if(key = arr[0]){
				res = arr[1];
				break;
			}
		}
		return unescape(res);
	}
};

四、HTML5技术

HTML5 提供了两种在客户端存储数据的新方法:


localStorage - 没有时间限制的数据存储,详细API介绍:https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage
sessionStorage - 针对一个 session 的数据存储




4.1、localStorage  API介绍

保存数据:localStorage.setItem(Key, value);
读取数据:localStorage.getItem(Key);
删除指定key数据:localStorage.removeItem(Key);
全部删除:localStorage.clear();
获取指定键名: localStorage.key(idx)


五、session

session是在服务器端保持用户会话数据的一种方法

5.1、session的存储同步
1.如果存储在memcached、redis或者MySQL中比较容易,
2.如果是文件形式的,你可以用NFS统一存储。
3.通过加密的cookie来实现
4.在负载均衡那一层保持会话,把访问者绑定在某个服务器上,他的所有访问都在那个服务器上就不需要session同步了,这些都是运维层面的东西。

5.2、禁用cookie的session使用方案
1.通过隐藏表单提交,

2.url传值:设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项,让PHP自动跨页传递session id,

A、use_trans_sid = 0,需要在链接中手动拼装sessionid,并在页面中读取链接中的sessionid设置到session_id中

链接:test.php?sessionid=xxxxxxxx,

test.php:

session_id($_GET('sessionid');
session_start();
var_dump($_SESSION);
B、use_trans_sid = 1,无需手动拼装链接,也无需手动设置session_id


3.用文件或数据库等形式保存session_id,在跨页过程中手动调用
以上的1和2其实使用的是同样的方法,只是途径不一样。


通过以上的分析我们不难看出,通过cookie传递sessionid,将session存储于memcache服务器中是为一个比较合理的选择。当出现跨域的情况是,可以使用p3p跨域设置cookie。而当客户端禁用cookie的情况下,可以设置php.ini,通过url自动传递session id。

5.3、session操作

//设置及获取回话cookie

session_set_cookie_params — 设置会话 cookie 参数
void session_set_cookie_params ( int $lifetime [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]] )

session_get_cookie_params — 获取会话 cookie 参数
array session_get_cookie_params ( void )

//彻底清空session

session_start();
$_SESSION=[];//将其数据清空
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();//获取会话 cookie 参数
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}

// Finally, destroy the session.
session_destroy();

5.4、session的存储方式

如果不指定, Linux下默认在 "/tmp"目录。
线上在php.ini配置文件了做了指定,session内容存放在memcache缓存里。
默认session内容是存储在文件里的,即session.save_handler = files
下面是设置将session内容保存到redis里


线上环境下的配置:
[Session]
; Handler used to store/retrieve data.
; http://php.net/session.save-handler
;session.save_handler = files
session.save_handler = redis
session.save_path = "redis.test.com:11311,redis.test.com:11312"


5.5、session的存储方式也可以自动实现

<?php

/**
 * 只要通过OOP的方式实现接口SessionHandlerInterface,那么就可以替换系统的session文件存储方式
 * 以下是把session存储到数据库,代码省略...
 */
class SessionUserHander implements SessionHandlerInterface{
    /* Methods */
    public function close (){

    }

    public function destroy ( $session_id ){

    }

    public function gc ( $maxlifetime ){

    }

    public function open ( $save_path , $session_name ){

    }

    public function read ( $session_id ){

    }

    public function write ( $session_id , $session_data ){

    }
}

//设置为session存储类型为自定义user
ini_set('session.save_handler','user');
//设置到session存储的handler,替换默认的文静存储方式
session_set_save_handler(new SessionUserHander(),true);//php 5.4之后,设置第二个参数为true

Warning

在脚本执行完毕之后,PHP 内部会清除对象, 所以有可能不调用 write 和 close 回调函数。 这样可能会引发非预期的行为,所以当使用对象作为会话保存管理器时, 需要通过注册 shutdown 回调函数来规避风险。 通常,你可以通过调用 register_shutdown_function() 函数 来注册 'session_write_close' 回调函数。

在 PHP 5.4.0 中,可以调用 session_register_shutdown() 函数来注册 shutdown 回调函数。 如果你使用 session_set_save_handler() 的 OOP 原型, 那么仅需设置 “register shutdown” 为 TRUE 即可。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值