登录验证码实现(Captcha)

登录验证码

登录验证是一般系统都会有的功能,验证的方式也多种多样,比如输入式验证码,拖动式验证条,拖动式验证拼图等等。

我们这里先实现常规的输入验证码的方式,右边显示验证码图片,点击可刷新,左边输入验证码。如下图为实现的效果。

实现案例

验证码的实现需要前后端协同,脱离彼此则不可用,故将前后端的实现放在一起,不再另写前端教程。

后端实现

1.添加依赖

打开 kitty-admin 工程,添加maven依赖。

pom.xml

<!-- kaptcha -->
<dependency>
    <groupId>com.github.axet</groupId>
    <artifactId>kaptcha</artifactId>
    <version>${kaptcha.version}</version>
</dependency>

版本是 <kaptcha.version>0.0.9</kaptcha.version>

2.添加配置

添加验证码配置类 KaptchaConfig,配置验证码的一些样式。

KaptchaConfig.java

package com.louis.kitty.admin.config;

import java.util.Properties;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;

/**
 * 验证码配置
 * @author Louis
 * @date Oct 29, 2018
 */
@Configuration
public class KaptchaConfig {

    @Bean
    public DefaultKaptcha producer() {
        Properties properties = new Properties();
        properties.put("kaptcha.border", "no");
        properties.put("kaptcha.textproducer.font.color", "black");
        properties.put("kaptcha.textproducer.char.space", "5");
        Config config = new Config(properties);
        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
        defaultKaptcha.setConfig(config);
        return defaultKaptcha;
    }
}

3.添加验证码获取接口

添加验证码获取接口,并将生成的验证码保存起来,在登录的时候用来跟前台输入验证码进行匹配。

SysLoginController.java

    @GetMapping("captcha.jpg")
    public void captcha(HttpServletResponse response) throws ServletException, IOException {
        response.setHeader("Cache-Control", "no-store, no-cache");
        response.setContentType("image/jpeg");

        // 生成文字验证码
        String text = producer.createText();
        // 生成图片验证码
        BufferedImage image = producer.createImage(text);
        // 保存到验证码到 session
        ShiroUtils.setSessionAttribute(Constants.KAPTCHA_SESSION_KEY, text);

        ServletOutputStream out = response.getOutputStream();
        ImageIO.write(image, "jpg", out);
        IOUtils.closeQuietly(out);
    }

4.登录接口增加验证码验证

登录接口增加验证码验证,将之前保存的验证码跟前台输入验证码进行匹配。

SysLoginController.java

    /**
     * 登录接口
     */
    @PostMapping(value = "/login")
    public HttpResult login(@RequestBody LoginBean loginBean) throws IOException {
        String userName = loginBean.getAccount();
        String password = loginBean.getPassword();
        String captcha = loginBean.getCaptcha();

        // 从session中获取之前保存的验证码跟前台传来的验证码进行匹配
        Object kaptcha = ShiroUtils.getSessionAttribute(Constants.KAPTCHA_SESSION_KEY);
        if(kaptcha == null){
            return HttpResult.error("验证码已失效");
        }
        if(!captcha.equals(kaptcha)){
            return HttpResult.error("验证码不正确");
        }

        // 用户信息
        SysUser user = sysUserService.findByName(userName);

        // 账号不存在、密码错误
        if (user == null) {
            return HttpResult.error("账号不存在");
        }

        if (!match(user, password)) {
            return HttpResult.error("密码不正确");
        }

        // 账号锁定
        if (user.getStatus() == 0) {
            return HttpResult.error("账号已被锁定,请联系管理员");
        }

        // 生成token,并保存到数据库
        SysUserToken data = sysUserTokenService.createToken(user.getId());
        return HttpResult.ok(data);
    }

5.修改Shiro配置

修改Shiro配置,配置验证码生成接口无需进行登录认证。

ShiroConfig.java

到这里后台代码就完成了。

启动程序,访问 http://localhost:8001/captcha.jpg,如果结果如下就没问题了。

前端实现

1.添加组件

打开登录页面,在密码栏下面增加一行验证码。

Login.vue

<el-form-item >
  <el-col :span="12">
    <el-form-item prop="captcha">
      <el-input type="test" v-model="loginForm.captcha" auto-complete="off" placeholder="验证码, 单击图片刷新"
        style="width: 100%;">
      </el-input>
    </el-form-item>
  </el-col>
  <el-col class="line" :span="1">&nbsp;</el-col>
  <el-col :span="11">
    <el-form-item>
        <img style="width: 100%;" class="pointer" :src="loginForm.src" @click="refreshCaptcha">
    </el-form-item>
  </el-col>
</el-form-item>

2.添加组件

添加验证码相关的属性,captcha是验证码值,src是验证码图片路径。

Login.vue

3.验证规则

添加验证码验证规则。

Login.vue

