Laravel的验证码库gregwar/captcha

Laravel的验证码库gregwar/captcha

标签: 验证码php
196人阅读 评论(0) 收藏 举报
分类:

在Laravel中有很多图片验证码的库可以使用,本篇介绍其中之一:gregwar/captcha,这个库比较简单,在Laravel中比较常用。下面我们就来介绍下使用细节:


首先, composer.json中如下加入配置:

<code class="json"><span class="hljs-string">"require"</span>: {
        ...
        "<span class="hljs-attribute">gregwar/captcha</span>": <span class="hljs-value"><span class="hljs-string">"1.*"</span>
    </span>},</code>

然后,已成习惯的命令:

composer update

接下来就可以正常使用了,根据具体的开发需求,可以有很多种方式去使用。

  • 可以将验证码图片保存文件:
<code class="php"><span class="hljs-preprocessor"><?php</span>

<span class="hljs-variable">$builder</span>->save(<span class="hljs-string">'out.jpg'</span>);</code>
  • 可以直接输出图片到网页:
<code class="php"><span class="hljs-preprocessor"><?php</span>

header(<span class="hljs-string">'Content-type: image/jpeg'</span>);
<span class="hljs-variable">$builder</span>->output();</code>
  • 可以生成内联图片:
<code class="php"><img src=<span class="hljs-string">"<?php echo $builder->inline(); ?>"</span> /></code>

以下演示了其中一种使用方式,直接输出图片到网页。

我定义了一个Controller:

<code class="php"><span class="hljs-preprocessor"><?php</span> <span class="hljs-keyword">namespace</span> <span class="hljs-title">App</span>\<span class="hljs-title">Http</span>\<span class="hljs-title">Controllers</span>;

<span class="hljs-keyword">use</span> <span class="hljs-title">App</span>\<span class="hljs-title">Http</span>\<span class="hljs-title">Requests</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">App</span>\<span class="hljs-title">Http</span>\<span class="hljs-title">Controllers</span>\<span class="hljs-title">Controller</span>;

<span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Http</span>\<span class="hljs-title">Request</span>;

