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 ...
随机推荐
- three.js模拟实现太阳系行星体系
概况如下: 1.SphereGeometry实现自转的太阳: 2.RingGeometry实现太阳系星系的公转轨道: 3.ImageUtils加载球体和各行星贴图: 4.canvas中createRa ...
- spring-cloud-kubernetes与SpringCloud Gateway
本文是<spring-cloud-kubernetes实战系列>的第五篇,主要内容是在kubernetes上部署一个SpringCloud Gateway应用,该应用使用了spring-c ...
- SPOJ - VFMUL - Very Fast Multiplication FFT加速高精度乘法
SPOJ - VFMUL:https://vjudge.net/problem/SPOJ-VFMUL 这是一道FFT求高精度的模板题. 参考:https://www.cnblogs.com/Rabbi ...
- CF1027D Mouse Hunt 思维
Mouse Hunt time limit per test 2 seconds memory limit per test 256 megabytes input standard input ou ...
- HDU2276 Kiki & Little Kiki 2 矩阵快速幂
Kiki & Little Kiki 2 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java ...
- 牛客网 Wannafly挑战赛 C 列一列 简单题 (题目有点坑)
链接:https://www.nowcoder.com/acm/contest/71/C来源:牛客网 题目描述 小W在计算一个数列{An},其中A1=1,A2=2,An+2=An+1+An.尽管他计算 ...
- js jQuery显示隐藏div的几种方法
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qq_36135335/article/d ...
- 深入理解 Java 中 SPI 机制
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/vpy5DJ-hhn0iOyp747oL5A作者:姜柱 SPI(Service Provider ...
- 聊聊Spring Cloud Config
Spring Cloud Config 转自:https://blog.csdn.net/fjnpysh/article/details/71307311 现今这个时候,微服务大行其道,互联网应用遍地 ...
- 基于 HTML5 的 PID-进料系统可视化界面
前言 随着工业物联网和互联网技术的普及和发展,人工填料的方式已经逐渐被机械设备取代.工业厂商减小误操作.提升设备安全以及追求高效率等制造特点对设备的要求愈加高标准.严要求.同时机械生产以后还需遵从整个 ...