【ThinkPHP】验证码

验证码如果不用插件,纯粹自己手写是一个很麻烦的东西,然而既然ThinkPHP已经封装好这个功能,现实起来就几行代码,那么就笑纳了。

下面将展示如下图的功能:


判断用户输入的验证码是否正确,点击图片可以刷新验证码。

这一页的代码就是如此简单:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>验证码</title>
</head>

<body>
    <h1>看不清楚验证码,点击图片刷新</h1>
    <form action="__URL__/validation" method="post">
        请输入右图的4位英文+数字:<input type="text" name="en_input" /><img src="__URL__/en_verifyProduce" οnclick="renew_verification(this,0)"/><br/>
        请输入左图的2个汉字:<input type="text" name="cn_input" /><img src="__URL__/cn_verifyProduce" οnclick="renew_verification(this,1)"/><br/>
        <input type="submit" value="提交" />
    </form>
</body>
</html>
<script>
//刷新验证码的JS
function renew_verification(obj,en_cn){
	switch(en_cn){
		case 0:
			obj.src="__URL__/en_verifyProduce?random="+Math.random();
			//这里用TP的Get方法写成__URL__/verifyProduce/random/"+Math.random();也是没问题的
			//加个随机数防止验证码出现缓存问题
			break;
		case 1:
			obj.src="__URL__/cn_verifyProduce?random="+Math.random();
			break;
	}
	
}
</script>

实质上,这一样就是一个简单的表单,验证码是通过ThinkPHP名为en_verifyProduce与cn_verifyProduce,功能分别为产生英文与字符验证码与中文验证码的Action所生成的图片,用户输入的验证码将通过表单的post方法,输送到名为validation这个Action判断是否输入比对。

对于VerifyAction.class.php的代码则如下:

<?php
class VerifyAction extends Action{
	public function index(){		
		$this->display();
	}
	//验证码产生方法
	public function en_verifyProduce(){
		import("ORG.Util.Image");
		Image::buildImageVerify(4,5,"png",50,25,"en_verification");
	}
	//中文验证码产生方法
	public function cn_verifyProduce(){
		import("ORG.Util.Image");
		Image::GBVerify(2,"png",100,50,'msyhbd.ttf',"cn_verification");
	}
	//判断验证码是否输入正确
	public function validation(){
		if(md5($_POST["en_input"])!=$_SESSION["en_verification"]){
			$this->error("英文验证码错误!");	
		}
		
		if(md5($_POST["cn_input"])!=$_SESSION["cn_verification"]){
			$this->error("中文验证码错误!");	
		}
		$this->success("验证成功!");
		
	}
}
?>

有几点需要郑重说明的:

(1)对比与产生英文验证码就是一个函数,配合如下图的几个参数(按左到右排序):


中文验证码除了如下的参数需要明白以外,


还需要将你中文验证码的产生字符文件拷贝到(ThinkPHP完整包的位置)\Extend\Library\ORG\Util这个位置,同时重启服务器,将你拷贝的字符文件加载到ThinkPHP。ThinkPHP没有附带任何字体的,你不搞个字符文件,虽然默认是simhei.ttf,然而ThinkPHP目录下并没有“黑体”这个字符文件,是产生不了中文验证码的。

这里我就使用了Win7的“微软雅黑”字体,字体文件在C:\Windows\Fonts就是一堆你系统存在的字体。至于为何产生的验证码在中文后面有几个点,这没办法了,貌似所有ThinkPHP产生的中文验证码都这吊样。大家也别太黑心,别让用户输个验证码都输得不爽,验证码长度一般中文就两个汉字就好了。

实质上,产生验证码就是ThinkPHP中扩展库的功能,这东西如果你安装ThinkPHP的核心包而不是完整包是没有的,其实完整包也不大,就1M。比隔壁Javaweb的一个包还小。这就不吐槽了。呵呵。

(2)ThinkPHP产生验证码同时,会将正确的验证码,也就是答案,压到Session里面,其中Session的名称你可以根据上两表相应的参数设置。

唯一值得注意的是,用户输入的信息,请通过md5加密,才与正确的验证码比对,因为正确的验证码自动通过md5加密。

不要以为md5又要引入什么包。这又不是Javaweb,C#什么的。md5加密函数就是PHP本身就封装好的函数。


实质上,就是POST拿到用户输入的比对,再比对早已被压在Session的验证码而已。

就是如此简单的一个过程。

不用ThinkPHP也可以参考这样的写法。

ThinkPHP6中实现图形验证码主要是通过内置的验证码类来完成的,该类提供了生成验证码图片和验证用户输入的功能。使用图形验证码可以帮助减少自动化的恶意行为,如垃圾注册、爬虫抓取等。下面是使用ThinkPHP6图形验证码的基本步骤: 1. 首先,确保在你的ThinkPHP6项目中已经正确配置了路由。 2. 在需要生成验证码的控制器方法中,引入验证码类,并创建验证码实例。 3. 使用验证码类的方法来生成验证码图片,并将其输出给客户端或者保存在服务器端(取决于你的实现方式)。 4. 当用户提交表单时,捕获用户输入的验证码,并使用验证码类的验证方法来检查用户输入是否正确。 以下是一个简单的示例代码: ```php // 引入验证码类 use think\facade Captcha; // 在控制器中生成验证码 public function createCaptcha() { // 使用默认的配置创建验证码实例 $captcha = Captcha::create(); // 获取验证码图片的URL(通常是在HTML中作为img标签的src属性使用) $url = $captcha->getImgUrl(); // 返回验证码图片URL或者直接输出 return json(['captcha_url' => $url]); } // 在控制器中验证用户输入的验证码 public function checkCaptcha($code) { // 获取存储在session中的验证码 $captcha = session('captcha'); // 验证用户输入的验证码是否正确 if (!empty($captcha) && Captcha::check($code)) { // 验证成功处理 } else { // 验证失败处理 } } ``` 在实际应用中,你可能需要对验证码的配置进行个性化设置,比如验证码的长度、字体、干扰项等,可以通过调用`create`方法时传入参数来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值