<span class="hljs-comment">//引用对应的命名空间</span>
<span class="hljs-keyword">use</span> <span class="hljs-title">Gregwar</span>\<span class="hljs-title">Captcha</span>\<span class="hljs-title">CaptchaBuilder</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Session</span>;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">KitController</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Controller</span> </span>{

    <span class="hljs-comment">/**
     * Display a listing of the resource.
     *
     * <span class="hljs-doctag">@return</span> Response
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">captcha</span><span class="hljs-params">(<span class="hljs-variable">$tmp</span>)</span>
    </span>{
                <span class="hljs-comment">//生成验证码图片的Builder对象,配置相应属性</span>
        <span class="hljs-variable">$builder</span> = <span class="hljs-keyword">new</span> CaptchaBuilder;
        <span class="hljs-comment">//可以设置图片宽高及字体</span>
        <span class="hljs-variable">$builder</span>->build(<span class="hljs-variable">$width</span> = <span class="hljs-number">100</span>, <span class="hljs-variable">$height</span> = <span class="hljs-number">40</span>, <span class="hljs-variable">$font</span> = <span class="hljs-keyword">null</span>);
        <span class="hljs-comment">//获取验证码的内容</span>
        <span class="hljs-variable">$phrase</span> = <span class="hljs-variable">$builder</span>->getPhrase();

        <span class="hljs-comment">//把内容存入session</span>
        Session::flash(<span class="hljs-string">'milkcaptcha'</span>, <span class="hljs-variable">$phrase</span>);
        <span class="hljs-comment">//生成图片</span>
        header(<span class="hljs-string">"Cache-Control: no-cache, must-revalidate"</span>);
        header(<span class="hljs-string">'Content-Type: image/jpeg'</span>);
        <span class="hljs-variable">$builder</span>->output();
    }

}</code>

下面我们可以设置相应的router访问这个验证码图片, 修改router.php:

<code class="php">Route::get(<span class="hljs-string">'kit/captcha/{tmp}'</span>, <span class="hljs-string">'KitController@captcha'</span>);</code>

现在可以通过具体的url,可以访问看到这张图片了


验证码

表单内部写的比较简单,看看即可:

<code class="xml"><span class="hljs-tag"><<span class="hljs-title">input</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text"</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"captcha"</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">"form-control"</span> <span class="hljs-attribute">style</span>=<span class="hljs-value">"width: 300px;"</span>></span>
          <span class="hljs-tag"><<span class="hljs-title">a</span> <span class="hljs-attribute">onclick</span>=<span class="hljs-value">"javascript:re_captcha();"</span> ></span><span class="hljs-tag"><<span class="hljs-title">img</span> <span class="hljs-attribute">src</span>=<span class="hljs-value">"{{ URL('kit/captcha/1') }}"</span>  <span class="hljs-attribute">alt</span>=<span class="hljs-value">"验证码"</span> <span class="hljs-attribute">title</span>=<span class="hljs-value">"刷新图片"</span> <span class="hljs-attribute">width</span>=<span class="hljs-value">"100"</span> <span class="hljs-attribute">height</span>=<span class="hljs-value">"40"</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"c2c98f0de5a04167a9e427d883690ff6"</span> <span class="hljs-attribute">border</span>=<span class="hljs-value">"0"</span>></span><span class="hljs-tag"></<span class="hljs-title">a</span>></span>

<span class="hljs-tag"><<span class="hljs-title">script</span>></span><span class="javascript">  
  <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">re_captcha</span>(<span class="hljs-params"></span>) </span>{
    $url = <span class="hljs-string">"{{ URL('kit/captcha') }}"</span>;
        $url = $url + <span class="hljs-string">"/"</span> + <span class="hljs-built_in">Math</span>.random();
        <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">'c2c98f0de5a04167a9e427d883690ff6'</span>).src=$url;
  }
</span><span class="hljs-tag"></<span class="hljs-title">script</span>></span></code>

最后就是在form提交页面验证相应验证码,库中也为我们提供了相应方法:

<code class="php"><span class="hljs-variable">$userInput</span> = <span class="hljs-variable">$request</span>->get(<span class="hljs-string">'captcha'</span>);

<span class="hljs-keyword">if</span>(<span class="hljs-variable">$builder</span>->testPhrase(<span class="hljs-variable">$userInput</span>)) {
    <span class="hljs-comment">//用户输入验证码正确</span>
    <span class="hljs-keyword">return</span> <span class="hljs-string">'您输入验证码正确'</span>;
} <span class="hljs-keyword">else</span> {
    <span class="hljs-comment">//用户输入验证码错误</span>
    <span class="hljs-keyword">return</span> <span class="hljs-string">'您输入验证码错误'</span>;
}</code>

至此,验证码就完成了。 如有疑问,欢迎回复探讨。

补充

在form表单提交验证的代码写的比较草率,给读者带来了歧义,在此有个补充(感谢 一块黄布 的回复):
$builder->testPhrase($userInput) 这里的$builder与生成验证码的$builder为同一个,如果重新new,则一直会验证失败。我们可以从源码中看到:

<code class="php"><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">testPhrase</span><span class="hljs-params">(<span class="hljs-variable">$phrase</span>)</span>

 </span>{

 <span class="hljs-keyword">return</span> (<span class="hljs-variable">$this</span>->builder->niceize(<span class="hljs-variable">$phrase</span>) == <span class="hljs-variable">$this</span>->builder->niceize(<span class="hljs-variable">$this</span>->getPhrase()));

 }</code>

验证码正确性判断,也可以由下列方式来验证:

<code class="php"><span class="hljs-variable">$userInput</span> = \Request::get(<span class="hljs-string">'captcha'</span>);

<span class="hljs-keyword">if</span> (Session::get(<span class="hljs-string">'milkcaptcha'</span>) == <span class="hljs-variable">$userInput</span>) {
    <span class="hljs-comment">//用户输入验证码正确</span>
    <span class="hljs-keyword">return</span> <span class="hljs-string">'您输入验证码正确'</span>;
} <span class="hljs-keyword">else</span> {
    <span class="hljs-comment">//用户输入验证码错误</span>
    <span class="hljs-keyword">return</span> <span class="hljs-string">'您输入验证码错误'</span>;
}</code>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值