laravel框架自身并不携带验证码类,我这里采用开源的gregwar/captcha,来作验证。javascript
gregwar/captcha的github地址为 https://github.com/Gregwar/Captchaphp
一、下载 gregwar/captcha 前端
(1) 在Laravel根目录(app同级目录)的 composer.json 的 "require"最后添加一行代码,以下代码块所示:java
"require": { "php": ">=5.6.4", "laravel/framework": "5.4.*", "laravel/tinker": "~1.0", "gregwar/captcha": "1.*" //这一行是新添的,其余代码不用理睬 },
(2) cd 至 Laravel根目录,执行 composer update 。若你系统没安装 composer 可参考我写的这篇文章 《windows 与 linux 下composer的安装与经常使用命令》jquery
composer update
这时候,若安装成功,则\vendor目录下应该有 gregwar 文件夹。linux
二、生成简易的验证码图文laravel
(1)添加路由git
Route::any('index/login', 'IndexController@login');
(2)生成验证码github
在 \app\Http\Controllers 目录下的 IndexController.php中,添加以下代码json
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Gregwar\Captcha\CaptchaBuilder;//验证码类 class IndexController extends Controller { /** * 生成验证码图片 */ public function verifycode() { $builder = new CaptchaBuilder(); $builder->build($width = 116, $height = 37);//自定义图片宽高 session(['loginVerifyCode' => $builder->getPhrase()]); //将验证码存入session,方便登录验证 header("Cache-Control: no-cache, must-revalidate"); header('Content-Type: image/jpeg'); $builder->output(); } }
(3)前端页面调用验证码图片
在\resources\views\index 目录下,新建login.blade.php 模版。里面关于图片验证码大致代码以下:
<img src="{{url('index/verifycode')}}" data-url="{{url('index/verifycode')}}" class="VerifyCode"> // 引入jquery.js <script type="text/javascript"> $('body').on('click','.VerifyCode',function(){ $(this).attr('src',$(this).data('url') + '?id=' + Math.random()); }); </script>
验证码图片效果图
(4)后台验证
在上文提到的 IndexController.php 控制器中,添加login方法(倘若post提交至该方法)。
public function login(Request $request) { if ($request->isMethod('post')){ $code = $request->input('code');//post提交后的验证码 echo ( session()->get('loginVerifyCode') == $code ) ? '验证码正确' : '验证码错误'; } }
这时候简单的验证码逻辑,便可走通。
三、定制验证码类
(1)改变图文验证码的显示内容,长度
改变验证码显示的内容与长度,有以下2种方法,但其均不支持中文验证码。
第一种:本身生成验证码内容。写一个生成随机内容的验证码,并在实例化 CaptchaBuilder 时将其做为参数传入便可,以下代码所示。
/** * 生成验证码图片 */ public function verifycode() { $builder = new CaptchaBuilder('abcd'); //只是这里多传了个参数,其它代码地方均与上文中的verifycode()方法如出一辙 $builder->build($width = 116, $height = 37); session(['loginVerifyCode' => $builder->getPhrase()]); header("Cache-Control: no-cache, must-revalidate"); header('Content-Type: image/jpeg'); $builder->output(); }
你只需传参至new CaptchaBuilder('abcd')中,前端页面即显示"abcd"的验证码。
第二种:调用类自身方法,生成自定义的验证码。
gregwar/captcha 生成随机验证码的方法是在 PhraseBuilder类的 build方法。你只需传入本身想要验证码的长度,与生成验证码的内容2个参数便可。简单代码以下
use Gregwar\Captcha\CaptchaBuilder;//验证码类 use Gregwar\Captcha\PhraseBuilder;// 生成验证码内容类 public function verifycode() { //生成验证码内容. 第一个参数表明长度,第二个则是组成验证码内容的元素 $phrase = (new PhraseBuilder())->build(4,'abcdefghijkmnpqrstuvwxy3456789'); $builder = new CaptchaBuilder($phrase);//将生成的验证码传入类中 $builder->build($width = 116, $height = 37); session(['loginVerifyCode' => $builder->getPhrase()]); header("Cache-Control: no-cache, must-revalidate"); header('Content-Type: image/jpeg'); $builder->output(); }
这里,便可定制长度为 4,内容为'abcdefghijklmnpqrstuvwxyz123456789' 组成的验证码。