广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java实现动态验证码生成
  • 345
分享到

Java实现动态验证码生成

2024-04-02 19:04:59 345人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

本文实例为大家分享了Java动态验证码生成的具体代码,供大家参考,具体内容如下 说明:今天给大家来带来一个自动生成验证码的处理方法。验证码的出现有效减少了注入灌水以及破解密码等恶意操

本文实例为大家分享了Java动态验证码生成的具体代码,供大家参考,具体内容如下

说明:今天给大家来带来一个自动生成验证码的处理方法。验证码的出现有效减少了注入灌水以及破解密码等恶意操作,提高了系统运行的流畅性,保护了系统用户的隐私安全,具体实现方法如下:

1.首先我们先编写一个专门的验证码生成工具类,该工具类代码如下:

package com.ordering.util;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.Random;


public class CpachaUtil {
    
    
    final private char[] code = {
        '2', '3', '4', '5', '6', '7', '8', '9',
        'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
        'k', 'm', 'n', 'p', 'q', 'r', 's', 't', 'u', 'v', 
        'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F',
        'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R',
        'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
    };
    
    final private String[] fontNames = new String[]{
            "黑体", "宋体", "Courier", "Arial", 
            "Verdana", "Times", "Tahoma", "Georgia"};
    
    final private int[] fontStyles = new int[]{
            Font.BOLD, Font.ITALIC|Font.BOLD
    };
    
    
    private int vcodeLen = 4;
    
    private int fontsize = 21;
    
    private int width = (fontsize+1)*vcodeLen+10;
    
    private int height = fontsize+12;
    
    private int disturbline = 3;
    
    
    public CpachaUtil(){}
    
    
    public CpachaUtil(int vcodeLen) {
        this.vcodeLen = vcodeLen;
        this.width = (fontsize+1)*vcodeLen+10;
    }
    
    
    public CpachaUtil(int vcodeLen,int width,int height) {
        this.vcodeLen = vcodeLen;
        this.width = width;
        this.height = height;
    }
    
    
    public BufferedImage generatorVCodeImage(String vcode, boolean drawline){
        //创建验证码图片
        BufferedImage vcodeImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics g = vcodeImage.getGraphics();
        //填充背景色
        g.setColor(new Color(246, 240, 250));
        g.fillRect(0, 0, width, height);
        if(drawline){
            drawDisturbLine(g);
        }
        //用于生成伪随机数
        Random ran = new Random();
        //在图片上画验证码
        for(int i = 0;i < vcode.length();i++){
            //设置字体
            g.setFont(new Font(fontNames[ran.nextInt(fontNames.length)], fontStyles[ran.nextInt(fontStyles.length)], fontsize));
            //随机生成颜色
            g.setColor(getRandomColor());
            //画验证码
            g.drawString(vcode.charAt(i)+"", i*fontsize+10, fontsize+5);
        }
        //释放此图形的上下文以及它使用的所有系统资源
        g.dispose();
        
        return vcodeImage;
    }
    
    public BufferedImage generatorRotateVCodeImage(String vcode, boolean drawline){
        //创建验证码图片
        BufferedImage rotateVcodeImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = rotateVcodeImage.createGraphics();
        //填充背景色
        g2d.setColor(new Color(246, 240, 250));
        g2d.fillRect(0, 0, width, height);
        if(drawline){
            drawDisturbLine(g2d);
        }
        //在图片上画验证码
        for(int i = 0;i < vcode.length();i++){
            BufferedImage rotateImage = getRotateImage(vcode.charAt(i));
            g2d.drawImage(rotateImage, null, (int) (this.height * 0.7) * i, 0);
        }
        g2d.dispose();
        return rotateVcodeImage;
    }
    
    public String generatorVCode(){
        int len = code.length;
        Random ran = new Random();
        StringBuffer sb = new StringBuffer();
        for(int i = 0;i < vcodeLen;i++){
            int index = ran.nextInt(len);
            sb.append(code[index]);
        }
        return sb.toString();
    }
    
    private void drawDisturbLine(Graphics g){
        Random ran = new Random();
        for(int i = 0;i < disturbline;i++){
            int x1 = ran.nextInt(width);
            int y1 = ran.nextInt(height);
            int x2 = ran.nextInt(width);
            int y2 = ran.nextInt(height);
            g.setColor(getRandomColor());
            //画干扰线
            g.drawLine(x1, y1, x2, y2);
        }
    }
    
