首页 > 编程语言 > 详细

java实现随机字母数字验证码

时间:2020-09-22 18:20:29      阅读:81      评论:0      收藏:0      [点我收藏+]

生成随街验证码

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);
    }


java实现随机字母数字验证码

原文:https://www.cnblogs.com/GoslingWu/p/13713453.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!