session入门

来源:互联网 发布:本西蒙斯捏脸数据 编辑:程序博客网 时间:2024/04/28 20:31

小知识
1.session以文本形式存储在服务器端,客户端用户无法修改其内容。
2.cookie存储在客户端,它可能被修改。相对不安全。
3.session可以单纯的存储一个@admin变量来判断用户是否登录。首次验证后将其设置为true,以后判断该值是否为true即可,为false则跳转到登录界面。
4.session可以按照用户自定义存储,存储于数据库

session代码部分:
1.创建session

<?php//启动sessionsession_start();//声明一个名为admin的变量,并赋空值$_SESSION['admin'] = null;?>

2.执行完上述程序之后,系统临时文件夹找到这个session文件,文件名一般类似于:sess_4c83638b3b0dbf65583181c2f89168ec,后面的事32位编码后的随机字符串。可以查看他的内容:
admin|N;
变量明|类型:长度:值。分号隔开,长度和类型可以省略。

3.验证程序,假设数据库存储的是用户名和 md5 加密后的密码

<?php// 表单提交后... $posts = $_POST; // 清除一些空白符号 foreach ($posts as $key => $value){$posts[$key] = trim($value); } $password = md5($posts["password"]); $username = $posts["username"];$query = "SELECT `username` FROM `user` WHERE `password` = '$password'"; // 取得查询结果 $userInfo = $DB->getRow($query);if (!empty($userInfo)) { if ($userInfo["username"] == $username) { // 当验证通过后,启动 Session session_start(); // 注册登陆成功的 admin 变量,并赋值 true $_SESSION["admin"] = true; } else{ die("用户名密码错误"); } 

4.用户验证页面启动session,判断是否登录:

<?php // 防止全局变量造成安全隐患 $admin = false;// 启动会话,这步必不可少 session_start();// 判断是否登陆 if (isset($_SESSION["admin"]) && $_SESSION["admin"] === true) { echo "您已经成功登陆";} else {// 验证失败,将 $_SESSION["admin"] 置为 false$_SESSION["admin"] = false; die("您无权访问"); }?>

5.登出系统,注销session

<?phpsession_start(); // 这种方法是将原来注册的某个变量销毁unset($_SESSION["admin"]); // 这种方法是销毁整个 Session 文件session_destroy(); >

6.手动设置session的生存期
PS:sessionID来判断不同的用户,他是随机生成的。cookie在启动session会话时,能够存储sessionID 和session生存周期。

<?phpsession_start(); // 保存一天 $lifeTime = 24 * 3600; setcookie(session_name(), session_id(), time() + $lifeTime, "/"); ?>

下面这个函数session_set_cookie_params();也可以用来设置session的生存周期

<?php// 保存一天 $lifeTime = 24 * 3600; session_set_cookie_params($lifeTime); session_start();$_SESSION["admin"] = true; ?>

7.如果客户端禁用了cookie,所有生存周期都是浏览器进程了,只要关闭浏览器,再次请求页面又得重新注册 Session。那么怎么传递 Session ID 呢?通过 URL 或者通过隐藏表单来传递,PHP 会自动将 Session ID 发送到 URL 上,URL 形如:其中 URL 中的参数 PHPSESSID 就是 Session ID了,我们可以使用 $_GET 来获取该值,从而实现 Session ID 页面间传递。

<?php// 保存一天 $lifeTime = 24 * 3600;// 取得当前 Session 名,默认为 PHPSESSID $sessionName = session_name();// 取得 Session ID $sessionID = $_GET[$sessionName]; // 使用 session_id() 设置获得的 Session ID session_id($sessionID);session_set_cookie_params($lifeTime); session_start();$_SESSION["admin"] = true;?>

8.对于虚拟主机来说,如果所有用户的 Session 都保存在系统临时文件夹里,将给维护造成困难,而且降低了安全性,我们可以手动设置Session 文件的保存路径,session_save_path()就提供了这样一个功能。我们可以将 Session 存放目录指向一个不能通过 Web 方式访问的文件夹,当然,该文件夹必须具备可读写属性。

<?php // 设置一个存放目录$savePath = "./session_save_dir/"; // 保存一天 $lifeTime = 24 * 3600; session_save_path($savePath);session_set_cookie_params($lifeTime); session_start();$_SESSION["admin"] = true; ?>

同 session_set_cookie_params(); 函数一样,session_save_path() 函数也必须在 session_start() 函数调用之前调用

9.我们还可以将数组和对象存储在 Session 中。操作数组和操作一般变量没有什么区别,而保存对象的话,PHP 会自动对对象进行序列化(也叫串行化),然后保存于 Session 中。下面例子说明了这一点:

person.php<?php class person {     var $age;     function output() {         echo $this->age;     }    function setAge($age) {         $this->age = $age;     } } ?>setage.php<?php     session_start();     require_once "person.php";     $person = new person();     $person->setAge(21);    $_SESSION['person'] = $person;     echo "<a href='output.php'>check here to output age</a>"; ?>output.php<?     // 设置回调函数,确保重新构建对象。     ini_set('unserialize_callback_func', 'mycallback');     function mycallback($classname) {         $classname.".php";     }    session_start();    $person = $_SESSION["person"];     // 输出 21     $person->output(); ?>

PS:当我们执行 setage.php 文件的时候,调用了 setage() 方法,设置了年龄为 21,并将该状态序列化后保存在 Session 中(PHP 将自动完成这一转换),当转到 output.php 后,要输出这个值,就必须反序列化刚才保存的对象,又因为在解序列化的时候需要实例化一个未定义类,所以我们定义了以后回调函数,自动包含 person.php 这个类文件,因此对象被重构,并取得当前 age 的值为 21,然后调用 output()方法输出该值。

0 0
原创粉丝点击