基于ajax实现验证码功能

实现验证码功能通常都会使用图片形式的验证码。但是,这种验证码存在一定的缺陷,例如图片难以识别、容易被机器识别等问题。因此,在某些情况下,我们可以考虑使用基于ajax实现的验证码功能来提高安全性。

具体实现步骤如下:

1.创建验证码php文件

首先,我们需要创建一个名为captcha.php的php文件,用于生成并输出验证码图片。代码示例如下:

session_start();
header("Content-type: image/png");//设置响应头部
$width = 100;//定义验证码图片的宽度
$height = 40;//定义验证码图片的高度
$code_len = 4;//验证码长度
$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';//字符池
$code = '';
for ($i = 0; $i < $code_len; $i++) {//生成随机字符
    $code .= $chars[mt_rand(0, strlen($chars) - 1)];
}
$_SESSION['captcha'] = strtolower($code);//将验证码存储到session中
$img = imagecreatetruecolor($width, $height);//创建画布
$bg_color = imagecolorallocate($img, mt_rand(170, 255), mt_rand(170, 255), mt_rand(170, 255));//背景颜色随机
imagefill($img, 0, 0, $bg_color);//填充背景
//画验证码字符
for ($i = 0; $i < $code_len; $i++) {
    $color = imagecolorallocate($img, mt_rand(0, 150), mt_rand(0, 150), mt_rand(0, 150));//每个字符的颜色随机
    imagettftext($img, 20, mt_rand(-30, 30), $i * ($width / $code_len) + 10, mt_rand($height / 2 - 5, $height / 2 + 10), $color, 'arial.ttf', $code[$i]);
}
imagepng($img);//输出图片
imagedestroy($img);//销毁图片

2.在html中引入验证码文件

在html中,我们通过img标签引入之前创建的验证码php文件,代码示例如下:

<img id="captchaImg" src="captcha.php" alt="captcha">
<button id="changeCaptcha">看不清,换一张</button>

其中,img标签的src属性指向captcha.php,用于获取验证码图片。button标签的id为changeCaptcha,用于点击后改变验证码图片。

3.ajax获取新验证码

当用户无法识别验证码,并点击了换一张按钮时,我们需要通过ajax获取新的验证码图片并替换原来的图片。

代码示例如下:

document.getElementById('changeCaptcha').addEventListener('click', function () {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'captcha.php?time=' + new Date().getTime(), true);//防止缓存,添加时间戳
    xhr.onreadystatechange = function () {
        if (xhr.readyState === 4 && xhr.status === 200) {
            document.getElementById("captchaImg").src = xhr.responseText;
        }
    };
    xhr.send();
});

其中,我们通过XMLHttpRequest对象获取captcha.php文件,并将获取到的responseText赋给img标签的src属性,完成验证码图片的切换。

示例1:在注册界面中使用基于ajax的验证码功能

在用户注册界面中,我们通常会使用验证码功能来防止机器恶意注册。以下是注册界面的html代码示例:

<form id="registerForm" action="register.php" method="post">
    <input type="text" name="username" placeholder="用户名">
    <input type="password" name="password" placeholder="密码">
    <input type="text" name="captcha" placeholder="验证码">
    <img id="captchaImg" src="captcha.php" alt="captcha">
    <button id="changeCaptcha">看不清,换一张</button>
    <button type="submit">注册</button>
</form>

在用户输入完用户名、密码和验证码后,当用户点击注册按钮时,我们需要对用户输入的信息进行验证,并提交给服务器进行注册。下面是实现的JavaScript代码示例:

document.getElementById('registerForm').addEventListener('submit', function (e) {
    e.preventDefault();//取消默认提交行为
    var captchaInput = this.querySelector('input[name=captcha]');//获取验证码输入框
    if (captchaInput.value !== '' && captchaInput.value === sessionStorage.getItem('captcha')) {
        this.submit();//提交表单
    } else {
        alert('验证码错误');//提示错误信息
    }
});

document.getElementById('changeCaptcha').addEventListener('click', function () {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'captcha.php?time=' + new Date().getTime(), true);//防止缓存,添加时间戳
    xhr.onreadystatechange = function () {
        if (xhr.readyState === 4 && xhr.status === 200) {
            document.getElementById("captchaImg").src = xhr.responseText;
            sessionStorage.setItem('captcha', xhr.responseText.toLowerCase());//将验证码存储到sessionStorage中
        }
    };
    xhr.send();
});

在用户输入验证码后,我们通过sessionStorage保存用户输入的验证码,并在表单提交时进行验证。如果验证成功,则执行表单的提交操作,否则提示错误信息。

示例2:使用ajax在登录界面中实现验证码刷新

在登录界面中,我们也可以使用ajax实现验证码刷新,提高安全性。以下是登录界面的html代码示例:

