前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Laravel使用gregwar/captcha生成验证码

Laravel使用gregwar/captcha生成验证码

作者头像
Meng小羽
发布2019-12-24 11:54:10
2.1K0
发布2019-12-24 11:54:10
举报
文章被收录于专栏:Debug客栈Debug客栈

laravel框架自身并不携带验证码类,我这里采用开源的gregwar/captcha,来做验证码,并判断是否可以登录。

安装扩展库

1、在 laravel 项目根目录下找到 composer.json 这个文件,添加 "gregwar/captcha": "1.*"  到**composer.json**这个文件中,如下面代码所示。

代码语言:javascript
复制
"require": {
        "php": "^7.1.3",
        "fideloper/proxy": "^4.0",
        "laravel/framework": "5.8.*",
        "laravel/tinker": "^1.0",
        "gregwar/captcha": "1.*"
    },

2、然后打开命令行,找到项目的根目录,运行**composer update可以看到这个扩展库已经下载好了**,PS:我安装了一遍,现在它提示没有可以更新的。

代码语言:javascript
复制
# composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Generating optimized autoload files

好了,安装成功就可以进行项目中运用了。

定义路由

代码语言:javascript
复制
//登录验证码
Route::get('admin/captcha', "Admin\LoginController@captcha");

定义后台引用库方法

代码语言:javascript
复制
/**
 * 验证码
 * @return Response
 */
public function captcha(Request $request){
    $builder = new CaptchaBuilder;
    $builder->build(150,47);
    //获取验证码内容
    $phrase = $builder->getPhrase();
    //把内容存入session 存储验证码
    $request->session()->flash('captchaSession', $phrase);
    //清除缓存
    ob_clean();
    //把验证码数据以jpeg图片的格式输出
    return response($builder->output())->header('Content-type','image/jpeg');
}

定义后台登录方法

代码语言:javascript
复制
/**
 * 后台登录控制方法
 * @param Request $request
 * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
 */
public function check(Request $request){
    //接收数值
    $name = $request->input("name");
    $pass = $request->input("pass");
    $code = $request->input("code");
    //获取验证码的数值
    $yzm = $request->session()->get('captchaSession');
    //判断用户是否输入
    if($name == ''){
        return back()->with("error", "用户名不存在");
    }
    if($pass == ''){
        return back()->with("error", "密码不存在");
    }
    if($code == ''){
        return back()->with("error", "验证码不存在");
    }
    //加密获取的数据
    $md5Pass = md5($pass);
    //验证数据库中是否有数据
    $result = DB::table('user')->where([
        ['name','=',$name],
        ['pass','=',$md5Pass]
    ])->first();
    //获取用户id
    $id = $result->id;
    // 验证验证码是否与存在session值一样
    if($code == $yzm){
        // 验证是否有该用户并且有效
        if($result){
            //向网站中存储数据
            $request->session()->put('adminUserInfo', ['name'=>$name, 'id'=>$id]);
            return redirect('/admin');
        }else{
            return back()->with("error", "好像登录失败了,重新登陆一下吧");
        }
    }else{
        return back()->with("error", "验证码输入不正确");
    }
}

前台验证码HTML代码

代码语言:javascript
复制
<div class="form-group">
    <div class="input-group">
        <input type="text" class="form-control" name="code" placeholder="验证码">
        <div class="input-group-append">
            <img src="/admin/captcha" alt="验证码" id="codeimg" onclick="captcha(this);return false;">
        </div>
    </div>
</div>

前台验证码刷新JS代码

代码语言:javascript
复制
/**
 * 点击验证码刷新验证码功能
 * @param obj
 */
function captcha(obj){
    //更换地址
    obj.src='/admin/captcha?code='+Math.random();
}

验证码获取界面

相关问题

乱码问题

这里有两个问题需要注意,照着下面的方法去直接输出验证码,你会发现验证码显示不出来,反而是一堆乱码。

代码语言:javascript
复制
public function captcha(Request $request){
    $builder = new CaptchaBuilder;
    $builder->build(150,47);
    header('Content-type','image/jpeg');
    $builder->output();
}

出现乱码错误

验证码信息有误

输出一下$phrase,发现验证码内容已经获取到了,是图片生成部分出的问题,header("Cache-Control: no-cache, must-revalidate");

这行代码的作用是清除缓存,防止出现验证码不能刷新或显示不出来的情况,但是并没有起作用,改用 ob_clean(); 去清除浏览器缓存。然后是

header('Content-Type: image/jpeg');

$builder->output();

这两句话的问题,

$builder->output();

返回的只是验证码图片的一些信息,并不是一张图片,所以当把它直接输出时,出来的并不是一张图片,只有这样写

return response($builder->output())->header('Content-type','image/jpeg');

直接输出的时候,才会以图片的形式直接输出验证码。

当把它放到的src属性中,标签会自动以图片的格式输出它,也就是说header('Content-type','image/jpeg')

这时候这句话是没必要的,所以不管是

response($builder->output())->header('Content-type','image/jpeg');

这样写,还是

header('Content-Type: image/jpeg');

$builder->output();

这样写,结果都会显示验证码图片。

return response($builder->output())->header('Content-type','image/jpeg');

直接输出的时候,才会以图片的形式直接输出验证码。

当把它放到的src属性中,标签会自动以图片的格式输出它,也就是说header('Content-type','image/jpeg')

这时候这句话是没必要的,所以不管是

response($builder->output())->header('Content-type','image/jpeg');

这样写,还是

header('Content-Type: image/jpeg');

$builder->output();

这样写,结果都会显示验证码图片。

好了,大功告成

到这里就可以了,正常显示,嘿嘿嘿.

感谢文章

止喜 《laravel5.4生成验证码》

最后感谢止喜的文章,让我解决了这个问题,同时,为了自己以后不进这个坑,写一篇这样的技术文章,其中借鉴了一点经验,谢谢。

感谢开源组件

最后感谢开源组件Gregwar/Captcha,谢谢。

本文链接:https://cloud.tencent.com/developer/article/1558516

本文采用CC BY-NC-SA 3.0 Unported协议进行许可,转载请保留此文章链接

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装扩展库
  • 定义路由
  • 定义后台引用库方法
  • 定义后台登录方法
  • 前台验证码HTML代码
  • 前台验证码刷新JS代码
  • 相关问题
    • 乱码问题
      • 验证码信息有误
      • 感谢文章
      • 感谢开源组件
      相关产品与服务
      验证码
      腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档