温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java如何生成验证码工具类

发布时间:2021-06-17 12:34:27 阅读:222 作者:小新 栏目:编程语言
Java开发者专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

这篇文章主要介绍了java如何生成验证码工具类,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

java生成验证码工具类,供大家参考,具体内容如下

package com.demo.utils;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.QuadCurve2D;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

import javax.imageio.ImageIO;

/**
 * 生成验证码
 * @author dongyangyang
 * @Date 2017/3/13 12:31
 * @Version 1.0
 *
 */
public class AuthCodeUtils {
  private final static Random random = new Random();
  // 随机字体样式
  private final static int[] fontStyle = { Font.HANGING_BASELINE, Font.ITALIC, Font.LAYOUT_LEFT_TO_RIGHT, Font.LAYOUT_NO_LIMIT_CONTEXT, Font.LAYOUT_NO_START_CONTEXT,
      Font.LAYOUT_RIGHT_TO_LEFT, Font.CENTER_BASELINE, Font.PLAIN, Font.ROMAN_BASELINE, Font.TRUETYPE_FONT, Font.TYPE1_FONT, Font.BOLD };

  private final static String[] font = { "Ravie""Forte""Arial""Courier" };

  private final static int[] xarr = { 2324192021 };
  private final static int[] yarr = { 202122232425161718 };
  private final static int[] font_size = { 28293021222324272625 };

  /**
   * 画随机码图
   * @param out
   * @param width
   * @param height
   * @throws IOException
   */
  public static void draw(OutputStream out, String value) throws IOException {
    int width = 100, height = 40;
    BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    Graphics2D g = (Graphics2D) bi.getGraphics();
    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g.setColor(randColor(240255));
    g.fillRect(00, width, height);
    g.drawRect(11, width - 2, height - 2);
    for (int i = 0; i < 10; i++) {
      g.setColor(randColor(150250));
      g.drawOval(random.nextInt(110), random.nextInt(24), 5 + random.nextInt(10), 5 + random.nextInt(10));
    }
    g.setFont(getFont());
    g.setColor(randColor(xarr[(int) (Math.random() * 5)], 254));
    for (int i = 0, len = value.length(); i < len; i++) {
      String rand = String.valueOf(value.charAt(i));
      int degree = random.nextInt(23);
      if (i % 2 == 0) {
        degree = degree * (-1);
      }
      int x = xarr[(int) (Math.random() * 5)] * i, y = yarr[(int) (Math.random() * 8)];
      g.rotate(Math.toRadians(degree), x, y);
      g.setColor(randColor(48254));
      g.drawString(rand, x + 8, y + 10);
      g.rotate(-Math.toRadians(degree), x, y);
    }
    // 图片中间线
    g.setColor(randColor(0200));
    // width是线宽,float型
    BasicStroke bs = new BasicStroke(2);
    g.setStroke(bs);
    // 画出曲线
    QuadCurve2D.Double curve = new QuadCurve2D.Double(0d, random.nextInt(height - 8) + 4, width / 2, height / 2, width, random.nextInt(height - 8) + 4);
    g.draw(curve);
    // 销毁图像
    g.dispose();
    ImageIO.write(bi, "png", out);
  }

  private static Font getFont() {
    return new Font(font[(int) (Math.random() * 4)], fontStyle[(int) (Math.random() * 12)], font_size[(int) (Math.random() * 10)]);
  }

  private static Color randColor(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 char[] c = { 'a''b''c''d''e''f''g''h''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''1''3''5''6''7''8''9' };

  public static String getRandom(int size) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < size; i++) {
      sb.append(c[Math.abs(random.nextInt()) % c.length]);
    }
    return sb.toString();
  }

  public static void main(String[] args) throws IOException {
    for (int i = 1; i < 10; i++) {
      FileOutputStream out = new FileOutputStream("D:\\bb"+ i +".png");
      draw(out, getRandom(4));
    }
  }
}

感谢你能够认真阅读完这篇文章,希望小编分享的“java如何生成验证码工具类”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI

开发者交流群×