SpringBoot最简单的登陆验证码+6套主页-【JSB项目实战】

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: SpringBoot最简单的登陆验证码+6套主页-【JSB项目实战】CSDN 转过来的,所以格式与内容有些许错误请见谅

SpringBoot系列文章目录

SpringBoot知识范围-学习步骤【JSB系列之000】

本系列校训

用免费公开视频,卷飞培训班哈人!打死不报班,赚钱靠狠干!
只要自己有电脑,前后项目都能搞!N年苦学无人问,一朝成名天下知!

SpringBoot技术很多很多

韩顺平说:学习JAVA的人有两大难
第一困惑,JAVA能百度到的知识太多太多,完全不知道学啥
第二困惑,就是不知道以什么样的顺序去学,有的时候乱看一堆视频有遗漏,有的时候,两边的视频还有重复。
Spring的外围技术就更多了。其实,验证码就是其中之一。
在这里插入图片描述

环境及工具:

本系列环境

环境 win11
工具 idea 2017
jdk 1.8
数据库 mysql5.5
maven 3.2.1
项目导入方式 maven 导入
数据库前端工具 mysql-front (navicat 也可以)

数据库前端工具:mysql-front (navicat 也可以)
主要是这些跟PHPStudy 2018 整合了,所以有的时候懒的打开navicat
关于环境的重要性,直接看上面的《SpringBoot 的项目编译即报错处理--JSB系列之001

上效果图

不管是啥系统,除了windows 上的小游戏之外,哪个不得注册,登陆,而登陆的页面大部分都会有一个验证码?

在这里插入图片描述
验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。

目前流行的验证码技术

这个东西,正如百度知道里介绍的。随着恶意破解密码的人越来越多,所以验证码技术也在越累越高。最初的时候,就是很简单的放一个算术表达式
在这里插入图片描述
还有这种
在这里插入图片描述
那基本上就直接画就行了。

早期的硬核画Graphics

/**
     * 生成验证码图片
     * @param securityCode
     * @return
     */
    public static BufferedImage createImage(String securityCode){
        int codeLength = securityCode.length();//验证码长度
        int fontSize = 18;//字体大小
        int fontWidth = fontSize+1;
        //图片宽高
        int width = codeLength*fontWidth+6;
        int height = fontSize*2+1;
        //图片
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = image.createGraphics();
        g.setColor(Color.WHITE);//设置背景色
        g.fillRect(0, 0, width, height);//填充背景
        g.setColor(Color.LIGHT_GRAY);//设置边框颜色
        g.setFont(new Font("Arial", Font.BOLD, height-2));//边框字体样式
        g.drawRect(0, 0, width-1, height-1);//绘制边框
        //绘制噪点
        Random rand = new Random();
        g.setColor(Color.LIGHT_GRAY);
        for (int i = 0; i < codeLength*6; i++) {
            int x = rand.nextInt(width);
            int y = rand.nextInt(height);
            g.drawRect(x, y, 1, 1);//绘制1*1大小的矩形
        }
        //绘制验证码
        int codeY = height-10;
        g.setColor(new Color(19,148,246));
        //Georgia  是个字体,如果想用中文要指定中文字体;eg:"宋体";
        //g.setFont(new Font("Georgia", Font.BOLD, fontSize));
        g.setFont(new Font("宋体", Font.BOLD, fontSize));
        for(int i=0;i<codeLength;i++){
            double deg=new Random().nextDouble()*20;
            g.rotate(Math.toRadians(deg), i*16+13,codeY-7.5);
            g.drawString(String.valueOf(securityCode.charAt(i)), i*16+5, codeY);
            g.rotate(Math.toRadians(-deg), i*16+13,codeY-7.5);
        }
        g.dispose();//关闭资源
        return image;
    }

CAPTCHA技术群雄乱战

如果你真的要用百度“spring Boot + 验证码”,这样并不能找到你想要的。但是当你使用 “spring Boot + CAPTCHA” 的时候,你就发现了,那叫一个多呀。还有N多的这种模块都说自己是官方的Spring Boot 验证码框架 - CAPTCHA 。

<dependency>
    <groupId>cn.dustlight.captcha</groupId>
    <artifactId>captcha-core</artifactId>
    <version>0.0.6</version>
</dependency>
<!--Kaptcha-->
<dependency>
    <groupId>com.github.penggle</groupId>
    <artifactId>kaptcha</artifactId>
    <version>2.3.2</version>
</dependency>