<form id="loginForm" action="login.php" method="post">
    <input type="text" name="username" placeholder="用户名">
    <input type="password" name="password" placeholder="密码">
    <input type="text" name="captcha" placeholder="验证码">
    <div id="captchaDiv">
        <img id="captchaImg" src="captcha.php" alt="captcha">
        <button id="changeCaptcha">换一张</button>
    </div>
    <button type="submit">登录</button>
</form>

在用户输入完用户名、密码和验证码后,当用户点击登录按钮时,我们需要对用户输入的信息进行验证,并提交给服务器进行登录。我们通过JavaScript实现验证码图片的刷新效果,代码如下:

document.getElementById('changeCaptcha').addEventListener('click', function () {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'captcha.php?time=' + new Date().getTime(), true);//防止缓存,添加时间戳
    xhr.onreadystatechange = function () {
        if (xhr.readyState === 4 && xhr.status === 200) {
            document.getElementById("captchaImg").src = xhr.responseText;
        }
    };
    xhr.send();
});

在用户点击换一张按钮时,通过XMLHttpRequest对象获取captcha.php文件,并将获取到的responseText赋给img标签的src属性,完成验证码图片的切换。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于ajax实现验证码功能 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • SpringBoot整合junit与Mybatis流程详解

    在Spring Boot应用程序中,我们可以使用JUnit和MyBatis来进行单元测试和数据库操作。本文将详细介绍如何在Spring Boot应用程序中整合JUnit和MyBatis,并演示如何进行单元测试和数据库操作。 1. 整合JUnit和MyBatis的步骤 在Spring Boot应用程序中整合JUnit和MyBatis的步骤如下: 添加JUnit…

    Java 2023年5月18日
    00
  • Java interrupt()方法使用注意_动力节点Java学院整理

    Java中的interrupt()方法用于中断线程的执行。但是,在使用interrupt()方法时需要注意一些问题。下面是使用Java interrupt()方法的注意事项: 1. 如何中断线程? 使用interrupt()方法中断线程,有以下几个步骤: 在线程中使用isInterrupted()或Thread.interrupted()等方法获取中断状态。…

    Java 2023年5月27日
    00
  • java中Servlet处理乱码的方法

    以下是“java中Servlet处理乱码的方法”的完整攻略: 1. 了解编码问题 在 Java 中,字符串都是以 Unicode 编码存储的。而在网络传输过程中,需要将字符串编码成字节流传输。常用的编码方式有 UTF-8 和 ISO-8859-1 等。而在解码端,也需要使用相应的编码方式来将字节流解码成字符串。如果编解码方式不一致,就会出现乱码问题。 2. …

    Java 2023年5月20日
    00
  • java定时器timer的使用方法代码示例

    下面我将为你讲解Java定时器Timer的使用方法和代码示例。 一、Java定时器的作用 Java定时器可以帮助我们实现在特定时间执行一些特定的任务,比如在每天6点定时启动一个备份任务、每隔一段时间更新一下缓存、每分钟检查一下服务器状态等等。使用Java定时器可以使得定时任务的执行更加自动化和可靠, 可以有效减少人力成本和提高程序的可靠性。 二、使用Java…

    Java 2023年5月20日
    00
  • 使用Spring Boot搭建Java web项目及开发过程图文详解

    下面我会为您详细讲解使用SpringBoot搭建JavaWeb项目及开发过程。本文将按照以下步骤详细展开: 环境准备及SpringBoot的简介 创建一个简单的SpringBoot项目 开发一个简单的RESTful接口 创建一个数据库,并通过MyBatis实现与之交互 使用Thymeleaf模板引擎开发前端页面 部署及运行项目 环境准备及SpringBoot…

    Java 2023年5月15日
    00
  • SpringMVC框架实现Handler处理器的三种写法

    下面我将为您详细讲解SpringMVC框架实现Handler处理器的三种写法的完整攻略。 什么是Handler 在SpringMVC框架中,Handler是一个接口,它的主要作用是处理请求,返回响应数据并选择视图来渲染响应结果。 SpringMVC框架实现Handler的三种写法 方式一:使用Controller注解 在SpringMVC框架中,我们可以使用…

    Java 2023年5月16日
    00
  • Spring与Struts整合之让Spring管理控制器操作示例

    首先介绍一下Spring和Struts的整合。在传统的Struts应用中,Struts DispatchAction负责将不同的请求分发给对应的Action进行处理。而在整合了Spring之后,Spring的IoC容器能够负责管理Struts的Action类,将这些Action类作为Spring的Bean进行管理,从而赋予了Struts更强大的扩展能力和灵活…

    Java 2023年5月20日
    00
  • request.getParameter()取值为null的解决方法

    当使用request.getParameter()方法获取HTTP请求参数时,有时候会遇到值为null的情况。这可能是由于以下原因导致的: 没有传递对应参数的值 参数值为空字符串 “” 参数名不存在 针对这种情况,一些解决方法如下: 1. 使用默认值 可以使用Java8引入的Optional类型和orElse方法来设置默认值。示例代码如下: String u…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部