记录下自己的验证码小工具,留待以后复用。

字符库代码

public class SecurityCode {public enum SecurityCodeLevel {Simple, Medium, Hard};public static String getSecurityCode() {return getSecurityCode(4, SecurityCodeLevel.Medium, false);}public static String getSecurityCode(int length, SecurityCodeLevel level,boolean isCanRepeat) {// 随机抽取len个字符int len = length;// 字符集合(除去易混淆的数字0、数字1、字母l、字母o、字母O)char[] codes = { '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b','c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'm', 'n', 'p','q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B','C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N','P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };// 根据不同的难度截取字符数组if (level == SecurityCodeLevel.Simple) {codes = Arrays.copyOfRange(codes, 0, 9);} else if (level == SecurityCodeLevel.Medium) {codes = Arrays.copyOfRange(codes, 0, 33);}// 字符集合长度int n = codes.length;// 抛出运行时异常if (len > n && isCanRepeat == false) {throw new RuntimeException(String.format("验证码长度大于字符库长度,请改小验证码位数参数 length",len, level, isCanRepeat, n));}// 存放抽取出来的字符char[] result = new char[len];// 判断能否出现重复的字符if (isCanRepeat) {for (int i = 0; i < result.length; i++) {// 索引 0 and n-1int r = (int) (Math.random() * n);// 将result中的第i个元素设置为codes[r]存放的数值result[i] = codes[r];}} else {for (int i = 0; i < result.length; i++) {// 索引 0 and n-1int r = (int) (Math.random() * n);// 将result中的第i个元素设置为codes[r]存放的数值result[i] = codes[r];// 必须确保不会再次抽取到那个字符,因为所有抽取的字符必须不相同。// 因此,这里用数组中的最后一个字符改写codes[r],并将n减1codes[r] = codes[n - 1];n--;}}return String.valueOf(result);}
}

画图片代码

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Random;
import com.sun.image.codec.jpeg.ImageFormatException;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;public class SecurityImage {public static BufferedImage createImage(String securityCode) {// 验证码长度int codeLength = securityCode.length();// 字体大小int fSize = 15;int fWidth = fSize + 1;// 图片宽度int width = codeLength * fWidth + 6;// 图片高度int height = fSize * 2 + 1;// 图片BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);Graphics g = image.createGraphics();// 设置背景色
        g.setColor(Color.WHITE);// 填充背景g.fillRect(0, 0, width, height);// 设置边框颜色
        g.setColor(Color.LIGHT_GRAY);// 边框字体样式g.setFont(new Font("Arial", Font.BOLD, height - 2));// 绘制边框g.drawRect(0, 0, width - 1, height - 1);// 绘制噪点Random rand = new Random();for (int i = 0; i < codeLength * 6; i++) {int xs = rand.nextInt(width);int ys = rand.nextInt(height);// 绘制1*1大小的矩形
            randColor(g, rand);g.drawRect(xs, ys, 1, 1);}// 干扰线for (int i = 0; i < 10; i++) {int xs = rand.nextInt(width);int ys = rand.nextInt(height);int xe = xs + 10;int ye = ys + 10;randColor(g, rand);g.drawLine(xs, ys, xe, ye);}// 绘制验证码int codeY = height - 10;// 设置字体颜色和样式g.setFont(new Font("Georgia", Font.BOLD, fSize));for (int i = 0; i < codeLength; i++) {randColor(g, rand);g.drawString(String.valueOf(securityCode.charAt(i)), i * 16 + 5,codeY);}// 关闭资源
        g.dispose();return image;}/*** 随机色* * @param g* @param rand*/private static void randColor(Graphics g, Random rand) {int red = 0, green = 0, blue = 0;red = rand.nextInt(255);green = rand.nextInt(255);blue = rand.nextInt(255);g.setColor(new Color(red, green, blue));}public static ByteArrayInputStream getImageAsInputStream(String securityCode) {BufferedImage image = createImage(securityCode);return convertImageToStream(image);}private static ByteArrayInputStream convertImageToStream(BufferedImage image) {ByteArrayInputStream inputStream = null;ByteArrayOutputStream bos = new ByteArrayOutputStream();JPEGImageEncoder jpeg = JPEGCodec.createJPEGEncoder(bos);try {jpeg.encode(image);byte[] bts = bos.toByteArray();inputStream = new ByteArrayInputStream(bts);} catch (ImageFormatException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return inputStream;}
}

转载于:https://www.cnblogs.com/Think-007/p/7510025.html

springmvc java的验证码的小程序相关推荐

  1. java springboot 体育场馆预约小程序源码

