工具类validateCode

package com.jd.jr.faecms.common.validateCode;  import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Date;
import java.util.Random;  /** * 验证码生成器 * * @author  */
public class ValidateCode {  // 图片的宽度。  private int width = 160;  // 图片的高度。  private int height = 40;  // 验证码字符个数  private int codeCount = 5;  // 验证码干扰线数  private int lineCount = 150;  // 验证码  private String code = null;  // 验证码图片Buffer  private BufferedImage buffImg = null;  // 验证码范围,去掉0(数字)和O(拼音)容易混淆的(小写的1和L也可以去掉,大写不用了)  private char[] codeSequence = {'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', '1', '2', '3', '4', '5', '6', '7', '8', '9'};  /** * 默认构造函数,设置默认参数 */  public ValidateCode() {  this.createCode();  }  /** * @param width  图片宽 * @param height 图片高 */  public ValidateCode(int width, int height) {  this.width = width;  this.height = height;  this.createCode();  }  /** * @param width     图片宽 * @param height    图片高 * @param codeCount 字符个数 * @param lineCount 干扰线条数 */  public ValidateCode(int width, int height, int codeCount, int lineCount) {  this.width = width;  this.height = height;  this.codeCount = codeCount;  this.lineCount = lineCount;  this.createCode();  }  public void createCode() {  int x = 0, fontHeight = 0, codeY = 0;  int red = 0, green = 0, blue = 0;  x = width / (codeCount + 2);//每个字符的宽度(左右各空出一个字符)  fontHeight = height - 2;//字体的高度  codeY = height - 4;  // 图像buffer  buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);  Graphics2D g = buffImg.createGraphics();  // 生成随机数  Random random = new Random();  // 将图像填充为白色  g.setColor(Color.WHITE);  g.fillRect(0, 0, width, height);  // 创建字体,可以修改为其它的  Font font = new Font("Fixedsys", Font.PLAIN, fontHeight);
//        Font font = new Font("Times New Roman", Font.ROMAN_BASELINE, fontHeight);  g.setFont(font);  for (int i = 0; i < lineCount; i++) {  // 设置随机开始和结束坐标  int xs = random.nextInt(width);//x坐标开始  int ys = random.nextInt(height);//y坐标开始  int xe = xs + random.nextInt(width / 8);//x坐标结束  int ye = ys + random.nextInt(height / 8);//y坐标结束  // 产生随机的颜色值,让输出的每个干扰线的颜色值都将不同。  red = random.nextInt(255);  green = random.nextInt(255);  blue = random.nextInt(255);  g.setColor(new Color(red, green, blue));  g.drawLine(xs, ys, xe, ye);  }  // randomCode记录随机产生的验证码  StringBuffer randomCode = new StringBuffer();  // 随机产生codeCount个字符的验证码。  for (int i = 0; i < codeCount; i++) {  String strRand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);  // 产生随机的颜色值,让输出的每个字符的颜色值都将不同。  red = random.nextInt(255);  green = random.nextInt(255);  blue = random.nextInt(255);  g.setColor(new Color(red, green, blue));  g.drawString(strRand, (i + 1) * x, codeY);  // 将产生的四个随机数组合在一起。  randomCode.append(strRand);  }  // 将四位数字的验证码保存到Session中。  code = randomCode.toString();  }  public void write(String path) throws IOException {  OutputStream sos = new FileOutputStream(path);  this.write(sos);  }  public void write(OutputStream sos) throws IOException {  ImageIO.write(buffImg, "png", sos);  sos.close();  }  public BufferedImage getBuffImg() {  return buffImg;  }  public String getCode() {  return code;  }  /** * 测试函数,默认生成到d盘 * @param args */  public static void main(String[] args) {  ValidateCode vCode = new ValidateCode(160,40,5,150);  try {  String path="D:/"+new Date().getTime()+".png";  System.out.println(vCode.getCode()+" >"+path);  vCode.write(path);  } catch (IOException e) {  e.printStackTrace();  }  }
}  

頁面調用

<div class="form-group  col-lg-6">  <label for="id" class="col-sm-4 control-label">  验证码:  </label>  <div class="col-sm-8">  <input type="text" id="code" name="code" class="form-control" style="width:250px;"/>  <img id="imgObj" alt="验证码" src="/article/validateCode" onclick="changeImg()"/>  <a href="#" onclick="changeImg()">换一张</a>  </div>
</div>  <script type="text/javascript">  // 刷新图片  function changeImg() {  var imgSrc = $("#imgObj");  var src = imgSrc.attr("src");  imgSrc.attr("src", changeUrl(src));  }  //为了使每次生成图片不一致,即不让浏览器读缓存,所以需要加上时间戳  function changeUrl(url) {  var timestamp = (new Date()).valueOf();  var index = url.indexOf("?",url);  if (index > 0) {  url = url.substring(index, url.indexOf(url, "?"));  }  if ((url.indexOf("&") >= 0)) {  url = url + "×tamp=" + timestamp;  } else {  url = url + "?timestamp=" + timestamp;  }  return url;  }
</script> 