等等,

使用方式也是五花八门

有使用config配置类的。
有的用配置SpringBoot的配置文件里。

本文介绍的是SpecCaptcha或者叫easy-captcha?

easy-captcha工具包的好处:
1 跟以前的画验证码的方式差不多的理解,就用一个控制类就行了。
2 好看! ==我觉得这个应该算第一条==
3 集成简单。适合初学者

项目里如何使用

maven的pom.xml

<!--验证码-->
        <dependency>
            <groupId>com.github.whvcse</groupId>
            <artifactId>easy-captcha</artifactId>
            <version>1.6.2</version>
        </dependency>

控制层

package com.example.bus.controller;

import com.wf.captcha.SpecCaptcha;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@RestController
@RequestMapping("/code")
public class CaptchaController {

    /**
     * 生成验证码
     * @return
     * @throws Exception
     */
    @GetMapping("/getCode")
    public void getCode(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ServletOutputStream outputStream = response.getOutputStream();

        //算术验证码 数字加减乘除. 建议2位运算就行:captcha.setLen(2);
//        ArithmeticCaptcha captcha = new ArithmeticCaptcha(120, 40);

        // 中文验证码
//        ChineseCaptcha captcha = new ChineseCaptcha(120, 40);

        // 英文与数字验证码
        SpecCaptcha captcha = new SpecCaptcha(120, 40);

        //英文与数字动态验证码
//        GifCaptcha captcha = new GifCaptcha(120, 40);

        // 中文动态验证码
//        ChineseGifCaptcha captcha = new ChineseGifCaptcha(120, 40);
        // 几位数运算,默认是两位
        captcha.setLen(4);
        // 获取运算的结果
        String text = captcha.text();// 获取验证码文本内容
        System.out.println("验证码文本内容:" + text);
        request.getSession().setAttribute("captcha", text);
        //输出到页面。
        captcha.out(outputStream);
    }
}

从注释就可以看出,easy-captcha的功能还是挺强大,基本上主流的,英文+数字,中文,算术表达式都有。还有一个英文+数字GIF动画的,不过,在博客里也一样要用GIF才能看到效果。其实,博主最喜欢的就是他的英文+数字。跟别人的英文+数字真的是好看太多,而且也不易被软件识别。
在这里插入图片描述

页面里使用

因为整体的代码还是比较长。只放form的这一段了。

<form class="layui-form">
        <div class="login_face"><img src="/resources/images/face.jpg" class="userAvatar"></div>
        <div class="layui-form-item input-item">
            <label for="userName">用户名</label>
            <input type="text" placeholder="请输入用户名" autocomplete="off" name="loginname" class="layui-input" lay-verify="required">
        </div>
        <div class="layui-form-item input-item">
            <label for="password">密码</label>
            <input type="password" placeholder="请输入密码" autocomplete="off" name="pwd" class="layui-input" lay-verify="required">
        </div>
        <div class="layui-form-item input-item" id="imgCode">
            <label for="code">验证码</label>
            <input type="text" placeholder="请输入验证码" autocomplete="off" name="code"  id="code" class="layui-input">
            <img src="/code/getCode">
        </div>
        <div class="layui-form-item">
            <button class="layui-btn layui-block" lay-filter="login" lay-submit>登录</button>
        </div>
        <div class="layui-form-item layui-row">
            <!-- <a href="javascript:;" class="seraph icon-qq layui-col-xs4 layui-col-sm4 layui-col-md4 layui-col-lg4"></a>
            <a href="javascript:;" class="seraph icon-wechat layui-col-xs4 layui-col-sm4 layui-col-md4 layui-col-lg4"></a>
            <a href="javascript:;" class="seraph icon-sina layui-col-xs4 layui-col-sm4 layui-col-md4 layui-col-lg4"></a> -->
        </div>
    </form>

验证码的功能一般都在后台的登陆系统中使用。毕竟一个网站的管理者权限才是最危险的。

还要注意的是

如果项目里使用了shiro 的话,一定要把 验证码的URL放出来,不然的话,你的验证码的路径被你自己的shiro ==敌我不分的胡乱==杀掉了。
这里就不详细说了,这个知识点涉及的问题,比验证码还多。

