Lavarel之图片验证码 captcha

图片验证码

简介

图片验证码在站点管理平台许多场景中会使用,例如登录、注册等。使用php的composer工具可下载许多优秀的开源组件,例如gragwar/captcha。同时也可以自己编写适合自己的图片验证码类并融合到框架中作为工具类使用。

1. 使用gragwar/captcha库

CAPTCHA 是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵)的缩写,是一种区分用户是计算机和人的公共全自动程序。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。

1.1 下载组件

Gregwar/Captcha在Github地址为 https://github.com/Gregwar/Captcha

方式1 使用composer命令下载组件:

composer require gregwar/captcha

方式2 使用手工方式下载安装组件:

composer.json文件中加入配置项

"require": {
  "gregwar/captcha": "1.*"
},

使用composer命令更新并下载

composer update

下载文件保存在 /vendor/gregwar/captcha 目录下

1.2 使用组件

[案例] 在登录控制器中创建图片验证码以及获取验证码操作

登录路由 \app\Http\routes.php

//{rnd}作为随机数,用于当点击图片时自动更换验证码。
Route::get('admin/captcha/{rnd}','Admin\LoginController@captcha');

Laravel5.2.9路由自动应用了web中间件,若添加web中间件则会造成模板中session无法获取数据。

登录控制器 \app\Http\Controllers\Admin\LoginController.php

//引入图片验证码类
use Gregwar\Captcha\CaptchaBuilder;
//通过HTTP请求(Request $request)访问或设置session实例
public function captcha(Request $request)
{
    // 实例化验证码类
    $captcha = new CaptchaBuilder;
    // 创建验证码
    $captcha->build($width=100, $height=40);
    // 获取验证码
    $captcha= $captcha->getPhrase();
    // 将验证码保存在session中
    $request->session()->set('captcha',$captcha);
    // 页面输出验证码图片
    header('Cache-Control:no-cache, must-revalidate');
    header('Content-Type: image/png');
    $captcha->output();
}

登录视图 \resources\views\admin\login.blade.php

<input type="text" class="code" name="vcode" id="vcode"/>
[图片上传失败...(image-8510b9-1526307486684)]}})

注意:验证码图片路径需设置为/admin/captcha/0与路由保存一致,并添加默认随机数供点击更换时使用。

1.3 图片验证码session的处理

由于在不同框架中会单独提供session的处理,因此在图片验证码类中并不建议将其存储到session中。

在Laravel控制器中可通过HTTP请求Request $request对象的来设置和获取session。在模板中可使用session()全局方法获取session。

// 设置验证码保存至session
$request->session()->set('phrase',$phrase);

// 从session中获取验证码
$request->session()->get('phrase');

1.4 图片验证码点击更换

考虑到不同浏览器对图片地址处理不一样,某些浏览器会对图片地址解析,若图片地址和原始请求一样,则不发送新的请求。因此,需在点击更换图片验证码时,将图片的src地址添加动态随机数,以欺骗浏览器认为是不同请求。

[图片上传失败...(image-64b1ea-1526307486685)]}})

 //点击更换验证码
$('#captcha').on('click',function(){
    // 将图片路径以/分隔为数组
    var arr = $(this).attr('src').split('/');
    // 剔除数组中最后一项元素
    arr.pop();
    // 向数组末尾中添加随机数
    arr.push(Math.random());
    // 用/连接数组元素为字符串后设置图片路径
    $(this).attr('src',arr.join('/'));
})

也可采用直接在元素中添加事件的方式,但并不推荐此做法虽然简便一些。

[图片上传失败...(image-49d9d7-1526307486686)]}})

1.5 验证码输入控制

针对验证码输入的单行文本域,首先需根据图片验证码的个数限制其输入长度,其次需对验证码的大小写做约定。

<input type="text" class="code" name="vcode" id="vcode"/>
//验证码输入个数限制并转小写
$('#vcode').on('keyup',function(){
    var val = $(this).val();
    if(val.length<6){
        $(this).val(val.toLowerCase());
    }else{
        $(this).val(val.substr(0,5));
    }
});

2. 使用手动添加组件生成验证码

待更新

小结

简书的Markdown有个蛋疼的问题,在使用```输出img标签时,当src存在内容时,会自动解析为markdown的语法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,681评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,710评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,623评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,202评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,232评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,368评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,795评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,461评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,647评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,476评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,525评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,226评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,785评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,857评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,090评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,647评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,215评论 2 341

推荐阅读更多精彩内容

  • Welcome 目前网络上充斥着大量的陈旧信息,让PHP新手误入歧途,传播着错误的实践和糟糕的代码,这必须得到纠正...
    layjoy阅读 21,651评论 7 118
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,330评论 25 707
  • 该文是wecenter学习笔记的一部分 验证码管理 验证需要考虑 验证码图片的生成、存储和访问 验证码的有效期管理...
    imhaiyang阅读 847评论 0 0
  • ——“朋友发的收藏图,给你欣赏欣赏,欣赏完了,说说什么感觉? ” 奇葩A问 山水图,百度一下,有山有水,懂了。 —...
    花心爱画皮阅读 408评论 0 0
  • 够幸运的话,我们都会陆陆续续地结识到让自己很喜爱的人,或多或少。我算是频率很低的人,让我喜欢又肯和我做朋友...
    铜铜阅读 425评论 0 0