You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中如何实现页面加载前的验证码校验功能

Laravel指定页面前置验证码校验实现方案

整体思路

通过Laravel中间件拦截目标路由请求,校验用户是否已完成验证码验证,未验证则跳转至验证码页面,验证通过后放行至目标页面。

实现步骤

步骤1:安装验证码扩展包

使用主流的mews/captcha扩展实现验证码能力,执行安装命令:

composer require mews/captcha

安装完成后发布配置文件,可自定义验证码参数:

php artisan vendor:publish --provider="Mews\Captcha\CaptchaServiceProvider"

步骤2:创建自定义校验中间件

执行命令生成中间件:

php artisan make:middleware VerifyCaptchaBeforeAccess

编辑app/Http/Middleware/VerifyCaptchaBeforeAccess.php文件,编写拦截逻辑:

<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class VerifyCaptchaBeforeAccess
{
    public function handle(Request $request, Closure $next)
    {
        // 判断是否已通过验证码校验,有效期1小时可自行调整
        if (session()->has('captcha_verified') && session('captcha_verified') > now()) {
            return $next($request);
        }
        // 记录用户原本要访问的地址,验证成功后跳转
        session(['intended_url' => $request->fullUrl()]);
        // 跳转至验证码页面
        return redirect()->route('captcha.show');
    }
}

步骤3:注册中间件

编辑app/Http/Kernel.php文件,在$routeMiddleware数组中新增中间件别名:

protected $routeMiddleware = [
    // 其他已存在的中间件
    'captcha.check' => \App\Http\Middleware\VerifyCaptchaBeforeAccess::class,
];

步骤4:配置路由

在routes/web.php中配置路由:

// 需要前置验证码校验的目标页面,挂载captcha.check中间件
Route::get('/test', [\App\Http\Controllers\TestController::class, 'index'])->middleware('captcha.check')->name('test');
// 验证码页面路由
Route::get('/captcha', [\App\Http\Controllers\CaptchaController::class, 'show'])->name('captcha.show');
// 验证码提交校验路由
Route::post('/captcha/verify', [\App\Http\Controllers\CaptchaController::class, 'verify'])->name('captcha.verify');

步骤5:实现验证码校验逻辑

创建CaptchaController编写校验逻辑:

php artisan make:controller CaptchaController

编辑app/Http/Controllers/CaptchaController.php:

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class CaptchaController extends Controller
{
    // 显示验证码页面
    public function show()
    {
        return view('captcha');
    }
    // 校验验证码
    public function verify(Request $request)
    {
        $request->validate([
            'captcha' => 'required|captcha'
        ], [
            'captcha.captcha' => '验证码输入错误,请重新输入'
        ]);
        // 标记验证通过,有效期1小时
        session(['captcha_verified' => now()->addHour()]);
        // 跳转至用户原本要访问的地址,默认跳转到首页
        return redirect()->intended(route('home'));
    }
}

步骤6:编写验证码页面模板

在resources/views目录下创建captcha.blade.php:

<!DOCTYPE html>
<html>
<head>
    <title>请完成验证码校验</title>
</head>
<body>
    <form action="{{ route('captcha.verify') }}" method="post">
        @csrf
        <div>
            <img src="{{ captcha_src() }}" alt="验证码" onclick="this.src='{{ captcha_src() }}?'+Math.random()">
            <p>点击图片可刷新验证码</p>
        </div>
        <div>
            <input type="text" name="captcha" placeholder="请输入验证码">
            @error('captcha')
                <p style="color: red;">{{ $message }}</p>
            @enderror
        </div>
        <button type="submit">提交验证</button>
    </form>
</body>
</html>

注意事项

  • 可编辑config/captcha.php文件自定义验证码的长度、字符类型、过期时间、样式等参数
  • 若需要用户每次浏览器会话仅验证一次,可去掉session的过期时间设置,会话结束后验证标记会自动失效
  • 多个需要前置校验的页面,直接给对应路由挂载captcha.check中间件即可复用能力

内容的提问来源于stack exchange,提问作者Himel shipu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 15:06:07