    private BufferedImage getRotateImage(char c){
        BufferedImage rotateImage = new BufferedImage(height, height, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = rotateImage.createGraphics();
        //设置透明度为0
        g2d.setColor(new Color(255, 255, 255, 0));
        g2d.fillRect(0, 0, height, height);
        Random ran = new Random();
        g2d.setFont(new Font(fontNames[ran.nextInt(fontNames.length)], fontStyles[ran.nextInt(fontStyles.length)], fontsize));
        g2d.setColor(getRandomColor());
        double theta = getTheta();
        //旋转图片
        g2d.rotate(theta, height/2, height/2);
        g2d.drawString(Character.toString(c), (height-fontsize)/2, fontsize+5);
        g2d.dispose();
        
        return rotateImage;
    }
    
    private Color getRandomColor(){
        Random ran = new Random();
        return new Color(ran.nextInt(220), ran.nextInt(220), ran.nextInt(220)); 
    }
    
    private double getTheta(){
        return ((int) (Math.random()*1000) % 2 == 0 ? -1 : 1)*Math.random();
    }

    
    public int getVcodeLen() {
        return vcodeLen;
    }
    
    public void setVcodeLen(int vcodeLen) {
        this.width = (fontsize+3)*vcodeLen+10;
        this.vcodeLen = vcodeLen;
    }
    
    public int getFontsize() {
        return fontsize;
    }
    
    public void setFontsize(int fontsize) {
        this.width = (fontsize+3)*vcodeLen+10;
        this.height = fontsize+15;
        this.fontsize = fontsize;
    }
    
    public int getWidth() {
        return width;
    }
    
    public void setWidth(int width) {
        this.width = width;
    }
    
    public int getHeight() {
        return height;
    }
    
    public void setHeight(int height) {
        this.height = height;
    }
    
    public int getDisturbline() {
        return disturbline;
    }
    
    public void setDisturbline(int disturbline) {
        this.disturbline = disturbline;
    }
    
}

2.然后在页面端定义一个显示验证码的控件,再写一个js函数来对后台动态生成验证码方法进行调用,主要代码如下:

<div class="login-center-input-text">验证码</div>
<img id="cpacha-img" title="点击切换验证码" style="cursor:pointer;" src="get_cpacha?vl=4&w=150&h=40&type=loginCpacha" width="110px" height="30px" onclick="changeCpacha()">
</div>

<script type="text/javascript">
function changeCpacha(){
        $("#cpacha-img").attr("src",'get_cpacha?vl=4&w=150&h=40&type=loginCpacha&t=' + new Date().getTime());
    }
</script>

3.控制器中代码如下:


