前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >验证码类

验证码类

作者头像
码客说
发布于 2019-10-22 06:03:30
发布于 2019-10-22 06:03:30
87400
代码可运行
举报
文章被收录于专栏:码客码客
运行总次数:0
代码可运行

工具类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.utils;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Random;

import javax.imageio.ImageIO;

public class ZJ_VerifyCodeUtils {
    // 使用到Algerian字体,系统里没有的话需要安装字体,字体只显示大写,去掉了1,0,i,o几个容易混淆的字符
    public static final String VERIFY_CODES = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ";
    private static Random random = new Random();

    /**
     * 使用系统默认字符源生成验证码
     * 
     * @param verifySize
     *            验证码长度
     * @return
     */
    public static String generateVerifyCode(int verifySize) {
        return generateVerifyCode(verifySize, VERIFY_CODES);
    }

    /**
     * 使用指定源生成验证码
     * 
     * @param verifySize
     *            验证码长度
     * @param sources
     *            验证码字符源
     * @return
     */
    public static String generateVerifyCode(int verifySize, String sources) {
        if (sources == null || sources.length() == 0) {
            sources = VERIFY_CODES;
        }
        int codesLen = sources.length();
        Random rand = new Random(System.currentTimeMillis());
        StringBuilder verifyCode = new StringBuilder(verifySize);
        for (int i = 0; i < verifySize; i++) {
            verifyCode.append(sources.charAt(rand.nextInt(codesLen - 1)));
        }
        return verifyCode.toString();
    }

    /**
     * 生成随机验证码文件,并返回验证码值
     * 
     * @param w
     * @param h
     * @param outputFile
     * @param verifySize
     * @return
     * @throws IOException
     */
    public static String outputVerifyImage(int w, int h, File outputFile, int verifySize) throws IOException {
        String verifyCode = generateVerifyCode(verifySize);
        outputImage(w, h, outputFile, verifyCode);
        return verifyCode;
    }

    /**
     * 输出随机验证码图片流,并返回验证码值
     * 
     * @param w
     * @param h
     * @param os
     * @param verifySize
     * @return
     * @throws IOException
     */
    public static String outputVerifyImage(int w, int h, OutputStream os, int verifySize) throws IOException {
        String verifyCode = generateVerifyCode(verifySize);
        outputImage(w, h, os, verifyCode);
        return verifyCode;
    }

    /**
     * 生成指定验证码图像文件
     * 
     * @param w
     * @param h
     * @param outputFile
     * @param code
     * @throws IOException
     */
    public static void outputImage(int w, int h, File outputFile, String code) throws IOException {
        if (outputFile == null) {
            return;
        }
        File dir = outputFile.getParentFile();
        if (!dir.exists()) {
            dir.mkdirs();
        }
        try {
            outputFile.createNewFile();
            FileOutputStream fos = new FileOutputStream(outputFile);
            outputImage(w, h, fos, code);
            fos.close();
        } catch (IOException e) {
            throw e;
        }
    }

