Cookie和Session

Cookie

一、了解Cookie

Cookie是在HTTP协议下,通过服务器或脚本语言可以维持客户浏览器上信息的一种方式。Cookie是一种客户浏览器端储存数据并以此来跟踪和识别用户的机制。Cookie是Web服务器暂时储存在用户硬盘上的一个文本文件,并随后被Web浏览器读取。Cookie文件中的内容大多都经过了加密处理。只有服务器的CGI处理程序才知道它们真正的含义。

二、Cookie的功能

  1. 记录访客的某些信息。记录用户访问网页的次数,或者记录访客曾经输入过的信息。另外,某些网站以可使用Cookie自动记录访客上次登陆的用户名。
  2. 在页面之间传递变量。浏览器并不会保存当前页面上的任何变量信息,当页面被关闭时页面上的所有变量信息将随之消失。如果用户需要把一个变量传递到另一个页面,可以把这个变量保存以Cookie形式保存下来,然后下一页通过读取该Cookie来获取该变量的值。
  3. 将所查看的Internet页存储在Cookie临时文件夹中,可以提高以后浏览的速度。

三、创建Cookie

在PHP中通过setcookie( ) 函数创建Cookie,Cookie是HTTP头标的组成部分,而头标必须在页面其他内容之前发送,因此它必需最先输出。若在setcookie( ) 函数前输出一个HTML标记、echo语句,甚至一个空行都会导致程序错误。

语法:bool setcookie(string name[, stirng value[, int expire[, string path[, string domain[, int secure]]]]]);

参数:

  • name:Cookie的变量名,可以通过$_COOKIE["cookiename"]调用变量名为cookiename的Cookie
  • value:Cookie变量的值。该值保存在客户端,不能用来保存敏感信息,通过$_COOKIE["values"]获取名为values的值
  • expire:Cookie的失效时间,expire是标准的UNIX事件标记,可以用time( )函数或mktime( )函数获取,单位为秒。如果不设置Cookie的失效时间,那么在会话期间内Cookie将永远有效,除非手动删除。
  • path:Cookie在服务器端的有效路径。如果该参数设置为"/",则它在整个domain内有效,如果设置为"/11",它在domain下的/11目录及子目录内有效。默认是当前目录。
  • domain:Cookie有效的域名。如果要使Cookie在mrbcd.com域名下的所有子域都有效,应该设置为mrbcd.com
  • secure:知名Cookie是否仅通过安全的HTTPS,值为0或1。如果值为1,则Cookie只能在HTTPS连接上有效;如果值为默认值0,则Cookie在HTTP和HTTPS连接上均有效。

四、读取Cookie

语法:$_COOKIE[name];

五、删除Cookie

当Cookie被创建后,如果没有设置它的失效时间,其Cookie文件会在关闭浏览器时被自动删除。如果要在关闭浏览器之前删除Cookie文件,方法有两种:一种是使用setcookie( )函数删除,另外一种是在浏览器中手动删除cookie。

1. 使用setookie( ) 函数删除Cookie

删除Cookie和创建Cookie的方式基本类似,删除Cookie也使用setcookie( ) 函数。删除Cookie只需要将setcookie( ) 函数中的第二个参数设置为空值,将第三个参数Cookie的失效时间设置小于系统当前时间即可(把失效时间设置为0,也可以直接删除Cookie)。

语法:setcookie("name", "", time( ) -1); 

2. 在浏览器中手动删除Cookie

在浏览器中打开”开发者工具模式“,在network或者调试程序中找到cookie文件(因为不同的浏览器cookie的位置不同),然后手动删除需要删除的cookie即可。

 

Session

一、了解Session

Session是指一个终端用户与交互系统进行通信的时间间隔,通常是指从进入系统到注销退出系统所经过的事件。

工作原理:当启动一个Session会话时,会生成一个随机且唯一的Session_id,也就是Session的文件名,此时Session_id储存在服务器内存中,当关闭页面时此id会自动注销,重新登陆此页面,会再次生成一个随机且唯一的id。

功能:由于网页是一种无状态的连接程序,因此无法得知用户的浏览状态。通过Session则可记录用户的相关信息,一共用户再次以此身份对Web服务器提交要求时作确认。

二、创建会话

创建一个会话需要通过一下步骤:启动会话 -> 注册会话 -> 使用会话  -> 删除会话

1. 启动会话

启动PHP会话有两种方式:一种使用session_start( ) 函数,另一种用session_register( ) 函数为会话创建一个变量来隐含地启动会话。

  • 使用session_start( ) 函数启动会话

   语法:bool session_start(void);使用session_start( )函数之前浏览器不能有任何输出。

  • 使用session_register( ) 函数创建会话

session_register( )函数用来为会话创建一个变量来隐含地启动会话,但要求php.ini文件的选项,及将register_globals指令设置为on,然后重新启动Apache服务器即可。

使用session_register( )函数,不需要调用session_start( ) 函数,PHP会在创建变量之后隐含地调用session_start( ) 函数。

2. 注册会话

会话变量被创建后,全部保存在数组$_SESSION中,通过数组$_SESSION创建一个会话变量很容易,只要直接给该组添加一个元素即可。

语法:$_SESSION[name] = value;

3. 使用会话

