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.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.util.Random;

public class RandomVerifyCode {

  private static final String RANDOM_NUM = "23456789";
  private static final String RANDOM_LETTER = "ABCDEFGHJKMNPQRSTUVWXYZ";
  private static final String RANDOM_LETTER_SMALL = "abcdefghjkmnpqrstuvwxyz";
  private static final String RANDOM_STRING = RANDOM_NUM + RANDOM_LETTER + RANDOM_LETTER_SMALL;

  private int width = 95;// 图片宽
  private int height = 25;// 图片高
  private int lineSize = 40;// 干扰线数量
  private int stringNum = 4;// 随机产生字符数量

  private Random random = new Random();

  /**
   * 获得字体
   */
  private Font getFont() {
    return new Font("Fixedsys", Font.CENTER_BASELINE, 18);
  }

  /**
   * 获得颜色
   */
  private Color getRandColor(int fc, int bc) {
    if (fc > 255)
      fc = 255;
    if (bc > 255)
      bc = 255;
    int r = fc + random.nextInt(bc - fc - 16);
    int g = fc + random.nextInt(bc - fc - 14);
    int b = fc + random.nextInt(bc - fc - 18);
    return new Color(r, g, b);
  }

  /**
   * 生成随机图片(BASE64格式)
   */
  public String getRandcode(HttpServletRequest request, StringBuffer imgBuffer) {
    // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
    Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
    g.fillRect(0, 0, width, height);//图片大小
    g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));//字体大小
    g.setColor(getRandColor(110, 133));//字体颜色
    // 绘制干扰线
    for (int i = 0; i <= lineSize; i++) {
      drowLine(g);
    }
    // 绘制随机字符
    String randomString = "";
    for (int i = 1; i <= stringNum; i++) {
      randomString = drowString(g, randomString, i);
    }
    g.dispose();
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    String encode = null;
    try {
      // 将内存中的图片通过流动形式输出到客户端
      ImageIO.write(image, "JPEG", out);
      encode = "data:image/jpeg;base64,"+Base64.encodeBase64String(out.toByteArray());
      out.close();
    } catch (Exception e) {
      LogHelper.error("登陆控制","验证码生成","将内存中生成的验证码图片输出为BASE64格式编码失败!");
    }
    imgBuffer.append(encode);
    return randomString;
  }

  /**
   * 绘制字符串
   */
  private String drowString(Graphics g, String randomString, int i) {
    g.setFont(getFont());
    g.setColor(new Color(random.nextInt(101), random.nextInt(111), random
        .nextInt(121)));
    String rand = String.valueOf(getRandomString(random.nextInt(RANDOM_STRING.length())));
    randomString += rand;
    g.translate(random.nextInt(3), random.nextInt(3));
    g.drawString(rand, 13 * i, 16);
    return randomString;
  }

  /**
   * 绘制干扰线
   */
  private void drowLine(Graphics g) {
    int x = random.nextInt(width);
    int y = random.nextInt(height);
    int xl = random.nextInt(13);
    int yl = random.nextInt(15);
    g.drawLine(x, y, x + xl, y + yl);
  }

  /**
   * 获取随机的字符
   */
  public String getRandomString(int num) {
    return String.valueOf(RANDOM_STRING.charAt(num));
  }

  public static String randomString(int length){
    return RandomStringUtils.random(length, RANDOM_STRING.toCharArray());
  }
}

示例二:

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

public class CodeUtil {

  private static int width = 90;// 定义图片的width 90
  private static int height = 20;// 定义图片的height 20
  private static int codeCount = 4;// 定义图片上显示验证码的个数
  private static int xx = 15;
  private static int fontHeight = 18;
  private static int codeY = 16;
  private static char[] codeSequence = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'M', 'N', 'P', 'Q', 'R',
      'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '2', '3', '4', '5', '6', '7', '8', '9'};

  public static Map<String,RenderedImage> codePicMap = new HashMap<>();

