基于Java实现随机字母数字验证码

本文介绍如何使用Java生成随机字母数字验证码,包括详细步骤和相关工具类 VerifyCode 的用法,以及验证方法的说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

生成随街验证码

VerifyCode 工具类

package com.meeno.common.cerifycode;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

/**
 * @description: 随机验证码
 * @author: Wzq
 * @create: 2020-09-08 16:55
 */
public class VerifyCode {

    private int w=70;
    private int h=35;
    private Random r= new Random();

    private String[] fontNames={"宋体","华文楷体","黑体","微软雅黑","楷体_GB2312"};
    private String codes="012345678901234567890123456789abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ";
    private Color bgColor = new Color(255,255,255);
    private String text;

    private Color randomColor(){
        int red = r.nextInt(150);
        int green = r.nextInt(150);
        int blue = r.nextInt(150);
        return new Color(red,green,blue);
    }

    private Font randomFont(){
        int index = this.r.nextInt(fontNames.length);
        String fontName = fontNames[index];
        int style = this.r.nextInt(4);
        int size = this.r.nextInt(5) + 24;
        return new Font(fontName, style, size);
    }

    private void drawLine (BufferedImage image){
        int num = 3;
        Graphics2D g2=(Graphics2D)image.getGraphics();
        for(int i=0;i<num;i++){
            int x1=r.nextInt(w);
            int y1=r.nextInt(h);
            int x2=r.nextInt(w);
            int y2=r.nextInt(h);
            g2.setStroke(new BasicStroke(1.5F));
            g2.setColor(Color.BLUE);
            g2.drawLine(x1,y1,x2,y2);
        }

    }

    private char randomChar(){
        int index=r.nextInt(this.codes.length());
        return this.codes.charAt(index);
    }

    private BufferedImage createImage(){
        BufferedImage image=new BufferedImage(this.w,this.h,BufferedImage.TYPE_INT_RGB);//BufferedImage.TYPE_INT_RGB
        Graphics2D g2 = (Graphics2D)image.getGraphics();
        g2.setColor(this.bgColor);
        g2.fillRect(0,0,this.w,this.h);
        return image;
    }

    public BufferedImage getImage(){
        BufferedImage image=createImage();
        Graphics2D g2=(Graphics2D)image.getGraphics();
        StringBuilder sb = new StringBuilder();
        for(int i =0;i<4;i++){
            String s= randomChar()+"";
            sb.append(s);
            float x= i*1.0F*this.w/4.0F;
            g2.setFont(randomFont());
            g2.setColor(randomColor());
            g2.drawString(s,x,this.h-5);
        }
        this.text=sb.toString();
        drawLine(image);//添加干扰线
        return image;
    }
    //返回验证码上的文本
    public String getText(){
        return this.text;

    }
    //保存图片到指定的输出流
    public static void output(BufferedImage image, OutputStream out)
            throws IOException {
        ImageIO.write(image,"JPEG",out);

    }

    public static void main(String[] args) throws IOException {
        VerifyCode vc=new VerifyCode();
        BufferedImage bi = vc.getImage();
        VerifyCode.output(bi,new FileOutputStream("E:\\work\\temp\\xxx.jpg"));

        System.out.println("图片中的验证是:"+vc.getText());

    }


}
使用

    /**
     * 生成随机验证码
     */
    @RequestMapping("randomVerifyCode.do")
    public ResponseBean randomVerifyCode() throws IOException {
        VerifyCode vc = new VerifyCode();
        BufferedImage bi = vc.getImage();
        //VerifyCode.output(bi,response.getOutputStream());
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ImageIO.write(bi, "png", out);
        byte[] bytes = out.toByteArray();

        String str = Base64.encode(bytes);
        str = "data:image/png;base64," + str;

        String uuid = IdUtil.simpleUUID();

        Map<String,String> resultMap = Maps.newHashMap();
        resultMap.put("base64", str);
        resultMap.put("uuid", uuid);

        //save redis
        String key = "RandomVerify:" + uuid;
        RedisUtil.set(key, vc.getText(), 180);

        return ResultUtil.success(resultMap);
    }
验证方法
 /**
     * 账号登录
     * @param session
     * @param phone
     * @param pwd
     * @param entryType
     * @return
     */
    @RequestMapping("accountLogin.do")
    public ResponseBean accountLogin(final HttpSession session, String phone, String pwd, String entryType,
                                     String uuid, String randomCerifyCode){

        //校验验证码
        MeenoAssert.hasLength(randomCerifyCode,"randomCerifyCode can not empty!");
        Object randomCerifyCodeObj = RedisUtil.get("RandomVerify:" + uuid);

        MeenoAssert.notNull(randomCerifyCodeObj, CErrEnum.RANDOM_VERIFY_CODE_FAILURE);
        MeenoAssert.isTrue(randomCerifyCode.toLowerCase().equals(randomCerifyCodeObj.toString().toLowerCase()), CErrEnum.RANDOM_VERIFY_CODE_ERR);


        LoginResult loginResult = this.employeeService.accountLogin(session, phone, pwd, entryType);
        EmpView employeeView = this.employeeService.getEmployee(loginResult.getUserInfo().getId());

        Map<String,Object> resultMap = Maps.newHashMap();
        resultMap.put("loginResult", loginResult);
        resultMap.put("employee", employeeView);

        return ResultUtil.success(resultMap);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值