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 = { 23, 24, 19, 20, 21 };
  private final static int[] yarr = { 20, 21, 22, 23, 24, 25, 16, 17, 18 };
  private final static int[] font_size = { 28, 29, 30, 21, 22, 23, 24, 27, 26, 25 };

  /**
   * 画随机码图
   * @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(240, 255));
    g.fillRect(0, 0, width, height);
    g.drawRect(1, 1, width - 2, height - 2);
    for (int i = 0; i < 10; i++) {
      g.setColor(randColor(150, 250));
      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(48, 254));
      g.drawString(rand, x + 8, y + 10);
      g.rotate(-Math.toRadians(degree), x, y);
    }
    // 图片中间线
    g.setColor(randColor(0, 200));
    // 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));
    }
  }
}

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

(0)

相关推荐

  • Java 生成任意长度的验证码过程解析

    需求说明 1.要求生成任意长度的验证码 2.验证码要求包含大小写英文字母和数字 实现方式 采用随机数的方式,分别在数字,大小写英文字母里面抽取字符,抽取次数由for循环控制 代码内容 随机的方法及程序入口 package com.work.work3; /** * @auther::9527 * @Description: 验证码生成器 * @program: shi_yong * @create: 2019-07-30 20:45 */ public class Method { //采用ch

  • Java中使用patchca生成超炫的验证码

    官网:http://code.google.com/p/patchca/ /** * 验证码 * * @param width 图片宽度 * @param height 图片高度 * @param number 验证码数量 */ @RequestMapping(value = {"/captcha"}) public void captcha(HttpServletRequest request, HttpServletResponse response, @RequestParam(

  • 简单验证码生成Java版

    验证码大家都知道,它的作用也不用我多说了吧.如果不太清楚请参见百度百科中的解释,一般验证码的生成就是随机产生字符(数字.字母或者汉字等),然后将这些生成的字符绘制成一张图片,再在图片上加上一些干扰元素,如各种线条之类的.好了废话不多说一起往下看: 简单的登录页面(代码并不完整,只有验证码部分) <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> &l

  • 浅析Java验证码生成库JCaptcha

    JCaptcha是非常强大的,不光是可以生成图片式的验证码,还可以生成声音式的(新浪就使用了双重验证码).本文简单的介绍了JCaptcha库以及使用实例,下面一起来看看. 下载JCaptcha库 maven依赖如此添加: <dependency> <groupId>com.octo.captcha</groupId> <artifactId>jcaptcha</artifactId> <version>1.0</version&

  • java随机验证码生成实现实例代码

    java随机验证码生成实现实例代码 摘要: 在项目中有很多情况下都需要使用到随机验证码,这里提供一个java的随机验证码生成方案,可以指定难度,生成的验证码可以很方便的和其他组件搭配 之前要使用一个生成随机验证码的功能,在网上找了一下,有很多的人提出了不同的解决方案,但是很多人都使用了com.sun.image.这个包或者子包里面的类,而这个包结构下面的类都是不推荐使用的,我们应该依赖于java.或者javax.这些包结构下面的类,否则将来的可移植性就很不好(比如换成IBM的JDK就不行了),但

  • 基于Java随机生成手机短信验证码的实例代码

    简单版 /** * 产生4位随机数(0000-9999) * * @return 4位随机数 */ public static String getFourRandom() { return StringUtils.leftPad(new Random().nextInt(10000) + "", 4, "0"); } 复杂版 /** * 创建指定数量的随机字符串 * @param numberFlag 是否是数字 * @param length * @return

  • java生成图片验证码示例代码

    本文实例为大家分享了java图片验证码具体实现代码,供大家参考,具体内容如下 import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.u

  • Java生成图形验证码工具类

    生成验证码效果 ValidateCode.java 验证码生成类 package cn.dsna.util.images; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.FileOutputStream; import java.io.IOException; import java.io.Ou

  • 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.BufferedIm

  • token工作机制及原理附Java生成token工具类

    什么是token Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码. 基于 Token 的身份验证使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录.流程是这样的:客户端使用用户名跟密码请求登录服务端收到请求,去验证用户名与密码验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端客户端收到 T

  • java联调生成测试数据工具类方式

    目录 java联调生成测试数据工具类 代码 java druid工具类及测试 总结 java联调生成测试数据工具类 在日常的联调中,我们经常需要准备一定数量的测试数据,用来配合前端测试. 当然对于简单的数据类型完全可以通过 JDK 自带的 Random 类来实现. 但是参数的格式有特殊要求的时候,临时处理比较麻烦,这个时候就需要借助一些现存的工具类生成测试数据. 代码 import java.math.BigDecimal; import java.text.ParseException; im

  • Java生成验证码

    Java 生成验证码的流程是: 收到请求->生成验证码所用的随机数->使用随机数写出图片->将随机数记录到Session中->输出验证码 Java 验证验证码的流程是: 收到请求->获取用户传过来的验证码数字->验证是否正确->输出验证结果 下面通过一个例子来展示验证码的生成流程,该例子使用基本Java Spring框架的Rest接口,可以使用任何平台来获取验证码: 服务器处理验证码的例子: 1.接收验证码请求: /** * 接收验证码请求 */ @Request

  • Java日期处理工具类DateUtils详解

    本文实例为大家分享了Java日期处理工具类DateUtils的具体代码,供大家参考,具体内容如下 import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * <日期时间处理工具类> */ public class DateUtils { /** * Dat

  • Java操作XML工具类XmlUtil详解

    本文实例为大家分享了Java操作XML工具类的具体代码,供大家参考,具体内容如下 一.代码 public class XmlUtil { /** * 将XML文件输出到指定的路径 * * @param doc * @param fileName * @throws Exception */ public static void outputXml(Document doc, String fileName) throws Exception { TransformerFactory tf = T

  • java RSAUtils 加密工具类操作

    1.RSA加密算法是一种非对称加密算法.在公开密钥加密和电子商业中RSA被广泛使用.RSA公开密钥密码体制.所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种"由已知加密密钥推导出解密密钥在计算上是不可行的"密码体制.在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的.加密算法E和解密算法D也都是公开的.虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK. 2.本工具类涉及到BASE64编码,所以先展示出BA

  • java生成验证码图片的方法

    本文实例为大家分享了java生成验证码图片的具体代码,供大家参考,具体内容如下 示例一: import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang.RandomStringUtils; import org.apache.commons.lang.StringUtils; import javax.imageio.ImageIO; import javax.servlet.http.HttpServ

  • Java应用EasyExcel工具类

    一.前言 关于EasyExcel,它对poi做了进一步的封装,使得整个编写流程更加的面向对象.好处嘛,我认为流程上更加清晰即易懂.可读性更好,坏处的话,则是操作上没有原生的方式那么灵活. 二.导入 StudentVo为实体类, 注意实体中的各个属性要和excel按顺序一 一对应,建议都用String类型,真正插入时,才去做转换 ImportExcelListener 类为真正处理数据的类 CommonService 只是一个Spring的service bean,用来执行curd操作 priva

随机推荐