java实现图片验证码
一、验证码生成类
package hbi.tech.utils;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random; /**
* 验证码生成器
*
*/
public class SCaptcha {
// 图片的宽度。
private int width = 120;
// 图片的高度。
private int height = 40;
// 验证码字符个数
private int codeCount = 4;
// 验证码干扰线数
private int lineCount = 50;
// 验证码
private String code = null;
// 验证码图片Buffer
private BufferedImage buffImg = null; private char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'M', 'N', 'P', 'Q', 'R',
'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '2', '3', '4', '5', '6', '7', '8', '9' };
// 生成随机数
private Random random = new Random(); public SCaptcha() {
this.createCode();
} /**
*
* @param width 图片宽
* @param height 图片高
*/
public SCaptcha(int width, int height) {
this.width = width;
this.height = height;
this.createCode();
} /**
*
* @param width 图片宽
* @param height 图片高
* @param codeCount 字符个数
* @param lineCount 干扰线条数
*/
public SCaptcha(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 codeX = 0;
int fontHeight = 0;
fontHeight = height - 5;// 字体的高度
codeX = width / (codeCount + 3);// 每个字符的宽度 // 图像buffer
buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = buffImg.createGraphics(); // 将图像填充为白色
g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height); // 创建字体
ImgFontByte imgFont = new ImgFontByte();
Font font = imgFont.getFont(fontHeight);
g.setFont(font); StringBuffer randomCode = new StringBuffer();
// 随机产生验证码字符
for (int i = 0; i < codeCount; i++) {
String strRand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);
// 设置字体颜色
g.setColor(getRandomColor());
// 设置字体位置
g.drawString(strRand, (i + 1) * codeX, getRandomNumber(height / 2) + 25);
randomCode.append(strRand);
}
code = randomCode.toString();
} /** 获取随机颜色 */
private Color getRandomColor() {
int r = getRandomNumber(255);
int g = getRandomNumber(255);
int b = getRandomNumber(255);
return new Color(r, g, b);
} /** 获取随机数 */
private int getRandomNumber(int number) {
return random.nextInt(number);
} 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;
} /** 字体样式类 */
class ImgFontByte {
public Font getFont(int fontHeight) {
try {
Font baseFont = Font.createFont(Font.HANGING_BASELINE, new ByteArrayInputStream(
hex2byte(getFontByteStr())));
return baseFont.deriveFont(Font.PLAIN, fontHeight);
} catch (Exception e) {
return new Font("Arial", Font.PLAIN, fontHeight);
}
} private byte[] hex2byte(String str) {
if (str == null)
return null;
str = str.trim();
int len = str.length();
if (len == 0 || len % 2 == 1)
return null; byte[] b = new byte[len / 2];
try {
for (int i = 0; i < str.length(); i += 2) {
b[i / 2] = (byte) Integer.decode("0x" + str.substring(i, i + 2)).intValue();
}
return b;
} catch (Exception e) {
return null;
}
} // 字体文件的十六进制字符串
private String getFontByteStr() {
//防止报字符串长度过长错误,改为从配置文件读取
return ReadFontByteProperties.getFontByteStr();
}
}
}
二、读取字体文件类
package hbi.tech.utils;
import java.io.InputStream;
import java.util.Properties;
public class ReadFontByteProperties {
static private String fontByteStr = null;
static {
loads();
}
synchronized static public void loads() {
if (fontByteStr == null) {
InputStream is = ReadFontByteProperties.class.getResourceAsStream("/fontByte.properties");
Properties dbproperties = new Properties();
try {
dbproperties.load(is);
fontByteStr = dbproperties.getProperty("fontByteStr").toString();
} catch (Exception e) {
//System.err.println("不能读取属性文件. " + "请确保fontByte.properties在CLASSPATH指定的路径中");
}
}
}
public static String getFontByteStr() {
if (fontByteStr == null)
loads();
return fontByteStr;
}
}
三、生成验证码接口
/**
* @author jiaqing.xu@hand-china.com
* @date 2017/8/23
* @description 生成图片验证码
*/
@RequestMapping(value = "/userInfo/verification", method = {RequestMethod.POST, RequestMethod.GET})
@ResponseBody
public void verification(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
// 设置响应的类型格式为图片格式
response.setContentType("image/jpeg");
// 禁止图像缓存。
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
//实例生成验证码对象
SCaptcha instance = new SCaptcha();
//将验证码存入session
session.setAttribute("verification", instance.getCode());
//向页面输出验证码图片
instance.write(response.getOutputStream());
}
将生成的验证码图片存在session中,当用户登录时即可和用户输入的验证码的值进行判断,如果验证相同,则进行后续操作。

