Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十七):登录验证码实现(Captcha)

登录验证码

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

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

Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十七):登录验证码实现(Captcha)

实现案例

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

后端实现

1.添加依赖

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

pom.xml

com.github.axet
    kaptcha
    ${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

Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十七):登录验证码实现(Captcha)

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

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

Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十七):登录验证码实现(Captcha)

前端实现

1.添加组件

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

Login.vue

style="width: 100%;">

  class="line" :span="1"> 

        class="pointer" :src="loginForm.src" @click="refreshCaptcha">

2.添加组件

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

Login.vue

Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十七):登录验证码实现(Captcha)

3.验证规则

添加验证码验证规则。

Login.vue

Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十七):登录验证码实现(Captcha)

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也完成了。

最终效果

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

Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十七):登录验证码实现(Captcha)

源码下载

后端:https://gitee.com/liuge1988/kitty

前端:https://gitee.com/liuge1988/kitty-ui.git

作者:朝雨忆轻尘
出处:https://www.cnblogs.com/xifengxiaoma/
版权所有,欢迎转载,转载请注明原文作者及出处。

Original: https://www.cnblogs.com/xifengxiaoma/p/9871254.html
Author: 朝雨忆轻尘
Title: Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十七):登录验证码实现(Captcha)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/540371/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 低版本spring-cloud-sleuth的TraceableExecutorService一个坑,注意绕行

    我们知道Java 线程池提交任务有两种: 1,submit 会抛出异常,会有异常日志 2,execute 没有抛出异常,需要执行返回值Future的get方法触发抛出异常 exec…

    Java 2023年6月14日
    0108
  • docker

    一、docker安装 VMware centos7 卸载原有docker yum remove docker docker-common docker-selinux docker…

    Java 2023年6月9日
    096
  • java httpclient简单使用

    httpClient 官网 https://hc.apache.org/index.html https://hc.apache.org/httpcomponents-client…

    Java 2023年5月29日
    077
  • Spring知识点总结篇2 AOP

    AOP 的过程? Spring AOP 由 BeanPostProcessor 后置处理器开始,这个后置处理器可以监听容器触发的 Bean 生命周期事件,向容器注册后置处理器以后,…

    Java 2023年6月6日
    078
  • springmvc笔记

    一、MVC的定义 Model:数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在一般都分离开来:Value Obj…

    Java 2023年6月7日
    081
  • Map接口总结(如何使用默认方法)

    default方法 排序在前的方法较为常用。 默认方法是为了在标准库中添加默认支持函数式方法,同时也不必修改现有的类,这样做虽然有一定的好处,但是实际上在子类中使用default方…

    Java 2023年6月16日
    055
  • spring接收json字符串的两种方式

    一、前言 前几天遇到一个问题,前端H5调用我的springboot一个接口(post方式,@RequestParameter接收参数),传入的参数接收不到。自己测试接口时使用pos…

    Java 2023年6月5日
    087
  • 设计模式-工厂方法模式

    工厂方法模式是为了弥补 简…

    Java 2023年6月8日
    083
  • 整合redis并完成短信验证服务

    添加依赖 com.tencentcloudapi tencentcloud-sdk-java 3.1.509 org.springframework.boot spring-boo…

    Java 2023年6月9日
    0117
  • linux安装elasticsearch

    Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎…

    Java 2023年6月8日
    0122
  • 关于如何在Idea下进行多子项目及引用内部子项目情况下打包项目的方法

    近期在开发Java的时候遇到了如下的打包上的问题 需要将一个工程下面的子工程分别打包 有的子工程还包含了另一个子工程 在这种情况下打包会出现找不到子模块的情况。 JDK:1.8 开…

    Java 2023年6月15日
    089
  • Spring Cloud Alibaba 使用Seata解决分布式事务

    为什么会产生分布式事务? 随着业务的快速发展,网站系统往往由单体架构逐渐演变为分布式、微服务架构,而对于数据库则由单机数据库架构向分布式数据库架构转变。此时,我们会将一个大的应用系…

    Java 2023年6月5日
    090
  • java算法-选择排序

    选择排序算法特点: 每一轮找出一个最小值或者最大值,依次放在最前面的位置。在查找的过程中,用当前假定的最小值或者最大值,去跟后面所有的值进行比较。如果小或者大,就把下标给那个假定的…

    Java 2023年5月29日
    085
  • HIT软构博客9–复用性原则

    Liskov替换原则(LSP) Animal a = new Animal(); Animal c1 = new Cat(); Cat c2 = new Cat(); 编译器在静态…

    Java 2023年6月5日
    0100
  • 开学总动员!2022华为开发者大赛等你来挑战!

    摘要:9月23日开启2022华为开发者大赛”开学季总动员”主题直播活动。 金秋开学季,为了吸引更多高校开发者关注与参与华为开发者大赛,华为于9月23日开启2…

    Java 2023年6月15日
    072
  • java序列化导致的问题

    问题描述 最近在做一个需求的迭代过程中,遇到了一个tair(公司的一款缓存中间件,类似Redis)反序列化失败的问题,也就是把tair里缓存的值转换成对象的时候报错了。看了一下代码…

    Java 2023年6月13日
    088
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球