热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

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

这篇文章主要介绍了java生成图片验证码的示例代码,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下

给大家分享一款java生成验证码的源码,可设置随机字符串,去掉了几个容易混淆的字符,还可以设置验证码位数,比如4位,6位。当然也可以根据前台验证码的位置大小,设置验证码图片的大小。下边是源码分享,直接看吧,很简单!

创建servlet类

import java.io.IOException;
 
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
import com.sunjs.utils.CaptchaUtils;
 
public class AuthImage extends HttpServlet implements Servlet {
  static final long serialVersiOnUID= 1L;
 
  public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setHeader("Pragma", "No-cache");
    response.setHeader("Cache-Control", "no-cache");
    response.setDateHeader("Expires", 0);
    response.setContentType("image/jpeg");
     
    //生成随机字串
    String captcha = CaptchaUtils.generateCaptcha(4);
    //存入会话session
    HttpSession session = request.getSession(true);
    session.setAttribute("rand", captcha.toLowerCase());
    //生成图片
    int w = 200, h = 80;
    CaptchaUtils.outputImage(w, h, response.getOutputStream(), captcha);
 
  }
}

创建工具类

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Random;
 
import javax.imageio.ImageIO;
 
/**
 * 验证码
 * 
 * @author sun
 * @date 2016年8月23日 上午10:12:10
 */
public class CaptchaUtils {
 
  // 使用到Algerian字体,系统里没有的话需要安装字体,字体只显示大写,去掉了1,0,i,L, o几个容易混淆的字符
  public static final String CAPTCHA_CHARS = "23456789ABCDEFGHJKMNPQRSTUVWXYZ";
  private static Random random = new Random();
 
  /**
   * 使用系统默认字符源生成验证码
   * 
   * @param captchaSize
   *      验证码长度
   * @return
   */
  public static String generateCaptcha(int captchaSize) {
    return generateCaptcha(captchaSize, CAPTCHA_CHARS);
  }
 
  /**
   * 使用指定源生成验证码
   * 
   * @param captchaSize
   *      验证码长度
   * @param sources
   *      验证码字符源
   * @return
   */
  public static String generateCaptcha(int captchaSize, String sources) {
    if (sources == null || sources.length() == 0) {
      sources = CAPTCHA_CHARS;
    }
    int codesLen = sources.length();
    Random rand = new Random(DateUtils.getCurrentTimeMillis());
    StringBuilder captcha = new StringBuilder(captchaSize);
    for (int i = 0; i  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 int getRandomIntColor() {
    int[] rgb = getRandomRgb();
    int color = 0;
    for (int c : rgb) {
      color = color <<8;
      color = color | c;
    }
    return color;
  }
 
  private static int[] getRandomRgb() {
    int[] rgb = new int[3];
    for (int i = 0; i <3; i++) {
      rgb[i] = random.nextInt(255);
    }
    return rgb;
  }
 
  private static void shear(Graphics g, int w1, int h1, Color color) {
    shearX(g, w1, h1, color);
    shearY(g, w1, h1, color);
  }
 
  private static void shearX(Graphics g, int w1, int h1, Color color) {
 
    int period = random.nextInt(2);
 
    boolean borderGap = true;
    int frames = 1;
    int phase = random.nextInt(2);
 
    for (int i = 0; i > 1)
          * Math.sin((double) i / (double) period
              + (6.2831853071795862D * (double) phase)
              / (double) frames);
      g.copyArea(0, i, w1, 1, (int) d, 0);
      if (borderGap) {
        g.setColor(color);
        g.drawLine((int) d, i, 0, i);
        g.drawLine((int) d + w1, i, w1, i);
      }
    }
 
  }
 
  private static void shearY(Graphics g, int w1, int h1, Color color) {
 
    int period = random.nextInt(40) + 10; // 50;
 
    boolean borderGap = true;
    int frames = 20;
    int phase = 7;
    for (int i = 0; i > 1)
          * Math.sin((double) i / (double) period
              + (6.2831853071795862D * (double) phase)
              / (double) frames);
      g.copyArea(i, 0, 1, h1, 0, (int) d);
      if (borderGap) {
        g.setColor(color);
        g.drawLine(i, (int) d, i, 0);
        g.drawLine(i, (int) d + h1, i, h1);
      }
 
    }
 
  }
 
  public static void main(String[] args) throws IOException {
//    File dir = new File("D:/verifies");
    File dir = new File("/Users/sun/Documents/captcha");
    int w = 200, h = 80;
    for (int i = 0; i <50; i++) {
      String captcha = generateCaptcha(4);
      File file = new File(dir, captcha + ".jpg");
      outputImage(w, h, file, captcha);
    }
  }
}

配置 web.xml



  AuthImage
  com.sunjs.controller.AuthImage


  AuthImage
  /authImage

当然也可以增加session的过期时间,不写的话,会有默认的失效时间


  30

配置完成,直接启动项目访问,访问路径你们懂!!!

以上就是java生成图片验证码的示例代码的详细内容,更多关于java生成图片验证码的资料请关注其它相关文章!


推荐阅读
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 本文探讨了在通过 API 端点调用时,使用猫鼬(Mongoose)的 findOne 方法总是返回 null 的问题,并提供了详细的解决方案和建议。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 本文介绍如何在 Unity 的 XML 配置文件中,将参数传递给自定义生命周期管理器的构造函数。我们将详细探讨 CustomLifetimeManager 类的实现及其配置方法。 ... [详细]
  • 本文详细介绍了 Java 中 org.apache.xmlbeans.SchemaType 类的 getBaseEnumType() 方法,提供了多个代码示例,并解释了其在不同场景下的使用方法。 ... [详细]
  • 本文详细介绍了如何解决MyBatis中常见的BindingException错误,提供了多种排查和修复方法,确保Mapper接口与XML文件的正确配置。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本文介绍如何使用布局文件在Android应用中排列多行TextView和Button,使其占据屏幕的特定比例,并提供示例代码以帮助理解和实现。 ... [详细]
author-avatar
黄敬定241
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有