集成图片验证码Kaptcha-完成登录验证功能

news2024/12/27 10:50:19

下面展示的是用SpringBoot集成Kaptcha,当然用其他框架也是一样的。

导入Kaptcha

导入pom.xml,下面得到二选一,建议用github的,比google的快一点

<dependency>
    <groupId>com.github.penggle</groupId>
    <artifactId>kaptcha</artifactId>
    <version>2.3.2</version>
</dependency>
<dependency>
    <groupId>com.google.code.kaptcha</groupId>
    <artifactId>kaptcha</artifactId>
    <version>2.3</version>
</dependency>

编写配置类



import com.google.code.kaptcha.Producer;
import com.google.code.kaptcha.impl.DefaultKaptcha;

import com.google.code.kaptcha.util.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Properties;

@Configuration
public class KaptchaConfig {

    @Bean
    public Producer kaptchaProducer(){
        Properties properties = new Properties();
        properties.setProperty("kaptcah.image.width","100");
        properties.setProperty("kaptcah.image.heigh","40");
        properties.setProperty("kaptcah.textproducer.font.size","32");
        properties.setProperty("kaptcah.textproducer.font.color","0,0,0");
        properties.setProperty("kaptcah.textproducer.char.string","0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
        properties.setProperty("kaptcah.textproducer.char.length","4");
        properties.setProperty("kaptcha.noise.impl","com.google.code.kaptcha.impl.NoNoise");

        DefaultKaptcha kaptcha = new DefaultKaptcha();
        Config config = new Config(properties);
        kaptcha.setConfig(config);
        return kaptcha;
    }

}

在controller层调用方法

在controller层写

package com.kyw.controller;

import com.google.code.kaptcha.Producer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;


//登录注册
@Controller
@RequestMapping("/login")
public class LoginController {


    private static final Logger logger = LoggerFactory.getLogger(LoginController.class);

    @Autowired
    private Producer kaptchaProducer;

    /**
     * 生成验证码
     * @param response
     * @param session
     */
    @RequestMapping(value = "/kaptcha",method = RequestMethod.GET)
    public void getKaptcha(HttpServletResponse response,HttpSession session){
        //生成随机验证码
        String text = kaptchaProducer.createText();
        BufferedImage image = kaptchaProducer.createImage(text);
        //将验证码存入到Session
        session.setAttribute("kaptcha",text);
        //将图片传给前端
        response.setContentType("image/png");
        try {
            OutputStream os = response.getOutputStream();
            ImageIO.write(image,"png",os);
        }catch (IOException e){
            logger.error("响应验证码失败" + e.getMessage());
        }
    }


}

效果

图片样式可以更具下面的配置表进行修改

访问http://localhost:8081/login/kaptcha

Kaptcha的配置表

常量

描述

默认值

kaptcha.border

图片是否有边框

默认true

kaptcha.border.color

边框颜色

kaptcha.image.width

验证码图片宽

默认200

kaptcha.image.height

验证码图片高

默认50

kaptcha.textproducer.font.size

验证码文本字符大小

默认为40

kaptcha.session.key

session key

KAPTCHA_SESSION_KEY

kaptcha.textproducer.char.length

验证码文本字符长度

默认为5

kaptcha.textproducer.font.names

验证码文本字体样式

默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)

kaptcha.obscurificator.impl

图片样式

水纹com.google.code.kaptcha.impl.WaterRipple

鱼眼com.google.code.kaptcha.impl.FishEyeGimpy

阴影com.google.code.kaptcha.impl.ShadowGimpy

kaptcha.textproducer.impl

验证码文本生成规则

kaptcha.textproducer.char.space

验证码文本字符间距

默认为2

kaptcha.noise.color

验证码干扰颜色

默认为Color.BLACK

kaptcha.noise.impl

干扰实现类

com.google.code.kaptcha.impl.NoNoise

kaptcha.background.impl

背景实现类

com.google.code.kaptcha.impl.DefaultBackground

kaptcha.producer.impl

图片实现类

com.google.code.kaptcha.impl.DefaultKaptcha

kaptcha.textproducer.impl

文本实现类

com.google.code.kaptcha.text.impl.DefaultTextCreator

kaptcha.textproducer.char.string

文本集合

kaptcha.background.clear.from

背景颜色渐变,开始颜色

kaptcha.background.clear.to

背景颜色渐变, 结束颜色

kaptcha.session.date

session date

KAPTCHA_SESSION_DATE

验证码集成到登录功能

前端

简单的引入,因为后端的接口已经写好了,访问那个接口就会传回图片,所以前端直接在 img里面写上后端的路径就行了,这里前端用的是Thymeleaf模板