  /**
   * 生成一个map集合
   * code为生成的验证码
   * codePic为生成的验证码BufferedImage对象
   *
   * @return
   */
  public static Map<String, Object> generateCodeAndPic() {
    // 定义图像buffer
    BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    // Graphics2D gd = buffImg.createGraphics();
    // Graphics2D gd = (Graphics2D) buffImg.getGraphics();
    Graphics gd = buffImg.getGraphics();
    // 创建一个随机数生成器类
    Random random = new Random();
    // 将图像填充为蓝色
//    gd.setColor(Color.WHITE);
    gd.setColor(new Color(232,240,254));
    gd.fillRect(0, 0, width, height);

    // 创建字体,字体的大小应该根据图片的高度来定。
    Font font = new Font("Fixedsys", Font.BOLD, fontHeight);
    // 设置字体。
    gd.setFont(font);

    // 画边框。
    gd.setColor(Color.BLACK);
    gd.drawRect(0, 0, width - 1, height - 1);

    // 随机产生40条干扰线,使图象中的认证码不易被其它程序探测到。
    gd.setColor(Color.BLACK);
    for (int i = 0; i < 10; i++) {
      int x = random.nextInt(width);
      int y = random.nextInt(height);
      int xl = random.nextInt(12);
      int yl = random.nextInt(12);
      gd.drawLine(x, y, x + xl, y + yl);
    }

    // randomCode用于保存随机产生的验证码,以便用户登录后进行验证。
    StringBuffer randomCode = new StringBuffer();
    int red = 0, green = 0, blue = 0;

    // 随机产生codeCount数字的验证码。
    for (int i = 0; i < codeCount; i++) {
      // 得到随机产生的验证码数字。
      String code = String.valueOf(codeSequence[random.nextInt(31)]);
      // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。
      red = random.nextInt(255);
      green = random.nextInt(255);
      blue = random.nextInt(255);

      // 用随机产生的颜色将验证码绘制到图像中。
      gd.setColor(new Color(red, green, blue));
      gd.drawString(code, (i + 1) * xx, codeY);
      // 将产生的四个随机数组合在一起。
      randomCode.append(code);
    }
    Map<String, Object> map = new HashMap<>();
    //存放验证码
    map.put("code", randomCode);
    //存放生成的验证码BufferedImage对象
    map.put("codePic", buffImg);
    return map;
  }

  public static void main(String[] args) throws Exception {
    //创建文件输出流对象
    OutputStream out = new FileOutputStream("D://img/" + System.currentTimeMillis() + ".jpg");
    Map<String, Object> map = CodeUtil.generateCodeAndPic();
    ImageIO.write((RenderedImage) map.get("codePic"), "jpeg", out);
    System.out.println("验证码的值为:" + map.get("code"));
  }
}

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

(0)