    /**
     * 输出指定验证码图片流
     * 
     * @param w
     * @param h
     * @param os
     * @param code
     * @throws IOException
     */
    public static void outputImage(int w, int h, OutputStream os, String code) throws IOException {
        int verifySize = code.length();
        BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        Random rand = new Random();
        Graphics2D g2 = image.createGraphics();
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        Color[] colors = new Color[5];
        Color[] colorSpaces = new Color[] { Color.WHITE, Color.CYAN, Color.GRAY, Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE, Color.PINK, Color.YELLOW };
        float[] fractions = new float[colors.length];
        for (int i = 0; i < colors.length; i++) {
            colors[i] = colorSpaces[rand.nextInt(colorSpaces.length)];
            fractions[i] = rand.nextFloat();
        }
        Arrays.sort(fractions);

        g2.setColor(Color.GRAY);// 设置边框色
        g2.fillRect(0, 0, w, h);

        Color c = getRandColor(200, 250);
        g2.setColor(c);// 设置背景色
        g2.fillRect(0, 2, w, h - 4);

        // 绘制干扰线
        Random random = new Random();
        g2.setColor(getRandColor(160, 200));// 设置线条的颜色
        for (int i = 0; i < 20; i++) {
            int x = random.nextInt(w - 1);
            int y = random.nextInt(h - 1);
            int xl = random.nextInt(6) + 1;
            int yl = random.nextInt(12) + 1;
            g2.drawLine(x, y, x + xl + 40, y + yl + 20);
        }

        // 添加噪点
        float yawpRate = 0.05f;// 噪声率
        int area = (int) (yawpRate * w * h);
        for (int i = 0; i < area; i++) {
            int x = random.nextInt(w);
            int y = random.nextInt(h);
            int rgb = getRandomIntColor();
            image.setRGB(x, y, rgb);
        }

        shear(g2, w, h, c);// 使图片扭曲

        g2.setColor(getRandColor(100, 160));
        int fontSize = h - 4;
        Font font = new Font("Algerian", Font.ITALIC, fontSize);
        g2.setFont(font);
        char[] chars = code.toCharArray();
        for (int i = 0; i < verifySize; i++) {
            AffineTransform affine = new AffineTransform();
            affine.setToRotation(Math.PI / 4 * rand.nextDouble() * (rand.nextBoolean() ? 1 : -1), (w / verifySize) * i + fontSize / 2, h / 2);
            g2.setTransform(affine);
            g2.drawChars(chars, i, 1, ((w - 10) / verifySize) * i + 5, h / 2 + fontSize / 2 - 10);
        }

        g2.dispose();
        ImageIO.write(image, "jpg", os);
    }

    private static Color getRandColor(int fc, int bc) {
        if (fc > 255)
            fc = 255;
        if (bc > 255)
            bc = 255;
        int r = fc + random.nextInt(bc - fc);
        int g = fc + random.nextInt(bc - fc);
        int b = fc + random.nextInt(bc - fc);
        return new Color(r, g, b);
    }

    private static int getRandomIntColor() {
        int[] rgb = getRandomRgb();
        int color = 0;
        for (int c : rgb) {
            color = color << 8;
            color = color | c;
        }
        return color;
    }

    private static int[] getRandomRgb() {
        int[] rgb = new int[3];
        for (int i = 0; i < 3; i++) {
            rgb[i] = random.nextInt(255);
        }
        return rgb;
    }

    private static void shear(Graphics g, int w1, int h1, Color color) {
        shearX(g, w1, h1, color);
        shearY(g, w1, h1, color);
    }

    private static void shearX(Graphics g, int w1, int h1, Color color) {

        int period = random.nextInt(2);

        boolean borderGap = true;
        int frames = 1;
        int phase = random.nextInt(2);

        for (int i = 0; i < h1; i++) {
            double d = (double) (period >> 1) * Math.sin((double) i / (double) period + (6.2831853071795862D * (double) phase) / (double) frames);
            g.copyArea(0, i, w1, 1, (int) d, 0);
            if (borderGap) {
                g.setColor(color);
                g.drawLine((int) d, i, 0, i);
                g.drawLine((int) d + w1, i, w1, i);
            }
        }

    }

    private static void shearY(Graphics g, int w1, int h1, Color color) {

        int period = random.nextInt(40) + 10; // 50;

        boolean borderGap = true;
        int frames = 20;
        int phase = 7;
        for (int i = 0; i < w1; i++) {
            double d = (double) (period >> 1) * Math.sin((double) i / (double) period + (6.2831853071795862D * (double) phase) / (double) frames);
            g.copyArea(i, 0, 1, h1, 0, (int) d);
            if (borderGap) {
                g.setColor(color);
                g.drawLine(i, (int) d, i, 0);
                g.drawLine(i, (int) d + h1, i, h1);
            }

        }

    }

    public static void main(String[] args) throws IOException {
        File dir = new File("F:/verifies");
        int w = 200, h = 80;
        for (int i = 0; i < 50; i++) {
            String verifyCode = generateVerifyCode(4);
            File file = new File(dir, verifyCode + ".jpg");
            outputImage(w, h, file, verifyCode);
        }
    }
}