    @RequestMapping(value = "/get_cpacha", method = RequestMethod.GET)
    public void generateCpacha(@RequestParam(name = "vl", required = false, defaultValue = "4") Integer vcodeLen,
            @RequestParam(name = "w", required = false, defaultValue = "100") Integer width,
            @RequestParam(name = "h", required = false, defaultValue = "30") Integer height,
            @RequestParam(name = "type", required = true, defaultValue = "loginCpacha") String cpachaType,
            httpservletRequest request, HttpServletResponse response) {
        //根据页面传入的验证码长度、图片宽度以及图片长度来实例化验证码实体
        CpachaUtil cpachaUtil = new CpachaUtil(vcodeLen, width, height);
        //生成验证码
        String generatorVCode = cpachaUtil.generatorVCode();
        //把验证码存入session
        request.getSession().setAttribute(cpachaType, generatorVCode);
        //根据验证码生成相应的验证码图片
        BufferedImage generatorRotateVCodeImage = cpachaUtil.generatorRotateVCodeImage(generatorVCode, true);
        try {
            ImageIO.write(generatorRotateVCodeImage, "gif", response.getOutputStream());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

4.实现效果如下图所示:

5.控制器验证码验证部分如下图所示:

//若验证码为空
if (StringUtils.isEmpty(cpacha)) {
            ret.put("type", "error");
            ret.put("msg", "请填写验证码!");
            return ret;
        }
        //获取保存在session中的登录验证码对象
        Object loginCpacha = request.getSession().getAttribute("loginCpacha");
        //若登录验证码实体对象为空
        if (loginCpacha == null) {
            ret.put("type", "error");
            ret.put("msg", "会话超时,请刷新页面!");
            return ret;
        }
        //若输入的验证码转化成大写之后不等于转换成大写的session中保存的验证码
        if (!cpacha.toUpperCase().equals(loginCpacha.toString().toUpperCase())) {
            ret.put("type", "error");
            ret.put("msg", "验证码错误!");
            //实例化日志信息实体
            OrderingLog orderingLog = new OrderingLog("用户名为" + user.getOuUsername() + "的用户登录时输入验证码错误!", new Date());
            //添加日志信息
            logService.addLog(orderingLog);
            return ret;
        }

注意:

只有当你把当前系统时间传入该验证码生成工具类中,才能实现点击验证码图片,实时自动替换验证码,如下图所示:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: Java实现动态验证码生成

本文链接: https://www.lsjlt.com/news/146839.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java实现动态验证码生成
    本文实例为大家分享了Java动态验证码生成的具体代码,供大家参考,具体内容如下 说明:今天给大家来带来一个自动生成验证码的处理方法。验证码的出现有效减少了注入灌水以及破解密码等恶意操...
    99+
    2022-11-13
  • 利用java实现验证码生成并完成验证
    利用java实现验证码生成并完成验证?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。java 制作验证码并进行验证实例详解在注册、登录的页面上经常会出现验证码,为...
    99+
    2023-05-31
    java 验证码 ava
  • Java如何实现验证码生成
    这篇文章主要介绍了Java如何实现验证码生成,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。验证码大家都知道,它的作用也不用我多说了吧。如果不太清楚请参见百度百科中的解释,一般...
    99+
    2023-05-30
    java
  • java实现动态图片验证码
    目的:防止恶意表单注册生成验证码图片定义宽高int width = 100; int height = 50;使用BufferedImage在内存中生成图片BufferedImage image = new BufferedImage(wi...
    99+
    2019-04-24
    java入门 java 动态 图片验证码
  • Java实现滑动验证码生成(后端工具类)
    目录一、滑动验证码生成思路二、主要方法三、生成代码四、测试结果一、滑动验证码生成思路 1、随机选择一张图片 2、生成滑块起点位置(x, y) 3、生成滑块轮廓 4、抠出滑块 5、将滑...
    99+
    2022-11-13
    Java滑动验证码 Java 验证码
  • 利用Java如何实现一个随机生成动态验证码功能
    利用Java如何实现一个随机生成动态验证码功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言相对来说呢,jpg格式的相对来说容易破解一点,当然也取决于你的干扰元素,元素...
    99+
    2023-05-31
    java 动态 验证码
  • java随机验证码生成实现实例代码
    java随机验证码生成实现实例代码摘要: 在项目中有很多情况下都需要使用到随机验证码,这里提供一个java的随机验证码生成方案,可以指定难度,生成的验证码可以很方便的和其他组件搭配之前要使用一个生成随机验证码的功能,在网上找了一下,有很多的...
    99+
    2023-05-31
    java 随机 验证码
  • php如何实现自动生成验证码
    本文操作环境:windows10系统、php 7、thinkpad t480电脑。现在验证码在表单中的应用越来越多了,但是如果用js来实现总觉得不太方便,因此使用php来实现下,在此记录下。当然,我们也可以封装成一个函数,以后使用的时候也是...
    99+
    2019-06-04
    php 验证码
  • java实现随机验证码图片生成
    本文实例为大家分享了java生成随机验证码图片的具体代码,供大家参考,具体内容如下 1.controller @GetMapping(value = "/getRan...
    99+
    2022-11-12
  • SpringBoot实现Thymeleaf验证码生成
    使用后台返回验证码图片,验证码存到session中后端实现校验,前端只展示验证码图片。 本篇用SpringBoot Thymeleaf实现验证码生成。 创建springboot项...
    99+
    2022-11-12
  • PHP怎么生成GIF动态图片验证码
    本篇内容主要讲解“PHP怎么生成GIF动态图片验证码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP怎么生成GIF动态图片验证码”吧!相信很多人都想过如何用PHP生成GIF动画来实现动态图片...
    99+
    2023-06-17
  • java后台验证码生成的实现方法
    效果图如下: 1.适用需求 后台生成验证码,用于登陆验证。 2. 功能实现所需控件/文件: 无(普通标签) 3.功能点实现思路 1)前台思路: (1)前台一个<input&g...
    99+
    2022-11-12
  • JS如何自动生成动态HTML验证码页面
    这篇文章主要为大家展示了“JS如何自动生成动态HTML验证码页面”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JS如何自动生成动态HTML验证码页面”这篇文章吧...
    99+
    2022-10-19
  • Vue实现图片验证码生成
    图片验证码主要用于注册,登录等提交场景中,目的是防止脚本进行批量注册、登录、灌水,相比不带图片验证的安全度有所提高,不过目前也有自动识别图片验证码的程序出现,基本都是付费识别,随之又...
    99+
    2022-11-13
  • JS实现随机生成验证码
    本文实例为大家分享了JS实现随机生成验证码的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html> <head>...
    99+
    2022-11-12
  • python实现验证码生成显示
    from captcha.image import ImageCaptcha import numpy as np import matplotlib.pyplot as plt from PIL import Image imp...
    99+
    2023-01-31
    验证码 python
  • Android实现随机生成验证码
    本文实例为大家分享了Android验证码的随机生成代码,供大家参考,具体内容如下 Code.java package com.example.myapp; import and...
    99+
    2022-11-12
  • JAVA怎么实现随机生成四位验证码
    Java可以使用Random类来实现随机生成四位验证码。下面是一个示例代码:```javaimport java.util.Rand...
    99+
    2023-08-09
    JAVA
  • java怎么实现随机验证码图片生成
    这篇文章主要介绍“java怎么实现随机验证码图片生成”,在日常操作中,相信很多人在java怎么实现随机验证码图片生成问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java怎么实现随机验证码图片生成”的疑惑有所...
    99+
    2023-06-25
  • php实现自动生成验证码的实例讲解
    现在验证码在表单中的应用越来越多了,但是如果用js来实现总觉得不太方便,因此使用php来实现下,在此记录下。 当然,我们也可以封装成一个函数,以后使用的时候也是很方便的,这里并未封装...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作