相关推荐

  • Java随机生成手机短信验证码的方法

    本文实例讲述了Java随机生成手机短信验证码的方法.分享给大家供大家参考,具体如下: /** * 创建指定数量的随机字符串 * @param numberFlag 是否是数字 * @param length * @return */ public static String createRandom(boolean numberFlag, int length){ String retStr = ""; String strTable = numberFlag ? "1234

  • Java 随机生成验证码(支持大小写字母、数字、随机字体)的实例

    代码如下所示: 复制代码 代码如下: package com.hoo.util; import java.awt.Color;  import java.awt.Font;  import java.awt.Graphics;  import java.awt.image.BufferedImage;  import java.util.Random; import javax.imageio.ImageIO;  import javax.servlet.http.HttpServletRequ

  • Java Web开发之图形验证码的生成与使用方法

    本文实例讲述了Java Web开发之图形验证码的生成与使用方法.分享给大家供大家参考.具体如下: 图形验证码的主要目的是为了增强的安全性,增加用户通过遍历所有可能性来破解密码的难度. 图形验证码的使用包括如下3部分: ① 图形验证码的生成: ② 在页面中的使用: ③ 验证: 1.图形验证码的生成 假设在Servlet生成图形验证码,在JavaBean或者JSP中生成的基本过程是相同的.设计如下过程: ① 设置响应的文档类型: ② 生成随机码: ③ 把随机码保存到session中: ④ 生成图片:

  • Java实现滑动验证码的示例代码

    最近滑动验证码在很多网站逐步流行起来,一方面对用户体验来说,比较新颖,操作简单,另一方面相对图形验证码来说,安全性并没有很大的降低.当然到目前为止,没有绝对的安全验证,只是不断增加攻击者的绕过成本. 接下来分析下滑动验证码的核心流程: 后端随机生成抠图和带有抠图阴影的背景图片,后台保存随机抠图位置坐标 前端实现滑动交互,将抠图拼在抠图阴影之上,获取到用户滑动距离值,比如以下示例 前端将用户滑动距离值传入后端,后端校验误差是否在容许范围内. 这里单纯校验用户滑动距离是最基本的校验,出于更高的安全考

  • java实现短信验证码5分钟有效时间

    本文实例为大家分享了java实现短信验证码5分钟有效时间,供大家参考,具体内容如下 实现一个发送短信验证码的请求,要求5分钟之内重复请求,返回同一个验证码. 网上可找到几种方案: 如,存储数据库或缓存中.实现起来比较麻烦,舍弃: 另一种方式即本例,使用session存储.其他方式,暂未进一步了解. 实现步骤: (springmvc) 1.controller中,获取session对象,取code,取不到新生成,并存储session中: 2.单手机号发送量,判断并 +1 记入数据库: 3.Time

  • java登录验证码实现代码

    VerifyCodeServlet.java类: 复制代码 代码如下: package com.spring.controller;import java.awt.Color;         import java.awt.Font;         import java.awt.Graphics2D;         import java.awt.image.BufferedImage;         import java.util.Random;         import ja

  • java 图片验证码的实现代码

    复制代码 代码如下: makeCertPic.java package pic; 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; import javax.imagei

  • Java实现仿淘宝滑动验证码研究代码详解

    通过下面一张图看下要实现的功能,具体详情如下所示: 现在我就来介绍些软件的其它功能.希望大家有所受益. 模拟人为搜索商品 在刷单的时候,不能直接拿到一个商品网址就进入购买页面吧,得模拟人为搜索. 在这一个过程中有两个难点: 1)商品列表的异步加载 ; 2)翻页并且截图; 在园子里,我就不在关公面前耍大刀了. 直接上关键代码: i:搜索商品,并且翻页 public bool? SearchProduct(TaskDetailModel taskDetailData) { bool? result

  • JAVA实现利用第三方平台发送短信验证码

    前段时间自己做的一个小项目中,涉及到用短信验证码登录.注册的问题,之前没涉及过这一块,看了别人的博客其实也是似懂非懂的,现在就将自己做的利用第三方短信平台来发送验证码这个功能记下来. 本文以注册为例,在SpringMVC+Spring+Mybatis框架的基础上完成该短信验证码功能. 发送短信验证码的原理是:随机生成一个6位数字,将该6位数字保存到session当中,客户端通过sessionid判断对应的session,用户输入的验证码再与session记录的验证码进行比较. 为了防止有广告嫌疑

  • Java实现验证码具体代码

    这里实现我使用到了struts2模拟一个登录功能来验证java实现的验证码功能. Java实现验证码的步骤: 1.创建RandomImageGenerator.java类,该类实现验证码图片的生成 2.创建一个servlet类,RandomImageServlet.java,将生成的验证码输出到页面 3.创建一个Action类,LoginAction.java,控制登录 4.配置struts.xml一个web.xml文件 5.编写页面 具体实现用代码表达 1.创建RandomImageGener

随机推荐