在你的Login.html里面加上下面的代码

刷新验证码怎么做?

其实就是重新再访问一次这个路径就行了,那么直接做刷新也行,但是这样不好,会刷新整个网页,我们要的是局部刷新,也就是只把图片那块刷新。

给a标签加一个方法,点击a标签就执行下面js的方法,让其用jquer去改掉img标签的src值,就能做到刷新验证码。

防止浏览器偷懒

如果你将路径改成原来的 /login/kaptcha 理论上应该是浏览器会刷新页面,因为我们又发送了一次请求,但是实际上浏览器会偷懒,浏览器觉得你在请求一个静态资源,而且路径时一样的,就不访问了,所以我们做的时候,给url后面拼接一个 “ ?p=Math.random” 这样每次访问的请求就不一样了,就能防止浏览器偷懒

<input type="text" class="text" name="Kaptcha" placeholder="验证码" required="">
<div>
    <img th:src="@{/login/kaptcha}" id="kaptchaImg">
    <a href="javascript:refresh_kaptcha()">刷新验证码</a>
</div>

js

function refresh_kaptcha(){
    $("#kaptchaImg").attr("src","/login/kaptcha?p="+Math.random())
}

后端

后端就是验证一下这个验证码对不对,然后发送前端验证的结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/974220.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024腾讯校招后端面试真题汇总及其解答(三)