java实现图片验证码的更多相关文章
- 用Java实现图片验证码功能
一.什么是图片验证码? 可以参考下面这张图: 我们在一些网站注册的时候,经常需要填写以上图片的信息. 1.图片生成实体类: package com.hexianwei.graphic; import ...
- [Java] 识别图片验证码
现在大多数网站都采用了验证码来防止暴力破解或恶意提交.但验证码真的就很安全吗?真的就不能被机器识别?? 我先讲讲我是怎么实现站外提交留言到一个网站的程序. 这个网站的留言版大致如下: 我一看这种简单的 ...
- Java 生产图片验证码
import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Graphics2D;impor ...
- 自己封装的一个java图片验证码
验证码生成器: package com.lz.Tools; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; ...
- java分别通过httpclient和HttpURLConnection获取图片验证码内容
前面的文章,介绍了如何通过selenium+Tesseract-OCR来识别图片验证码,如果用接口来访问的话,再用selenium就闲的笨重,下面就介绍一下分别通过httpclient和HttpURL ...
- 图片验证码的JAVA工具类
我们平时开发时经常会遇到需要图片验证码,基础的验证码包括了数字.字母.甚至可能有汉字.下面我给出一个简单的工具类. package com..ankang.tony.util; import java ...
- 用Java制作一个简单的图片验证码
//Java实现简单验证码功能 package project; import java.awt.Color; import java.awt.Font;import java.awt.Graphic ...
- Java如何获取图片验证码保存
举例网站:https://my.1hai.cn/Login/?url=http://www.1hai.cn/ 一.场景:出于安全性考虑,越来越多的Web平台登录都会增加图形验证码(图片),或者短信验证 ...
- 怎样用Java自制优秀的图片验证码?这样!
Completely Automated Public Turing test to tell Computers and Humans Apart 全自动区分计算机和人类的图灵测试 简称CAPTCH ...
随机推荐
- KVC的使用
KVC的使用如下: (1)利用给对象的属性赋值,调用如下两个方法 - (void)setValue:(nullable id)value forKey:(NSString *)key; - (void ...
- Mac系统中idea配置git总结
系统配置git相关文章,网上有很多,这里只总结我所遇到的问题 配置git相关信息命令: vim ~/.gitconfig 然后就可以配置相关信息,git配置文件详解请参考以下网址: https://b ...
- Oracle - Tables
创建表 a: Sql语句创建 -- Create table create table Table_Name ( 字段1 VARCHAR2(50), 字段2 VARCHAR2(50) not null ...
- 小白专场-多项式乘法与加法运算-c语言实现
目录 一.题意理解 二.求解思路 三.多项式的表示 3.1 数组 3.2 链表 四.程序框架搭建 五.如何读入多项式 六.如何将两个多项式相加 七.如何将两个多项式相乘 八.如何将多项式输出 一.题意 ...
- NLP(十一) 提取文本摘要
gensim.summarization库的函数 gensim.summarization.summarize(text, ratio=0.2, word_count=None, split=Fals ...
- 【selenium】- selenium简介
本文由小编根据慕课网视频亲自整理,转载请注明出处和作者. 1. Selenium的来历 2. Selenium家庭成员 Selenium RC: Selenium 1 Selenium Webdriv ...
- HYSBZ - 4016 最短路径树问题 点分治 + 最短路径最小字典序
题目传送门 题解:首先对于给定的图,需要找到那些从1好点出发然后到x号点的最短路, 如果有多条最短路就要找到字典序最小的路,这样扣完这些边之后就会有一棵树.然后再就是很普通的点分治了. 对于扣边这个问 ...
- ubuntu下创建定时任务的两种方式及常见问题解决方案
创建定时任务的目的就是摆脱人为对程序重复性地运行. 0. 首先用下面的指令检查你是否安装crontab, crontab -l 如果本身就有的话,那么出现如下指令 LC_CTYPE="zh_ ...
- 工作中遇到的99%SQL优化,这里都能给你解决方案(二)
-- 示例表 CREATE TABLE `employees` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(24) NOT NULL ...
- 用.NET写“算命”程序
用.NET写"算命"程序 "算命",是一种迷信,我父亲那一辈却执迷不悟,有时深陷其中,有时为求一"上上签",甚至不惜重金,向"天神 ...