controller中(jfinal)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void verifyCode() throws IOException {
    HttpServletResponse response = getResponse();
    HttpServletRequest request = getRequest();
    response.setHeader("Pragma", "No-cache");
    response.setHeader("Cache-Control", "no-cache");
    response.setDateHeader("Expires", 0);
    response.setContentType("image/jpeg");
    HttpSession session = request.getSession(true);

    // 生成随机字串
    String verifyCode = ZJ_VerifyCodeUtils.generateVerifyCode(4);
    // 存入会话session
    session.setAttribute("code", verifyCode.toLowerCase());
    // 生成图片
    int w = 200, h = 80;
    ZJ_VerifyCodeUtils.outputImage(w, h, response.getOutputStream(), verifyCode);
    renderNull();
}

页面中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<img id="login_verifyCode" alt="" src="${basePath!}html/verifyCode" style="height: 25px;width: 58px;">

事件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$("#login_verifyCode").click(function() {
    var date = new Date();
    $("#login_verifyCode").attr("src", "${basePath!}html/verifyCode?date=" + date);
})
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-05-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Servlet生成数字验证码及判断
为了提高网站的安全性,或者软件的安全性,现在再输入用户名和密码进行网站或者软件登陆的时候,如果输错一次就会出现输入验证码这一项,主要是为了保护账号不被暴力破解。这里我简单实现一下验证码。 使用Servlet生成验证码部分是摘自javaeye,有现成的代码直接使用就好了。不过前台这块纠结了半天,本来是打算用js对输入的验证码进行判断结果发现实现不了。最后只能写jsp脚本实现了。 首先是Servlet代码:SimpleCaptchaServlet.java:
the5fire
2019/02/28
1.5K0
验证码VerifyCode
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/154615.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/07
8400
关于图片验证码的若干问题
图片验证码是在登录、注册中防止机器注册、灌水等的常用一种小技术。现在贴出我的一种实现代码,也是借鉴别人的。现在主要的java类如下:
幽鸿
2020/04/02
5370
利用java自动生成验证码
        验证码生成有两种形式,一种是保存一定的验证码图片在数据库中然后把相应的验证码也保存起来。通过查询数据库来确定用户输入的验证码是否正确。但是这种方式有很大的问题,其一就是验证码图片数量过少很容易就会发生重复,其二是每次验证都要查询数据库影响性能。
