PHP开发之旅-验证码功能实现
验证码这样的功能可以说是无处不在了,接下来使用php来实现验证码这样的功能,这里我是将验证码实现抽取到一个类中独立开来,那么后面如果再使用到验证码功能,直接引入该类文件并创建该类的实例,就可以使用验证码了,代码如下:
验证码类文件vcode.class.php
<?php
/**
*验证码类
*/
class Vcode{
private $width;//图片宽度
private $height;//图片高度
private $num;//验证码个数
private $img;//图片资源
private $code;//验证码
private $pointNum;//干扰点个数
private $lineNum;//干扰线个数
private $fontFile;//字体文件 //构造函数初始化相关数据
function __construct($width=85,$height=34,$num=4){
$this->width=$width;
$this->height=$height;
$this->num=$num;
$this->code=$this->createCode();
$this->pointNum=100;
$this->lineNum=10;
$this->fontFile="STLITI.TTF";
} /**
*用于设置成员属性
*@param string $key 成员属性名
*@param mixed $value 成员属性值
*@return object 返回自己对象$this,可用于连贯操作
*/
public function set($key,$val){
//get_class_vars() 获取类中的属性组成的数组
//get_class() 返回对象的类名
if(array_key_exists($key,get_class_vars(get_class($this)))){
$this->setOption($key,$val);
}
return $this;
}
//设置参数
private function setOption($key,$value){
$this->$key=$value;
} //获取验证码
public function getCode(){
return $this->code;
} //输出图像
public function outImg(){
//创建图像
$this->createImage();
//画验证码
$this->drawCode();
//画干扰元素
$this->drawDisturbColor();
//输出图像
$this->printImg();
} //画验证码
private function drawCode(){
$this->fontFile="font/".$this->fontFile;
for($i=0;$i<$this->num;$i++){
//设置随机颜色
$randColor=imagecolorallocate($this->img,rand(0,128),rand(0,128),rand(0,128));
//字体大小
$fontSize=rand(20,23);
//字体水平位置
$x=($this->width/$this->num)*$i;
//水平方向的位置
$y=rand($fontSize,imagefontheight($fontSize)+3);
//画字体
imagettftext($this->img,$fontSize,0,$x,$y,$randColor,$this->fontFile,$this->code{$i});
}
}
//画干扰元素
private function drawDisturbColor(){
//画干扰点
for($i=0;$i<$this->pointNum;$i++){
//设置随机颜色
$randColor=imagecolorallocate($this->img,rand(0,255),rand(0,255),rand(0,255));
//画点
imagesetpixel($this->img,rand(1,$this->width-2),rand(1,$this->height-2),$randColor);
} //画干扰线
for($i=0;$i<$this->lineNum;$i++){
//设置随机颜色
$randColor=imagecolorallocate($this->img,rand(0,200),rand(0,200),rand(0,200));
//画线
imageline($this->img,rand(1,$this->width-2),rand(1,$this->height-2),rand(1,$this->height-2),rand(1,$this->width-2),$randColor);
}
} //创建图像
private function createImage(){
//创建一个真彩色图像
$this->img=imagecreatetruecolor($this->width,$this->height);
//设置背景色
$bgColor=imagecolorallocate($this->img,rand(200,255),rand(200,255),rand(200,255));
//填充背景色
imagefill($this->img,0,0,$bgColor);
//设置边框颜色
$borderColor=imagecolorallocate($this->img,0,0,0);
//画一个边框
imagerectangle($this->img,0,0,$this->width-1,$this->height-1,$borderColor);
} //输出图像
private function printImg(){
if(imagetypes() & IMG_PNG){
//针对png
header("Content-Type:image/png");
imagepng($this->img);
}else if(imagetypes() & IMG_JPG){
//针对jpg
header("Content-Type:image/jpeg");
imagejpeg($this->img,null,100);
}else if(imagetypes() & IMG_GIF){
//针对Gif
header("Content-Type:image/gif");
imagegif($this->img);
}else if(imagetypes() & IMG_WBMP){
// 针对 WBMP
header('Content-Type: image/vnd.wap.wbmp');
imagewbmp($this->img);
}else{
die('No image support in this PHP server');
}
} //创建验证码
private function createCode(){
//默认字符串
$codes="123456789abcdefghijkmnpqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXY";
//生成验证码
$code="";
for($i=0;$i<$this->num;$i++){
$code.=$codes{rand(0,strlen($codes)-1)};
}
return $code;
} //析构函数用于销毁图像资源
function __destruct(){
imagedestroy($this->img);
}
}
这里我使用的画字体的函数是imagettftext(),因为这个函数可以自定义字体样式,从代码中也能看出来,传入的参数有个字体文件属性,如果不喜欢用这个函数可以使用imagestring()函数也行,只不过个人觉得这个函数的默认字体大小,也不好看。还是自定义字体看着舒服点。接下来是调用验证码类checkcode.php
<?php
//开启Session
session_start();
//引入验证码类
include("vcode.class.php");
//创建验证码类
$vcode=new Vcode();
//将获取的验证码存入到session中
$_SESSION['code']=$vcode->getCode();
//$vcode->set("pointNum",10);//自定义干扰点个数
//$vcode->set("lineNum",10);//自定义干扰线个数
//$vcode->set("fontFile","wawa.ttf");//自定义字体文件
//输出图像
$vcode->outImg();
代码到这里验证码就实现了,直接调用该文件也能看到验证码,下面使用一个简单的登录表单使用该验证码
<?php
//开启Session
session_start();
//判断是否提交
if(isset($_POST['dosubmit'])){
//获取session中的验证码并转为小写
$sessionCode=strtolower($_SESSION['code']);
//获取输入的验证码
$code=strtolower($_POST['code']);
//判断是否相等
if($sessionCode==$code){
echo "<script type='text/javascript'>alert('验证码正确!');</script>";
}else{
echo "<script type='text/javascript'>alert('验证码错误!');</script>";
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
<style type="text/css">
*{margin:0px;padding:0px;}
ul{
width:400px;
list-style:none;
margin:50px auto;
} li{
padding:12px;
position:relative;
} label{
width:80px;
display:inline-block;
float:left;
line-height:30px;
} input[type='text'],input[type='password']{
height:30px;
} img{
margin-left:10px;
} input[type="submit"]{
margin-left:80px;
padding:5px 10px;
}
</style>
</head>
<body>
<form action="login.php" method="post">
<ul>
<li>
<label>用户名:</label>
<input type="text" name="username"/>
</li>
<li>
<label>密码:</label>
<input type="password" name="password"/>
</li>
<li>
<label>验证码:</label>
<input type="text" name="code" size="4" style="float:left"/>
<img src="data:image_002.php" onclick="this.src='image_002.php?Math.random()'"/>
</li>
<li>
<input type="submit" value="登录" name="dosubmit"/>
</li>
</ul>
</form>
</body>
</html>
实现的效果:
PHP开发之旅-验证码功能实现的更多相关文章
- Django学习笔记(17)——BBS+Blog项目开发(1)验证码功能的实现
本文主要学习验证码功能的实现,为了项目BBS+Blog项目打下基础. 为了防止机器人频繁登陆网站或者破坏分子恶意登陆,很多用户登录和注册系统都提供了图形验证码功能. 验证码(CAPTCHA)是“Com ...
- h5直播开发之旅总结
前言 关于直播,有很多相关技术文章,这里不多说. 作为前端,我们比较关心我们所需要的. 直播的大致流程: APP端调用摄像头 -> 拍摄视频 -> 实时上传视频 -> 服务器端获取视 ...
- 大熊君{{bb}}移动开发之旅(第一季)
一,开篇概述 Hi,大家好!大熊君又和大家见面了,从这篇文章开始我要和大家聊聊移动开发的话题,这部分文章共8季,分别从不同角度来讲解什么是移动开发?移动开发涉及到什么方面的技术点以及移动开发中的常见问 ...
- HoverTree开发日志之验证码
HoverTree是一个ASP.NET的开源CMS,目前包含文章系统,图库和留言板功能.代码完全开放,文章内容页生成了静态的HTM页面,留言板提供留言审核功能,文章可以发布HTML源代码,图片上传同时 ...
- C#微信开发之旅--自定义菜单
上一篇说道基本信息的回复<C#微信开发之旅--基本信息的回复>,当中就说到文本信息的回复,其他信息的回复,可以参考下开发文档中回复信息的格式进行修改就可以. 下面来实现下自定义菜单.据我了 ...
- Tornado框架实现图形验证码功能
图形验证码是项目开发过程中经常遇到的一个功能,在很多语言中都有对应的不同形式的图形验证码功能的封装,python 中同样也有类似的封装操作,通过绘制生成一个指定的图形数据,让前端HTML页面通过链接获 ...
- .NET Core实战项目之CMS 第十六章 用户登录及验证码功能实现
前面为了方便我们只是简单实现了基本业务功能的增删改查,但是登录功能还没有实现,而登录又是系统所必须的,得益于 ASP.NET Core的可扩展性因此我们很容易实现我们的登录功能.今天我将带着大家一起来 ...
- QT开发之旅一DS7400主机调试工具
接触QT三年有余,期间因为工作需要断断续续学习过,2010年开始接触,当时好像是4.7版本,现在都已经到5.2版本了,更新真快,前阵子安装了下5.2版本,还是有很多变化的,不过感觉好像编译速度慢了很多 ...
- php CI框架实现验证码功能和增强验证码安全性实战教程
php CI框架实现验证码功能和增强验证码安全性实战教程 CodeIgniter简称CI是最流行的一个php MVC框架之一,本人讲从实际项目使用中写系列实战经验,有别与其他的理论讲解文章,会附上实战 ...
随机推荐
- [luoguP2983] [USACO10FEB]购买巧克力Chocolate Buying(贪心)
传送门 按价格排序后贪心 ——代码 #include <cstdio> #include <iostream> #include <algorithm> int n ...
- 【BZOJ2081】Beads(哈希表)
题意: 翻转是指其中一段长度为k的子串全部翻转 n<=200000 a[i]<=n 思路:枚举k,直接哈希判充即可 时间复杂度是n/i求和,根据定理可得是O(n log n)级别的 单哈双 ...
- rest frame work纪念版代码
models.py from django.db import models from pygments.lexers import get_all_lexers from pygments.styl ...
- ms sql SERVER 下载
企业版DVD SQL Server 2005 Enterprise Edition(支持超大型企业) 32 位DVD: ed2k://|file|cs_sql_2005_ent_x86_dvd.iso ...
- [Vue @Component] Pass Props to Vue Functional Templates
Functional templates allow you to create components consisting of only the template tag and exposing ...
- 国际维修联合会IMA年度大会在瑞士圆满结束
瑞士卢加诺 ☆2016年4月5日至7日 中国设备管理协会国际交流合作中心主任.学府咨询(国际)集团董事长.IMA中国分会主席李葆文教授,应邀出席了4月5日至7日在瑞士卢加诺召开的国际维修联合会年度大会 ...
- struts2前端页面读取Clob/BLOB
在通过Struts2标签显示对象的Clob属性值的时候.显示的并非CLOB或者BLOB的内容,而是显示的toString方法的值 比如我在实体中的注解为: @Lob @Column(name = &q ...
- 为部门整理的mysql_db使用军规
mysql_db使用军规: 1.禁止开发測试人员在IDC环境手工删除和改动数据 2.全部需求通过DB工具系统提交 3.禁止在IDC环境DB进行測试 4.IDC环境提交的sql语句一定要经过非正式环境验 ...
- Java - 对象(object) 具体解释
对象(object) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24059545 对象(object)的实例能够是 ...
- LeetCode 350. Intersection of Two Arrays II (两个数组的相交之二)
Given two arrays, write a function to compute their intersection. Example:Given nums1 = [1, 2, 2, 1] ...