21【算法题】反转链表 题目: 给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。 示例 1: 输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2: 输入:head = [1,2] 输出:[2,1]示例 3: 输入:head = [] 输出:[]提示: 链表中节点的数目范围是 [0, 5…

Chrome 和 Edge 上出现“status_breakpoint”错误解决办法

文章目录 STATUS_BREAKPOINTSTATUS_BREAKPOINT报错解决办法Chrome浏览器 Status_breakpoint 错误修复- 将 Chrome 浏览器更新到最新版本- 卸载不再使用的扩展程序和应用程序- 安装计算机上可用的任何更新&#xff0c;尤其是 Windows 10- 重启你的电脑。 Edge浏览器 Status_brea…

基于 Flink CDC 构建 MySQL 和 Postgres 的 Streaming ETL

官方网址&#xff1a;https://ververica.github.io/flink-cdc-connectors/release-2.3/content/%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B/mysql-postgres-tutorial-zh.html官方教程有些坑&#xff0c;经过自己实测&#xff0c;记录个笔记。 服务器环境&#xff1a; VM虚拟机&am…

HarmonyOS 实现表单页面的输入,必填校验和提交

一. 样例介绍 本篇 Codelab 基于 input 组件、label 组件和 dialog 组件&#xff0c;实现表单页面的输入、必填校验和提交&#xff1a; 1. 为 input 组件设置不同类型&#xff08;如&#xff1a;text&#xff0c;email&#xff0c;date 等&#xff09;&#xff0c;完成表单页…

Burp插件HaE与Authz用法

HaE与Authz均为BurpSuite插件生态的一员&#xff0c;两者搭配可以避免“越权”、“未授权”两类漏洞的重复测试行为。&#xff08;适用于业务繁杂&#xff0c;系统模块功能多的场景&#xff09; 两个插件都可以在store里安装 安装完后&#xff0c;点击Filter Settings勾选Sho…

DSP_TMS320F28377D_算法加速方法4_C语言编程优化

前面3篇的优化思路是从硬件本身和函数库这些方向去加速&#xff0c; 本文则仅从代码本身的效率去考虑加速的方法。 1、用全局变量比用局部变量快 void testfunction1(){ // 局部变量int i;double s,a,b;a 1.023;b 12.23;for(i 0; i < 1000; i){s __divf32(a,b);} }int …

这3个教学难题,你中招了吗?

在当今教育领域&#xff0c;提高教育质量和学生学习成果是学校和教育机构的首要任务之一。教育管理者、教师和政策制定者都在寻求创新的方法来监督和改进教育过程。 在线巡课系统应运而生&#xff0c;成为教育界的一项重要工具&#xff0c;旨在帮助学校管理者更好地理解教育实践…

无涯教程-JavaScript - ISOWEEKNUM函数

描述 ISOWEEKNUM函数返回给定日期的年份的ISO周编号。 语法 ISOWEEKNUM (date)争论 Argument描述Required/OptionalDateDate is the date-time code used by Excel for date and time calculation.Required Notes Microsoft Excel将日期存储为连续数字,因此可以在计算中使…

【网络教程】记一次使用Docker手动搭建BT宝塔面板的全过程(包含问题解决如:宝塔面板无法开启防火墙,ssh,nginx等)

文章目录 准备安装安装宝塔面板开启ssh和修改ssh的密码导出镜像问题解决宝塔面板无法开启防火墙无法启动ssh设置密码nginx安装失败设置开机启动相关服务准备 演示的系统环境:Ubuntu 22.04.3 LTS更新安装/升级docker到最新版本升级docker相关命令如下# 更新软件包列表并自动升级…

期权交易策略及案例的基本策略有哪些?

目前我国上市交易的期权品种日益丰富&#xff0c;期权的基础的交易方法是建立相应头寸再反向平仓&#xff0c;赚取权利金差价&#xff0c;也可以持有期权到期行权。除了基础的交易方法之外&#xff0c;期权还有一些组合策略&#xff0c;下文介绍期权交易策略及案例的基本策略有…

K210-AI视觉

1、颜色识别 image.find_blobs( thresholds, invertFalse, roi, x_stride2, y_stride1, area_threshold10, pixels_threshold10, mergeFalse, margin0, threshold_cbNone, merge_cbNone)thresholds : 必须是元组列表。 [(lo, hi), (lo, hi), …, (lo, hi)] 定义你想追踪…

Python数据分析实战-Series转DataFrame并将index设为新的一列(附源码和实现效果)

实现功能 Series转DataFrame并将index设为新的一列 实现代码 import pandas as pd# 创创建series series pd.Series([1, 2, 3, 4, 5])# 创建一个DataFrame对象 data {column_name: series} df pd.DataFrame(data)# 重新设置索引&#xff0c;将原有的索引作为新的一列 df.r…

计算机的 bit(比特)和Byte(字节)

我们来说说和数据有关的单位 bit 和 Byte。 在说这这个数据当我之前&#xff0c;大家应该都知道计算机实际上只能处理0和1。 计算机能够把0和1转换为电路中的信号来进行计算&#xff0c;这个其实就是计算机的本质。 单位定义 我们先对需要使用的单位进行一些定义。 bit&…

Swift 周报 第三十六期

文章目录 前言新闻和社区消息称苹果公司和印度财政部官员磋商&#xff0c;扩大在印度的制造产能iPhone 15 Pro 机型新增泰坦灰iPhone 15 全系配 USB-C 苹果拒绝接口和安卓互通 提案正在审查的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编辑组整理周报的第三十…

AcWing 787:归并排序

【题目来源】https://www.acwing.com/problem/content/789/【题目描述】 给定你一个长度为 n 的整数数列。 请你使用归并排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。【输入格式】 输入共两行&#xff0c;第一行包含整数 n。 第二行包含 n 个整数&#…

鼠标知识系列之星闪鼠标

随着 2023.8.4 华为 HDC 大会的落幕&#xff0c;一个新的名词开始进入了人们的视线&#xff1a;星闪 NaerLink&#xff0c;随着星闪技术引入键鼠圈子的还有一个名词&#xff1a;星闪鼠标。 正如我们之前鼠标知识分享系列提到过的&#xff0c;目前市面上的鼠标主要是有线鼠标和…

数据库原理及应用(MySQL)

建议大屏观看&#xff0c;避免格式错误&#xff0c;影响观感 目录 第一章 数据库系统概述 1.数据库系统概述 1.1.信息 1.2.数据 1.3.信息和数据之间的联系 1.4.数据库&#xff08;DB&#xff09; 1.5.数据库管理系统&#xff08;DBMS&#xff09; 1.6.数据库管理系统的…

简单了解ARP协议

目录 一、什么是ARP协议&#xff1f; 二、为什么需要ARP协议&#xff1f; 三、ARP报文格式 四、广播域是什么&#xff1f; 五、ARP缓存表是什么&#xff1f; 六、ARP的类型 6.1 ARP代理 6.2 免费ARP 七、不同网络设备收到ARP广播报文的处理规则 八、ARP工作机制原理 …

楠姐技术漫话:接着唠唠社区发现 | 京东云技术团队

★ halo&#xff0c;大家好很开心又和大家见面了 ★ 在第一篇 楠姐技术漫画&#xff1a;图计算的那些事 发布之后&#xff0c;楠姐收到了很多建议、鼓励和支持&#xff0c;非常感谢大家的喜欢&#xff0c;所以楠姐尽自己所能马不停蹄开始第二篇的创作&#xff0c;虽迟但到~ ★…

高等数学笔记

|sinx|连续不可导 只要在x0处存在极限且极限等于f(x0)则函数在此处连续 如果某点可导则左右导数应该相等&#xff08;可导一定连续&#xff0c;连续不一定可导&#xff09; 双曲函数的由来 塞入dx 莱布尼茨公式 sin(nx)的k次导n^k*sin(nxkΠ/2) 注意符号&#xff01; 二阶导公…