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()函数也行,只不过个人觉得这个函数的默认字体大小,也不好看。还是自定义字体看着舒服点。接下来是调用验证码类

<?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="image_002.php" onclick="this.src='image_002.php?Math.random()'"/>
				</li>
				<li>
					<input type="submit" value="登录" name="dosubmit"/>
				</li>
			</ul>
		</form>
	</body>
</html>

实现的效果:

时间: 2024-10-28 22:17:32

Php实现验证码功能的相关文章

java web中图片验证码功能实现

用户在注册网站信息的时候基本上都要数据验证码验证.那么图片验证码功能该如何实现呢? 大概步骤是: 1.在内存中创建缓存图片 2.设置背景色 3.画边框 4.写字母 5.绘制干扰信息 6.图片输出 废话不多说,直接上代码 package com.lsgjzhuwei.servlet.response; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.Buffer

使用thinkphp3.2中的验证码功能

为了网站的安全性,使用验证码技术是比较常见的,今天按照thinkphp3.2完全开发手册的例子试了一下(地址http://document.thinkphp.cn/manual_3_2.html#verify),总是报错,没法显示验证码,原因原来是在PHP.INI文件中没有打开GD库. 只要将配置文件PHP.INI中的extension=php_gd2.dll注释去掉就可以了(php_gd2.dll   GD 库图像函数库 GD2). 生成验证码 public function code() {

简单 验证码 功能

在贴代码之前首先简述一下验证验证码原理:随机获取验证码的值,把这个值存到session中,其作用可想而知就是要拿来跟前台数据作比较,通过Graphics将值进行模糊处理之后传到前台页面展示. 1 package com.skss.util; 2 3 4 import java.awt.Color; 5 import java.awt.Font; 6 import java.awt.Graphics; 7 import java.awt.image.BufferedImage; 8 import

验证码功能

验证码功能 ① 在Public控制器中定义verify方法 ② 设置验证码相关参数 codeSet:显示的字符串 useZh:是否使用中文验证码 zhSet:显示的中文字符串 useImgBg:是否使用图片背景 fontSize:字体大小 useCurve:是否使用混淆线 useNoise:是否使用杂点 length:验证码采用多少个字符 fontttf:使用的字体样式 ③ 中文验证码 运行结果: 为什么会出现以上问题? 答:因为还没有提供任何中文字体,必须到系统字体目录中复制黑体常规到Thin

使用JS来实现验证码功能

最近想为自己的Django博客添加验证码功能,本来想使用第三方库来实现的,不过考虑到添加第三方库对性能的影响,以及第三方库是否安全可靠的问题,还是用自己的代码来实现吧.反正用JS来实现验证码功能又不是很难. 简单来说,用一个create_code()方法在页面中生成验证码,然后control_submit()方法检测验证码文本框(id="user_input_code")的键盘输入事件,当文本框输入了超过4个字符后,调用verify_code ()检测输入的字符与生成的验证码是否一致,

JavaScript 实现验证码功能

1.编写用户登录界面 根据需要自行完成,参见用户注册与登录设计. 2.编写实现验证码JavaScript脚本 <head> <script language="javascript" type="text/javascript"> var code ; //在全局 定义验证码 function createCode(){   //产生验证码函数 code = new Array(); var codeLength = 4;//验证码的长度 v

自己实现一个验证码功能

用Servlet技术实现验证码功能,(画出一个验证码) 公司中一般用写好的验证码(jar包),很少使用自己去画验证码 . package chensi.com; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; import j

thinkphp验证码功能

Think\Verify类可以支持验证码的生成和验证功能. 为了显示这个验证码功能,第一要有控制器,再就是有方法,然后是显示的页面. 一.最简单的方式生成验证码 (1)我们还是继续在那个控制器编写方法 这个方法显示这个验证码的页面 public function xianshi() { $this->show(); } public function shengcheng() { //造验证码的对象 $v = new \Think\Verify(); //生成验证码 $v->entry();

页面实现验证码功能,点击“注册”按钮后,无论是否完成注册,验证码都能够自动刷新

要求页面实现验证码功能,点击"注册"按钮后,无论是否完成注册,验证码都能够自动刷新 <script> function validteCode() { var codes = new Array(4);       // var colors = new Array("Red","Green","Gray","Blue","Maroon","Aqua",&