/**
     * 配置shiro的过滤器
     */
    @Bean(SHIRO_FILTER)
    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
        ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
        // 设置安全管理器
        factoryBean.setSecurityManager(securityManager);
        // 设置未登陆的时要跳转的页面
        factoryBean.setLoginUrl(loginUrl);
        Map<String, String> filterChainDefinitionMap = new HashMap<>();
        // 设置放行的路径
        if (anonUrls != null && anonUrls.length > 0) {
            for (String anon : anonUrls) {
                filterChainDefinitionMap.put(anon, "anon");
            }
        }
        filterChainDefinitionMap.put("/static/**", "anon"); // 先把页面全放行了,不然调 试起来太麻烦了 ,by项目花园范德彪
        filterChainDefinitionMap.put("/code/**", "anon"); //这里要注意的是把验证码的URL放出来,不然不会显示到登陆上。by项目花园范德彪
        
        // 设置登出的路径
        if (null != logOutUrl) {
            filterChainDefinitionMap.put(logOutUrl, "logout");
        }
        // 设置拦截的路径
        if (authcUlrs != null && authcUlrs.length > 0) {
            for (String authc : authcUlrs) {
                filterChainDefinitionMap.put(authc, "authc");
            }
        }
        Map<String, Filter> filters=new HashMap<>();
//        filters.put("authc", new ShiroLoginFilter());
        //配置过滤器
        factoryBean.setFilters(filters);
        factoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return factoryBean;
    }

成功之后就可以展示出效果图的样子了。

配置文件设置

项目目录,不能有中文或空格,就乖乖的用C语言能识别的变量名是最好的

#配置数据源的属性
spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://127.0.0.1:3306/pet_minimeng?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTC
      username: root
      password: 123456
    #最大活跃数
      max-active: 20
      max-wait: 50000
      initial-size: 1
      filters: stat,log4j,wall
      validationQuery: SELECT 'x'   #验证连接
      enable: true
   #监控配置
      stat-view-servlet:
        enabled: true
        login-username: root
        login-password: xinyerfid
        allow: 
        deny: 
        url-pattern: /druid/*
  #thymeleaf的配置 
  thymeleaf: 
    cache: false
    enabled: true
#      web-stat-filter: 
#        enabled: true
#        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"

  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
#  aop:
#    proxy-target-class: true
#配置mybatisplus
mybatis-plus:
  mapper-locations:
  - classpath:mapper/*/*Mapper.xml
  global-config:
    db-config:
      id-type: auto
    banner: true
#  configuration:
#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    
#shiro的配置
shiro:
  hash-algorithm-name: md5
  hash-iterations: 2
  anon-urls:
  - /wx/**
  - /index.html*
  - /sys/toLogin*
  - /login/login*
  - /resources/**
  - /user/loadAllUser
  - /user/loadUsersByHospitalId
  login-url: /index.html
  log-out-url: /login/logout*
  authc-ulrs:
  - /**
server:
  port: 8088
example:
  wx:
    app-id:
    app-secret:
  

要注意的是启动的端口号,
数据源里的datasource 的名字。用户名,密码。还有就是mysql 的驱动是com.mysql.jdbc.Driver
总的来说,
com.mysql.jdbc.Driver 是 mysql-connector-java 5.5之前的,
com.mysql.cj.jdbc.Driver 是 mysql-connector-java 6及6之后的的,
初学者容易陷入一个误区,就是什么东西最新版是最好的,事实上很有可能他写的东西,明明JDK6.0就完全足够。一边喊着自己的机器内存不足,一边让内存运行着他自己用不到的东西。就比如说idea应该算是这些开发者工具里最卡的。有人可能明明只是打开几个网页,那为什么不使用webstorm? 甚至不是写很多代码的时候,为什么不选择更轻量级的VSCode?

项目中的一点小技巧:
第一套之后的其实是静态页面。那么从controller里转到public 里的静态资源里。

    /**
     * 跳转到首页
     */
    @RequestMapping("index")
    public String index() {
//        return "system/index/index";
        return "redirect:/index.html";
    }

所以,第2套到第6套如果还是要用菜单的话,只需要将return "system/index/index"; 的注释打开,再将return "redirect:/index.html"; 这一行注释掉就可以了。

导数据库

打开mysql-front 或navicat
注意:数据库名:jsb_db_score 超级用户:root 密码:123456
运行本例附件即可。最后导入数据库成功的截图如下:
系统登陆信息使用了md5加密
超级管理员:用户admin密码123456
在这里插入图片描述

ER图:很常用的用户,角色,权限模型,还有一个loginfo的登陆信息
业务表大部分都删掉了,不然表太多,学习起来也累。
在这里插入图片描述

项目目录如图:

