@greenfavo
2015-10-04T03:38:04.000000Z
字数 3261
阅读 1647
php
有时候需要在用户访问网站过程中记住用户的一些信息,比如用户登录后,网站中的所有页面都能显示用户的登录名,这就需要在网站中使用一种全局变量来保存用户名。但普通变量的作用域只能在一个网页内,当用户在各个网页之间跳转时,前一张网页中的变量常量就丢失了。session就是解决这一问题的。只要把用户的信息存储在session变量中,就能在整个网站中获取到。
session代表了服务器与客户端之间的"会话",意思是服务器和客户端在不断地交流通信。如果不使用session,客户端的每次请求都是独立的,这是因为http协议是无状态的,利用http协议无法跟踪用户。
在PHP中,使用$_SESSION[]可以设置和获取特定用户的session信息,session表示当前用户的信息,因此每个用户的session是独立的。当浏览器关闭这个session就永远访问不到了。在不关闭浏览器时,session的默认有效期是24分钟,超过24分钟在该网站没有操作,session对象就会失效。不过可以用ini_set()或在php.ini中修改默认有效期。
session只能让网站记住当前正在访问的用户,但有时需要记住曾经访问的用户。cookie能为网站和用户带来很多好处,如它可以记录特定用户的访问次数,最后一次的访问时间,浏览历史以及使登录成功的用户下次自动登录。
cookie实际上是一个很小的文本文件,每个cookie文件的大小不能超过4KB,每个站点最多只能设置20个cookie。网站通过向用户磁盘写入cookie文件来标识用户。当用户再次访问该网站时,浏览器会将cookie信息发给服务器来验证和识别用户。
cookie有2中形式:会话cookie和永久cookie.前者是临时性的,只在浏览器打开时存在,主要用来实现session技术;后者则永久地放在用户的硬盘上并在有效期内一直可用。
在PHP中利用setcookie()函数可以创建和修改cookie,以及设置cookie的有效期,使用$_COOKIE[]数组可读取cookie变量的值。
有4个文件:login.php展示登录界面和读取cookie,session-cookie.php验证登录,登录成功后设置session和cookie,test-session.php新打开一个页面测试session是否可用,outLogin.php退出登录注销session。
login.php
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>session与cookie实现用户登录</title><script src="http://cdn.bootcss.com/jquery/2.1.4/jquery.min.js"></script></head><body><form method="post" action="session-cookie.php">用户名:<input type="text" id="username" name="username"/><br/>密码:<input type="password" id="password" name="password"/><br/><input type="submit" name="submit" value="登录" /><br></form><?php//判断是否有cookieob_start();//打开缓冲区if (isset($_COOKIE['username'])&&isset($_COOKIE['password'])) {?><script type="text/javascript">$(function() {//如果有cookie就直接填充到表单,自动登录$("#username").val("<?php echo $_COOKIE['username']; ?>");$("#password").val("<?php echo $_COOKIE['password'];?>");});</script><?php }?></body></html>
session-cookie.php
<?phpsession_start();header("Content-type:text/html;charset=utf8");require 'conn.php';if (isset($_POST['submit'])) {//如果点击了登录按钮if (isset($_SESSION['username'])) {//判断之前是否设置了sessionecho "欢迎你 ".$_SESSION['username'];echo "<a href='outLogin.php'>退出登录</a>";}else{$username=$_POST['username'];$password=$_POST['password'];$sql="select * from user where username='$username' and password='$password'";$result=mysql_query($sql);if ($result) {//如果用户名和密码匹配echo $username."登录成功";echo "<a href='outLogin.php'>退出登录</a>";$_SESSION['username']=$username;//将用户名存入sessionsetcookie("username",$username,time()+60);//设置cookiesetcookie("password",$password,time()+60);//60s后过期}else{echo "用户名或密码错误";}}}?>
test-session.php
<?phpsession_start();header("Content-type:text/html;charset=utf8");if (isset($_SESSION['username'])) {$user=$_SESSION['username'];echo $user."欢迎再次访问";}else{echo "你还没有登录";header("location: login.php");//重定向到登录界面}?>
outLogin.php
<?phpsession_start();header("Content-type:text/html;charset=utf8");//退出登录,注销sessionif (isset($_SESSION['username'])) {unset($_SESSION['username']);//删除该sessionheader("location: login.php");//注销成功,重定向到登录界面}?>
相同点:都是为了存储和跟踪特定用户的信息,都可以在整个站点的所有页面访问到。
不同点:
1,session存储在服务端,记住正在访问的用户;cookie存储在客户端,记住曾经访问过的用户。
2,cookie有大小和数量的限制,每个站点最多20个,最大4KB;session没有限制,但设置太多当访问用户很多时会很占服务器内存。
3,因为保存在客户端,cookie可能会泄露用户隐私,带来其他安全问题。
4,session仍然要通过cookie来实现,因为用户的sessionID必须保存在会话cookie中。
session和cookie在后端语言中很常见,用法都差不多,都是那几个步骤。只要掌握了其思想,无论用哪种语言都能很轻松实现,当然我觉得在php中使用最简单。