            博主介绍:✌在职Java研发工程师.专注于程序设计.源码分享.技术交流.专注于Java技术领域和毕业设计✌ 项目名称 java springboot 体育场馆预约小程序源码 演示视频 ...

  2. 计算机毕业设计Java学习自律养成小程序后台(源码+系统+mysql数据库+lw文档)

    计算机毕业设计Java学习自律养成小程序后台(源码+系统+mysql数据库+lw文档) 计算机毕业设计Java学习自律养成小程序后台(源码+系统+mysql数据库+lw文档) 本源码技术栈: 项目架构 ...

  3. 计算器小程序java课程设计,java课程设计----计算器小程序报告.doc

    java课程设计----计算器小程序报告.doc #####学院JAVA语言课程设计报告小程序计算器系统管理班级:#######姓名:#####指导老师:###时间:2012年6月25日至6月29日2 ...

  4. 3种设计模式的java小程序,java实现的设计模式小程序 模拟Web系统

    [实例简介] java实现的设计模式小程序,应用了策略模式,单例模式,工厂模式,抽象工厂模式,责任链模式.模拟的是Web系统针对不同用户提供不同的功能,可以在此基础上添加自己的代码. [实例截图] [ ...

  5. java语言开发微信小程序(一)

    出于兴趣,自己用java搞了一次小程序,现在记录下来,就权当笔记吧.当然也希望能给看到这篇文章的同志一些帮助.这篇文章分两部分,这部分先介绍小程序开发的一些基础知识,包括需要做的准备.按照习惯,先贴一 ...

  6. 用JAVA写一个画图小程序(JAVA 大作业)

    第一次写博客 且是稍微大点的程序 看看就行 重新写的在这,更加清晰明了:点击进入:用JAVA写一个画图小程序(JAVA 大作业)重排版本 设计思路 首先我直接去了Windows自带画图程序去实践模拟, ...

  7. Java多功能计算器小程序

    Java多功能计算器小程序(附界面) 早期写的计算器,现在看来还是挺粗糙的,各个控件应该用数组来初始化和排版,懒得改凑合看吧.功能挺全的,求根加减乘除百分制删除清空,和实体简易计算器几乎一致 pack ...

  8. Java社交商城APP+小程序多功能B2B2C商城源码

    Java社交商城APP+小程序多功能B2B2C商城源码 功能介绍 1)用户可通过邀请好友.签到赚取糖果: 2)用户可以通过平台获取想要的商品,领券购买并获取分佣提成: 3) 用户可以通过淘宝链接搜索商 ...

  9. java springboot分销商城小程序源码

    java分销商城微信小程序 后台采用springboot + mybatis 前后分离 resetful接口 前台bootstrap + vue.js 适合二次开发 主要功能 首先,登陆小程序后台,在 ...

最新文章

  1. Java字符串的子串
  2. python获取当前年份_Python根据当前日期取去年同星期日期
  3. 理解Event的冒泡模型
  4. keras时间序列数据预测_使用Keras的时间序列数据中的异常检测
  5. 转-Kafka【第一篇】Kafka集群搭建
  6. happens-before规则和as-if-serial语义
  7. zygoteinit.java_源码跟踪之启动流程:从ZygoteInit到onCreate
  8. 在Android Studio中使用Method trace,查看某进程的所有线程trace的方法
  9. 3.SRE:Google运维解密 --- 拥抱风险
  10. chrome 开发工具插件总结
  11. 大学计算机应用与基础第二版答案,大学计算机应用基础(第2版)上机指导与习题集...
  12. 独奏骑士服务器维护,独奏骑士新手天赋怎么选?新手天赋选择攻略
  13. 国产操作系统环境搭建(内含镜像资源)
  14. con和com开头单词
  15. Visual Studio 2015/2017/2019 设置透明主题、个性背景(含异常解决方法)
  16. 记录自己学习尚硅谷javaweb2022版中遇到的一些问题
  17. 大数据下的密码学技术挑战
  18. lai kan kan
  19. MVC 音乐商店 第 4 部分: 模型和数据访问
  20. MAC地址存在的意义

热门文章

  1. 利用IKVM在C#中调Java程序
  2. Logistic regression Newton’s method
  3. C#面向对象名词比较
  4. Trying to embed a platform view but the PrerollContext does not support embedding
  5. Hiernate概述
  6. Consider defining a bean named 'entityManagerFactory' in your configuration解决办法
  7. [Coding Style] CSS coding style
  8. 面向对象的三个基本特征(讲解)-转载
  9. [HTTP] Cookie
  10. 前端基础牢记的一些操作-Github仓库管理