不熟悉SpringBoot的人,可以好好研读一下【JSB系列】,注意目录层次。

关于public 与template 的差别请参见《SpringBoot项目中WEB页面放哪里--【JSB系列之008】

代码部分:

其它的代码直接参考另一篇登陆《SpringBoot登陆+6套主页-【JSB项目实战】》
项目不同,而且这个项目密码也加密了,还使用了shiro。

登陆进去之后

管理的界面大多数都是左树右表。
在这里插入图片描述

其它配套页面展示

直接给第二套方案的页面吧

在这里插入图片描述

第三套方案的页面。

在这里插入图片描述

让人发疯的好长好长的配套4的页面。

在这里插入图片描述

无电商不主页的配套5页面

在这里插入图片描述

迷你版电商的配套6

在这里插入图片描述

配套资源

不要VIP,就看你有多少积分了,还有就是CSDN好象自己会涨价。早下早享受哟
SpringBoot最简单的登陆验证码+6套主页-【JSB项目实战】1
https://download.csdn.net/download/dearmite/88104969
SpringBoot最简单的登陆验证码+6套主页-【JSB项目实战】2
https://download.csdn.net/download/dearmite/88105072?spm=1001.2014.3001.5503
SpringBoot最简单的登陆验证码+6套主页-【JSB项目实战】3
https://download.csdn.net/download/dearmite/88105075
SpringBoot最简单的登陆验证码+6套主页-【JSB项目实战】4
https://download.csdn.net/download/dearmite/88105180?spm=1001.2014.3001.5503
SpringBoot最简单的登陆验证码+6套主页-【JSB项目实战】5
https://download.csdn.net/download/dearmite/88105183
SpringBoot最简单的登陆验证码+6套主页-【JSB项目实战】6
https://download.csdn.net/download/dearmite/88105311?spm=1001.2014.3001.5503

作业:

无,看懂即是神
彪哥经典语录: 学项目,你得灵活,对方不按套路出牌,那你也不能按套路去打。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
Java 微服务 Spring
技术不行还说Java卷!靠468页SpringBoot企业级项目实战成功逆袭
今年应届生就业的话真的是个难题,就以java来说,往年会SSM框架就可以轻松找到工作了,而现在都是以微服务分布式起步了,没有适应环境发展需求的技术栈,根本达不到企业的用人标准。
|
6月前
|
前端开发 安全 Java
SpringBoot 实现登录验证码(附集成SpringSecurity)
SpringBoot 实现登录验证码(附集成SpringSecurity)
405 0
|
1月前
|
JavaScript 前端开发 数据可视化
【SpringBoot+Vue项目实战开发】2020实时更新。。。。。。
【SpringBoot+Vue项目实战开发】2020实时更新。。。。。。
48 0
|
3月前
|
SQL 前端开发 NoSQL
SpringBoot+Vue 实现图片验证码功能需求
这篇文章介绍了如何在SpringBoot+Vue项目中实现图片验证码功能,包括后端生成与校验验证码的方法以及前端展示验证码的实现步骤。
SpringBoot+Vue 实现图片验证码功能需求
|
3月前
|
NoSQL JavaScript Java
SpringBoot+Vue+Redis实现验证码功能、一个小时只允许发三次验证码。一次验证码有效期二分钟。SpringBoot整合Redis
这篇文章介绍了如何使用SpringBoot结合Vue和Redis实现验证码功能,包括验证码的有效期控制和一小时内发送次数的限制。
|
5月前
|
缓存 NoSQL Java
案例 采用Springboot默认的缓存方案Simple在三层架构中完成一个手机验证码生成校验的程序
案例 采用Springboot默认的缓存方案Simple在三层架构中完成一个手机验证码生成校验的程序
108 5
|
5月前
|
Java
springboot用户登录使用验证码
springboot用户登录使用验证码
|
6月前
|
前端开发 JavaScript Java
springboot 集成easy-captcha实现图像验证码显示和登录
springboot 集成easy-captcha实现图像验证码显示和登录
384 0
|
6月前
|
NoSQL 前端开发 Java
spring boot3登录开发-2(1图形验证码接口实现)
spring boot3登录开发-2(1图形验证码接口实现)
221 2
|
6月前
|
前端开发 NoSQL Java
【SpringBoot】秒杀业务:redis+拦截器+自定义注解+验证码简单实现限流
【SpringBoot】秒杀业务:redis+拦截器+自定义注解+验证码简单实现限流
169 0