首先需要判断会话变量是否有一个会话ID存在,如果不存在,就创建一个,并且使其能够通过全局数组$_SEEION进行访问。如果已经存在,则将这个已经创建的会话变量载入以供用户使用。

4. 删除会话

删除会话的方法主要有删除单个会话、删除多个会话和结束当前会话3种

  • 删除单个会话

删除单个会话即删除单个会话变量,同数组的操作一样,直接注销$_SESSION数组的某个元素即可

语法:unset($_SESSION["user"]);

  • 删除多个会话

删除多个会话即一次注销所有的会话变量,可以铜鼓将一个空的数组赋值给$_SESSION来实现

语法:$_SESSION = array();

  • 结束当前会话

整个会话已经结束,首先应该注销所有的会话变量,然后使用session_destroy()函数清除结束当前的会话,并清空会话中的所有资源,彻底销毁Session。

语法:session_destroy( );

五、Session设置事件

1. 客户端没有禁止Cookie

  • 使用session_set_cookie_params()设置Session的失效时间。

- session_set_cookie_params()必需session_start()之前调用;

- 不推荐使用此函数,此函数在一些浏览器上会出现问题,所以一般手动设置失效时间。

  • 使用setcookie()函数可对Session设置失效时间。失效时间和Cookie失效时间一样。

2. 客户端禁止Cookie

当客户端禁用Cookie时,Session页面间传递会失效,解决方法有4种

  • 登陆之前提醒用户必需打开Cookie,这是很多论坛的做法。
  • 设置php.ini文件中的session_use_trans_sid = 1,或者编译时打开-enable-trans-sid选项,让PHP自动跨页面传递session_id。
  • 通过GET方法,隐藏表单传递session_id。
  • 使用文件或者数据库储存session_id,在页面间传递中手动调用。

六、Session临时文件

在服务器中,如果将所用用户的Session都保存到临时目录下,会降低服务器的安全性和效率,打开服务器存储的站点会非常慢。在PHP中,使用函数session_save_path()可以解决这个问题。

session_save_path()函数应在session_start( )函数之间调用。

七、Session缓存

Session缓存是将网页中的内容临时存储到IE客户端Temporary Internet Files文件夹下,并且可以设置缓存时间。如果再次访问网页可以直接读取缓存中的内容,从而提高网站的浏览效率。

Sessin缓存使用session_cache_limiter( ) 函数。

语法:string session_cache_limiter([string cache_limiter]);

参数:cache_limiter为public或private,同时Session缓存并不是指在服务器端而是在客户端缓存,在服务器中没有显示。

缓存时间的设置,使用session_cache_expire( ) 函数。

语法:int session_cache_expire([int new_cache_expire]);

参数;new_cache_expire是Session缓存的时间,单位为分钟。

这两个Session缓存函数必须在session_start( )调用之前使用,这两个函数添加参数为设置,不加参数表示为读取。

八、Session数据库存储

解决Session存储文件将临时文件夹填满而造成瘫痪,用到Session数据库存储。也就是PHP中session_set_save_handler( )函数

语法:bool session_set_save_handler(string open, string close, string read, string write,string destroy, string gc);

参数:

  • open(save_path, session_name),找到Session存储地址,取出变量名称
  • close(),不需要参数,关闭数据库
  • read(key),读取Session键值,key对应session_id。
  • write(key, data),其中data对应设置的Session变量
  • destroy(key),注销Session对应Session键值。
  • gc(expire_time),清除过期Session记录。
function _session_open($save_path, $session_name){
    global $handle;
//    连接MySQL数据库
    $handle = mysqli_connect('localhost', 'root', 'root') or die("数据库连接失败");
//    找到数据库
    mysql_select_db('test', $handle) or die("数据库中没有此库名");
    return(true);
}
function _session_close(){
    global $handle;
    mysql_close($handle);
    return(true);
}
function _session_read($key){
    global $handle;
    $time = time();
    $sql = "select session_data from tb_session where session_key = '$key' and session_time > $time";
    $result = mysql_query($sql, $handle);
    $row = mysql_fetch_array($result);
    if($row){
        return ($row['session_data']);
    }else{
        return(false);
    }
}
function  _session_write($key, $data){
    global $handle;
//    设置失效时间
    $time = 60*60;
    $lapse_time = time()+$time;
    $sql = "select session_data from tb_session where session_key = '$key'  and session_time > $lapse_time";
    $result = mysql_query($sql, $handle);
    if(mysql_num_rows($result) == 0){
        $sql = "insert into tb_session values('$key', '$data', '$lapse_time')";
        $result = mysql_query($sql, $handle);
    }else{
        $sql = "update tb_session set session_key = '$key', session_data = '$data',session_time = $lapse_time where session_key ='$key'";
        $result = mysql_query($sql, $handle);
    }
    return($result);
}
function _session_destroy($key){
    global $handle;
    $sql = "delete from tb_session where session_key ='$key'";
    $result = mysql_query($sql, $handle);
    return($result);
}
function _session_gc($expiry_time){
    global $handle;
    $lapse_time = time();
    $sql = "delete from tb_session where expiry_time<$lapse_time";
    $result = mssql_query($sql, $handle);
    return($result);
}
session_set_save_handler('_session_open','_session_close','_session_read','_session_write','_session_destroy','_session_gc');
$_SESSION["user"] = "mr";
$_SESSION["pwd"] = 'mrsoft';

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值