登陆系统的设计2 - 登陆页面的三种形式
制作登陆系统有三种方式:1、使用HTTP认证;2、使用COOKIE;3、使用SESSION。
下面的来简述以下三种认证方式的使用方法以及特点。
1、HTTP认证
这种方法可谓简单粗暴,安全性不太好说(没看到哪个互联网上的网站采用这种方式登录),一般常见于路由器的管理页面登录。
当然使用方法也很简单,在需要登录(加密)的页面设置一个发送HTTP认证的首部就可以了。
<?php if( !isset($_SERVER['PHP_AUTH_USER']) ||!isset($_SERVER['PHP_AUTH_PW']) ){ //看看有没有储存的登录信息 header('HTTP/1.1 401 Unauthorized'); header('WWW-Authenticate: Basic realm="Login"'); //如果没有登录信息,就蹦出登录框 exit('Error!'); //如果没有正确登录就告诉用户错误 } //此处省略登录验证过程一万字 //其实就是把$_SERVER['PHP_AUTH_USER']、$_SERVER['PHP_AUTH_PW'])这两个用户输入的用户名密码拿到数据库进行比对 //如果正确就返回用户的相关信息,如id、username等 //如果错误就告知错误 //不过这里要把$_SERVER['PHP_AUTH_USER']、$_SERVER['PHP_AUTH_PW'])进行一个安全处理,去掉特殊字符等,让服务器更安全 ?>
使用效果如下:
认证失败返回错误信息。
2、使用COOKIE
COOKIE是储存在浏览器的数据。可以根据COOKIE来储存登录信息,即有COOKIE代表登录了,没COOKIE代表没登录,注销的时候销毁COOKIE即可。
理论上讲,只要用户不清理COOKIE信息,COOKIE数据可以永存(只要把时间设置为无限即可)。
COOKIE的好处是你可以设置一个合理的时限来让用户不必频繁的重复登录又能恰到好处的保护隐私。
例如30分钟内用户不必反复登录,30分钟后(用户可能已经离开)又自动登出。
设置COOKIE只需要调用setcookie()函数即可。
<?php //setcookie('名字', '值', 有效期); //有效期单位为秒,直接使用 time()取得当前时间 加上希望储存的时间,例如15分钟 time() + ( 60 * 15 ) setcookie('user_id', $userid, time() + ( 60 * 15 ) ); setcookie('username', $username, time() + ( 60 * 15 ) ); ?>
验证是否登录只需要检查有没有COOKIE值。
<?php if( isset($_COOKIE['user_id']) ){ //检查有没有COOKIE //如果登录了,怎么怎么样,代码放这里 } else { //如果没有登录,怎么怎么样 } ?>
注销也非常简单,COOKIE有时限会自动销毁,如果希望立马销毁只需要把时间改为过期即可。
<?php //销毁COOKIE只需要再次调用setcookie()函数将内容清空并将时间设置为过期 setcookie('user_id', '', time() - 1 ); setcookie('username', '', time() - 1 ) ); ?>
具体使用需要设计一个登陆界面的表单,用户提交用户名和密码,php脚本把用户提交的用户名密码拿到数据库进行比对,如果比对信息正确,就把用户ID(或者其他一些信息)传递到COOKIE中储存,这样就知道用户已经登陆了。
在需要登陆的页面,例如用户的个人信息设置页,只需要检查有没有相关的COOKIE信息。
3、SESSION
SESSION可以理解为建立在浏览器和服务器之间的一个会话,SESSION是储存在服务器上的临时数据,当关闭浏览器(即会话关闭)的时候,该临时数据会被自动销毁。
意思就是:你关闭了浏览器,你就得重新登录。
SESSION跟COOKIE很相似,只是COOKIE的信息储存在用户端,SESSION的数据储存在服务端,COOKIE可以设置生命时间,而SESSION的生命随会话的终止而终止。
所以SESSION的用法跟COOKIE也很相似,只是缺少了时间参数。
<?php //启用一个会话需要调用一个启动函数 session_start(); //将数据储存在SESSION中 $_SESSION['username'] = $username; ?>
SESSION跟COOKIE如此相似,所以判断是否登录的代码也基本相同:
<?php //当然首先得启用一个会话 session_start(); if( isset($_SESSION['user_id']) ){ //检查有没有SESSION //如果登录了,怎么怎么样,代码放这里 } else { //如果没有登录,怎么怎么样 } ?>
如果想要在关闭浏览器之前就注销,需要做以下工作
<?php //省略之前的代码若干 //首先将SESSION清空 $_SESSION = array(); //有时SESSION也会调用COOKIE来临时储存 //所以我们将SESSION可能调用的COOKIE销毁 if( isset($_COOKIE[ session_name() ]) ){ setcookie(session_name(), '', time() - 1 ) ); } //关闭会话 session_destroy(); ?>