林老师带你学编程
2022/11/30
5200
javawebday30(验证码在客户端 用当前时间来请求下一张图片 VerifyCode代码)[通俗易懂]
页面运行servlet 500错误信息 tomcat报错卡住 可能是因为映射错误 即 web.xml中的问题 405 post改成get方法 如果出现不支持post提交 可能需要修改 表单中的提交方式 VerifyCode.java
全栈程序员站长
2022/09/14
1.4K0
javawebday30(验证码在客户端 用当前时间来请求下一张图片 VerifyCode代码)[通俗易懂]
Spring Security 如何添加登录验证码?松哥手把手教你给微人事添加登录验证码
登录添加验证码是一个非常常见的需求,网上也有非常成熟的解决方案。在传统的登录流程中加入一个登录验证码也不是难事,但是如何在 Spring Security 中添加登录验证码,对于初学者来说还是一件蛮有挑战的事情,因为默认情况下,在 Spring Security 中我们并不需要自己写登录认证逻辑,只需要自己稍微配置一下就可以了,所以如果要添加登录验证码,就涉及到如何在 Spring Security 即有的认证体系中,加入自己的验证逻辑。
江南一点雨
2020/03/06
1.8K0
Spring Security 如何添加登录验证码?松哥手把手教你给微人事添加登录验证码
SpringBoot集成SpringSecurity - 表单登录添加验证码(四)
源码地址:https://github.com/springsecuritydemo/microservice-auth-center04
用户1212940
2022/04/13
2K0
SpringBoot集成SpringSecurity - 表单登录添加验证码(四)
【验证码】SpringBoot前后端分离验证码
本篇文章记录的是我目前正在用的一种思路,不一定合所有人胃口,但我觉得是很不错的一种思路;
无道
2020/06/22
5.1K2
图片验证码
图片验证码 1.装有各种成语的文本文件 2.随机选取词语并绘制的servlet 3.页面静态文件html 4.判断验证码是否输入正确的servlet 01 words.txt 福如东海 寿比南山 马到成功 守株待兔 亡羊补牢 02 CheckWord.java public class CheckWord extends HttpServlet { private List<String> words = new ArrayList<String>(); @Override publ
木瓜煲鸡脚
2019/08/20
2.1K0
springboot项目(学生管理系统)day01
学生管理系统所使用的技术主要是soringboot+jsp+ajax+SSM,所以我们需要引入的包大概有这些:
上分如喝水
2021/08/16
9400
springboot项目(学生管理系统)day01
Java工具集-验证码工具类
代码示例 import javax.imageio.ImageIO; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.OutputStream; import java.util.Random; public class CaptchaUtil {
cwl_java
2020/08/02
1.2K0
使用java随机生成验证码
生成验证码图片 验证码是Completely Automated Public Turing test to tell Computers and Humans Apart(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序,可以防止:恶意破解密码、刷票、论坛灌水、有效防止某个黑客对某一特定注册用户,用特定程序暴力破解方式进行不断的登录尝试。实际上验证码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能。 下面我们就来学习如何自动生成一个验证码图片,案例的源代码点击此处进行下载,具体如下:
全栈程序员站长
2022/06/30
1.2K0
验证码的生成
public static void ImageCodeMaker(){ // 定义图片的宽度和高度 int width = 90, height = 40; // 创建一个图像对象 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 得到图像的环境对象 Graphics g = image.createGraphics();
JQ实验室
2022/02/09
1K0
怎么搭建直播平台,合理使用验证码工具类
Person-Holding-Smartphone_gVdPb2YBGXfQ (2).jpeg package com.ywfcake.demo.util; import lombok.extern.slf4j.Slf4j; import java.awt.*; import java.awt.image.BufferedImage; import java.util.HashMap; import java.util.Map; import java.util.Random; /**  * @Aut
yunbaokeji柯基
2020/10/09
1.8K0
怎么搭建直播平台,合理使用验证码工具类
Java实现验证码功能实例
Java如何实现验证码验证功能呢?日常生活中,验证码随处可见,他可以在一定程度上保护账号安全,那么他是怎么实现的呢?
Java团长
2018/08/06
1.4K0
java从入门到精通二十四(三层架构完成增删改查)
这里是看了一点jsp的,顺便过了一下,不是特别熟悉,因为现在这种技术是比较落后了,但是作为学习的过程也就学了下。 因为技术不是现在很常用,所以我没有单独做出笔记。将前段的一些知识,后端的一些知识简单结合一下,作为这个阶段的一个简单的练习。 虽然简单但是知识还是很值得注意,因为实现的前后端涉及到原理性的东西,还有零碎的知识点,所以自己就记录下来。 简单看了下mvc和三层架构的思想。我没有研究很深,但是看的出来是一种分而治之得思想,就是各自实现各自的功能,使得功能之间的服务更加有条理,而不是混在一块。
兰舟千帆
2022/07/16
1.5K0
java从入门到精通二十四(三层架构完成增删改查)
每日一码(1)--验证码的生成和使用
验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能。
浩Coding
2019/07/02
1K0
每日一码(1)--验证码的生成和使用
java工具类——验证码(VerifyCode)[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/159571.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/14
2K0
javaee的OA项目(四)登录退出功能的实现,验证码实现
登录成功,需要将当前登录用户的username展示在主页面,我们主页面是jsp页面,所以可以使用session获取,只需要在后端登录成功之后,我们将用户的信息保存在session中,之后跳转到主页面的时候,利用jstl工具 获取到session中的数据就可以了。
一写代码就开心
2021/06/17
5210
javaee的OA项目(四)登录退出功能的实现,验证码实现
SpringBoot + Vue 开发前后端分离的旅游管理系统
好像没有必要一段段的把代码贴上来,毫无意义,不如把完整的项目放出来,基本有点基础的都可以看懂哈,然后博客记录一下遇到的问题和重要的知识点。。
全栈程序员站长
2022/08/26
6470
SpringBoot + Vue 开发前后端分离的旅游管理系统
相关推荐
Servlet生成数字验证码及判断
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文