4.传入验证码

在登录接口调用的时候,一并传入验证码。

Login.vue

let userInfo = {account:this.loginForm.account, password:this.loginForm.password, captcha:this.loginForm.captcha}

5.刷新验证码

添加refreshCaptcha方法,增加刷新验证码的逻辑。

Login.vue

refreshCaptcha: function(){
      this.loginForm.src = this.global.baseUrl + "/captcha.jpg?t=" + new Date().getTime();
    }

到这里前端diam也完成了。

最终效果

启动前后端,最终界面效果如下。

原文地址:https://www.cnblogs.com/7788IT/p/10667200.html

时间: 2024-08-25 00:19:27

登录验证码实现(Captcha)的相关文章

使用easy_captcha生成登录验证码 ruby on rails

(1)新增gem to Gemfile ,then  bundle install gem 'easy_captcha', git: 'https://github.com/phatworx/easy_captcha.git' gem 'rmagick' (2)after bundle execute rails g easy_captcha:install 运行完这句话,可以看到app/controllers/application_controller.rb 和 config/routes.

那些琐碎的知识-----登录验证码

1.新建文件CheckCode.aspx 前台不用写,后台代码为: using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControl

C# 登录验证码

基于字符的图片验证码是系统在用户访问页面时随机产生的一个图像,图像中包含数字.字母或其他文字.其中字符序列与背景图像进行信息融合,添加干扰噪声,或对图像进行混杂.扭曲.粘连.变形等处理,以增加图像识别的难度. 图片验证码的生成主要分成两个步骤: 1.生成随机字符串: 2.生成验证码图片. 1 public partial class CheckCodeImageExt : System.Web.UI.Page 2 { 3 protected void Page_Load(object sende

Selenium2学习-018-WebUI自动化实战实例-016-自动化脚本编写过程中的登录验证码问题

日常的 Web 网站开发的过程中,为提升登录安全或防止用户通过脚本进行黄牛操作(宇宙最贵铁皮天朝魔都的机动车牌照竞拍中),很多网站在登录的时候,添加了验证码验证,而且验证码的实现越来越复杂,对其进行脚本识别的难度也越来越高.这对我们自动化脚本编写带了非常的不便,那么如何解决登录时的验证码问题呢?经常有初学自动化脚本编写的小主们问及此问题. 此文主要针对如何解决自动化测试脚本中含登录态的操作问题,即如何降低验证码对自动化脚本编写过程中的解决方法进行分析和解决,并以实例演示(基于易迅网易迅账号登录)

selemiun 自动化测试登录验证码处理

selemiun 自动化测试登录验证码处理 一.软件及插件的安装 1.火狐浏览器版本(55.0(x64 zh-CN):https://www.cnblogs.com/sandysun/p/7838113.html插件安装:(1)firebug(2)selenim ide(3)xpath finder 2.Python及编辑器安装(1)Python 3.7.0(下载火狐驱动geckodriver.exe2.32,保存在Python\py3安装路径中) pycharm 2018(2)下载seleni

Java实现登录验证码

登录验证码 Servlet /* 从请求中获取数据,获取验证码的session的值转为String类型,?????? 销毁,防止返回后验证码不刷新,重新验证成功?????? 判断验证码是否相同(忽略大小写)?? 相同:创建user对象调用service层的方法验证返回结果是否为空?????? ?为空:创建session:储存错误信息,转发,登录页面显示登录名或密码错误???? ?不为空:创建session:储存用户名,转发,到登录成功页面?????? 不相同:创建session:储存错误信息,登

thinkphp3.2 实现登录+验证码

1 <?php 2 3 namespace Model; 4 5 use Think\Model; 6 7 class UserModel extends Model { 8 9 function checkNamePwd($mg_name, $mg_password) { 10 //实例化模型User 11 $user = M("User"); 12 //接收控制器传的数据,进行判断是否一致.并且返回 13 $info = $user->getBy_mgname($mg_

stash 登录验证码不显示,报Could not initialize class sun.awt.X11FontManager错误

stash登录时提示输入验证码,可是验证码不显示了,怎么解决了? 报错信息: 再通过chrome的审查元素进行查看具体报错的原因: Error creating bean with name 'imageCaptchaServicePrototype' defined in class path resource [stash-context.xml]: Cannot create inner bean 'com.atlassian.stash.internal.web.util.captcha

登录验证码编写(jsp+servlet+dao)

一.什么是验证码及它的作用 验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计算机的公共全自动程序,这个问题可以由计算机生成并评判,但是必须只有人类才能解答. 可以防止恶意破解密码.刷票.论坛灌水.有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登录. 二.图文验证码的原理 在 servlet中随机生成一个指定位置的验证码,一般为四位,然后把该验证码保存到session中.在通过Java的绘图类以图片的形式输出该验证码. 为了增加验证码的安全级别,可以输出图片