会话跟踪技术之SESSION

一般来说,登录信息既可以存储在session中,也可以存储在cookie中,他们之间的差别在于session可以方便的存取多种数据类型,而cookie只支持字符串类型,同时对于一些安全性比较高的数据,cookie需要进行格式化与加密存储,而session存储在服务端则安全性较高

一、SESSION操作

1、 使用SESSION

在使用PHP session时,一定要在页头加上session_start(),告诉服务器开始使用session了,而且在它之前应该没有任何输出,否则会报错。

# 开始一个会话或者返回已经存在的会话
session_start();

2、设置session

$_SESSION['jack']['name'] = 'jack';
$_SESSION['jack']['height'] = 175;
$_SESSION['jack']['weight'] = 160.00;
$_SESSION['jack']['like'] = ['eat','run','sing','jump'];
$_SESSION['jack']['class'] = new test();
$_SESSION['jack']['null'] = null;
$txt = file_get_contents('hello.txt');
$_SESSION['jack']['res'] = $txt;

class test{
    public function abc(){
        echo 'test';
    }
}

echo '<pre>';
var_dump($_SESSION);

session保存在配置文件(session.save_path)指定的服务器路径中。保存的格式:变量名|类型:长度:值

3、判断和删除

isset($_SESSION['name']);   // 判断
unset($_SESSION['name']);   //删除

4、销毁session

如果要清空当前用户所有的Session信息可以使用以下代码:

session_destroy();       //销毁session 结束当前会话

二、SESSION的工作原理

  1. 用户访问WEB网站的时候,比如请求goods.php;

  2. 再运行session_start()时,PHP会给每个访问的用户创建一个session ID

  3. 该ID是唯一ID,同时使用该ID命名生成文本文件,在服务器端保存会话数据,

  4. 同时在客户机上cookie里存储该ID,

  5. 下次用户请求,就会携带该ID,来获取服务器上存储的会话数据

三、SESSION的几个注意点

1、session_start()前的输出

1、使用基于cookie的session时,函数session_start()必须在程序最开始执行,在其前面不能有任何输出内容,否则:

Warning: Cannot send session cache limiter - headers already sent (output started at ...

可以在php.ini里启动session.auto_start=1,这样就无需每次使用session之前都要调用session_start()。但启用该选项也有一些限制,如果确实启用了 session.auto_start,则不能将对象放入会话中,因为类定义必须在启动会话之前加载以在会话中重建对象。

2、session的存储方式

PHP的session默认是通过文件的形式实现的,即存储在服务器端的session文件,每个session一个文件。

文件名形式:sess_jkj7hkfje9klhgop8s0ferascdwedjksjkxj,
内容结构:`变量名 | 类型 |:长度 : 值;

3、客户端禁用Cookie功能

基于cookie的session更优化,但不总是可用。一旦用户关闭cookie,那么session就不起作用啦!所以接下来我们将要把session的id号放在链接地址上,这样就不怕用户关闭cookie啦!

PHP5在linux平台可以自动检测Cookie状态,如果客户禁用它,则系统自动把sessionId附加到URL上传送。但windows没有此功能

a. login.php

<?php
session_start();
?>
<html>
    <head>
        <title>login</title>
    </head>
    <body>
        <form action="act.php?<?php echo SID;?>" method="post">
            用户名:<input type="text" name="username"><br/>
            密码:<input type="password" name="pass"><br/>
            <input type="submit" name="send" value="login">
        </form>
    </body>
</html>

act.php

if( isset($_GET[session_name()]) ){
    $sid = $_GET[session_name()];
    session_id($sid);
}
session_start();

$_SESSION['name'] = $_POST['username'];
$_SESSION['pass'] = $_POST['pass'];

var_dump($_SESSION);

echo '<a href="logout.php?'.SID.'">退出</a>';

logout.php

if( isset($_GET[session_name()]) ){
    $sid = $_GET[session_name()];
    session_id($sid);
}
session_start();

$_SESSION = [];
setcookie(session_name(),'',time()-1,'/');
session_destroy();