controller层输出验证

/** * 响应验证码页面 * @return */
@RequestMapping(value="/validateCode")
public String validateCode(HttpServletRequest request,HttpServletResponse response) throws Exception{  // 设置响应的类型格式为图片格式  response.setContentType("image/jpeg");  //禁止图像缓存。  response.setHeader("Pragma", "no-cache");  response.setHeader("Cache-Control", "no-cache");  response.setDateHeader("Expires", 0);  HttpSession session = request.getSession();  ValidateCode vCode = new ValidateCode(120,40,5,100);  session.setAttribute("code", vCode.getCode());  vCode.write(response.getOutputStream());  return null;
} 

下面是controller层验证验证码输入是否正确

String code = request.getParameter("code");
HttpSession session = request.getSession();
String sessionCode = (String) session.getAttribute("code");
if (!StringUtils.equalsIgnoreCase(code, sessionCode)) {  //忽略验证码大小写  throw new RuntimeException("验证码对应不上code=" + code + "  sessionCode=" + sessionCode);
}  

好用的java图形验证码相关推荐

  1. java图形验证码生成工具类

    转载自   java图形验证码生成工具类 生成验证码效果       ValidateCode.java 验证码生成类 package cn.dsna.util.images; import java ...

  2. Java 图形验证码

    EasyCaptcha 1.简介  Java图形验证码,支持gif.中文.算术等类型,可用于Java Web.JavaSE等项目. 2.效果展示             算术类型:       中文类 ...

  3. 真香!推荐一个超级简单 Java 图形验证码模块

    简介 Java图形验证码,支持Gif.中文.算术等类型,可用于Java Web.JavaSE等项目. 效果展示 集成项目 maven方式引入: <dependencies><depe ...

  4. java图形验证码_java图形验证码实现

    今天来学习下图形验证码的生成,首先依赖开源组件: com.github.penggle kaptcha 2.3.2 在web.xml中配置名为Kaptcha的servlet: Kaptcha com. ...

  5. java图形验证码去除干扰,使用python 对验证码图片进行降噪处理

    首先贴一张验证码上来做案例: 第一步先通过二值化处理把干扰线去掉: from PIL import Image # 二值化处理 def two_value(): for i in range(1,5) ...

  6. java图形验证码识别-阿里云OCR(精准率50%)

    1. 通用文字识别 请求参数详情https://market.aliyun.com/products/57124001/cmapi028554.html?spm=5176.2020520132.101 ...

  7. java 图形校验_java图形验证码生成工具类 web页面校验验证码

    java图形验证码生成工具类 web页面校验验证码 发布于 2020-7-14| 复制链接 摘记: 最近做验证码,参考网上案例,发现有不少问题,特意进行了修改和完善.验证码生成器: ```java i ...

  8. easycaptcha图形验证码

    参考地址:https://gitee.com/ele-admin/EasyCaptcha Java图形验证码,支持gif.中文.算术等类型,可用于Java Web.JavaSE等项目. 效果展示 验证 ...

  9. java生成验证码工具类_Java生成图形验证码工具类

    生成验证码效果 validatecode.java 验证码生成类 package cn.dsna.util.images; import java.awt.color; import java.awt ...

最新文章

  1. 记录一下LabelImg实际绘制框颜色的位置
  2. Android自定义控件(特效一) 点击屏幕,根据所点击的位置绘制圆环
  3. GIAC | 大数据分析系统在游戏领域的迭代与实践
  4. SAP Spartacus delivery mode continue button enable与否的逻辑
  5. linux 判断上一条命令是否指令成功
  6. Android ScrollView用法实例汇总
  7. 从武则天的故事看职场生涯规划的一个最重要方面
  8. NAND和NOR Flash的区别
  9. 【高频内存与主板内存频率和CPU内存频率之间的关系】
  10. Winows笔记本设置合上盖子不休眠
  11. 超写实虚拟人制作教程
  12. vi编辑器基础命令合集与yim初级使用
  13. java 消除png 锯齿_反转(移除)抗锯齿滤波器
  14. 搭建高可用oVirt(hosted engine)
  15. 迷宫寻宝(一) 82
  16. SIGIR论文写作技巧
  17. XYOJ1259: 找零钱(除法 余数)
  18. 子域名挖掘,子域名爆破,Python脚本编写(Python安全攻防)。
  19. 攻防须知——浅析Windows防火墙的缺陷
  20. FusionChart 水印破解方法(代码版)

热门文章

  1. EDA三大头的恩怨细节
  2. 音视频编码格式与封装格式
  3. 值得学习的C++开源项目(转)
  4. 榆林的经纪人偷偷告诉你windowsphone8应用
  5. K8S(2)RC、RS和Deployment
  6. iPhone手机被停用怎么办?
  7. python首字母不能是_Python实现将不规范的英文名字首字母大写
  8. 小程序学习之路(持续更新)
  9. MySQL - order by 出现 using filesort根因分析及优化
  10. wps中VBA宏与js宏的区别