Java图形验证码
用java实现验证码(CAPTCHA)
⽤java实现验证码(CAPTCHA)⼀、关于验证码⾸先来说,验证码在我们的⽇常登录,发表⾔论时⽐较常见,它是⼀种⽤来区分登录⽤户是⼈还是机器的⼀种公共⾃动程序。
它可以防⽌恶意破解密码、刷票、论坛灌⽔。
⼆、⽤java来实现验证码了解了验证码的作⽤,接下来我们就⽤java来实现验证码这⼀功能。
⾸先我们先分析⼀下,怎么⽣成⼀个验证码。
我们需要⼀个BufferedImage对象来保存图⽚;通过它来获得Graphics对象;通过Randrom产⽣随机验证码信息;使⽤Graphics绘制图⽚;记录验证码信息到session中;使⽤ImageIO输出图⽚;1package com.water.servlet;23import com.sun.javafx.font.FontStrike;45import javax.imageio.ImageIO;6import javax.servlet.ServletException;7import javax.servlet.http.HttpServlet;8import javax.servlet.http.HttpServletRequest;9import javax.servlet.http.HttpServletResponse;10import java.awt.*;11import java.awt.image.BufferedImage;12import java.io.IOException;13import java.util.Random;1415public class ImgServlet extends HttpServlet {16 @Override17protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {18 BufferedImage bi = new BufferedImage(68, 22, BufferedImage.TYPE_INT_RGB);19 Graphics graphics = bi.getGraphics();20 Color color = new Color(200, 150, 255);21 graphics.setColor(color);22 graphics.fillRect(0,0,68,32);23char[] chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();24 StringBuffer sb = new StringBuffer();25 Random random = new Random();26for (int i = 0; i < 4; i++) {27char aChar = chars[random.nextInt(36)];28 graphics.setColor(new Color(random.nextInt(88),random.nextInt(188),random.nextInt(255)));29 graphics.drawString(aChar+"",(i*15)+3,18);30 sb.append(aChar);31 }32 req.getSession().setAttribute("charCode",sb.toString());33 ImageIO.write(bi,"jpg",resp.getOutputStream());3435 }36 }写⼀个登录页⾯来检验验证码的正确与否。
JAVA识别图形验证码
最近一直在开发一个用于自动发帖的工具,用HttpClient模拟客户端浏览器注册发帖。
但是碰到了图形验证码的问题了,对单数字的验证码,通过一些OCR引擎,如:tesseract,AspriseOCR很容易解决问题。
但碰到如CSDN论坛这中图形验证码就比较麻烦,必须先通过预处理。
使图象二值化,黑白灰度,增加亮度。
我的代码如下:[java]view plaincopy1.package myfilter;2.import java.io.*;3.import java.awt.image.*;4.import java.awt.geom.AffineTransform;5.import java.awt.color.ColorSpace;6.import java.awt.image.ConvolveOp;7.import java.awt.image.Kernel;8.import java.awt.image.BufferedImage;9.import javax.imageio.ImageIO;10.import java.awt.Toolkit;11.import java.awt.Image;12.13./**14.* <p>Title: Image Filter</p>15.*16.* <p>Description: image processing by filters </p>17.* <p>Copyright: Copyright (c) 2010</p>18.*19.* @author gl74gs48@20.* @since jdk1.5.021.* @version 1.022.*/23.public class MyImgFilter {24.BufferedImage image;25.private int iw, ih;26.private int[] pixels;27.28.29.public MyImgFilter(BufferedImage image) {30.this.image = image;31.iw = image.getWidth();32.ih = image.getHeight();33.pixels = new int[iw * ih];34.35.}36.37./** 图像二值化*/38.public BufferedImage changeGrey() {39.40.41.PixelGrabber pg = new PixelGrabber(image.getSource(), 0, 0, iw, ih, pixels,0, iw);42.try{43.pg.grabPixels();44.} catch(InterruptedException e) {45. e.printStackTrace();46.}47.// 设定二值化的域值,默认值为10048.int grey = 100;49.// 对图像进行二值化处理,Alpha值保持不变50.ColorModel cm = ColorModel.getRGBdefault();51.for(int i = 0; i < iw * ih; i++) {52.int red, green, blue;53.int alpha = cm.getAlpha(pixels[i]);54.if(cm.getRed(pixels[i]) > grey) {55.red = 255;56.} else{57.red = 0;58.}59.if(cm.getGreen(pixels[i]) > grey) {60.green = 255;61.} else{62.green = 0;63.}64.if(cm.getBlue(pixels[i]) > grey) {65.blue = 255;66.} else{67.blue = 0;68.}69.pixels[i] = alpha << 24| red << 16| green << 8| blue; //通过移位重新构成某一点像素的RGB值70.}71.// 将数组中的象素产生一个图像72.Image tempImg=Toolkit.getDefaultToolkit().createImage(new MemoryImageSource(iw,ih, pixels, 0, iw));73.image = new BufferedImage(tempImg.getWidth(null),tempImg.getHeight(null), BufferedImage.TYPE_INT_BGR );74.image.createGraphics().drawImage(tempImg, 0, 0, null);75.return image;76.77.}78.79./** 中值滤波*/80.public BufferedImage getMedian() {81.PixelGrabber pg = new PixelGrabber(image.getSource(), 0, 0, iw, ih,82.pixels,83.0, iw);84.try{85.pg.grabPixels();86.} catch(InterruptedException e) {87. e.printStackTrace();88.}89.// 对图像进行中值滤波,Alpha值保持不变90.ColorModel cm = ColorModel.getRGBdefault();91.for(int i = 1; i < ih - 1; i++) {92.for(int j = 1; j < iw - 1; j++) {93.int red, green, blue;94.int alpha = cm.getAlpha(pixels[i * iw + j]);95.96.// int red2 = cm.getRed(pixels[(i - 1) * iw+ j]);97.int red4 = cm.getRed(pixels[i * iw + j - 1]);98.int red5 = cm.getRed(pixels[i * iw + j]);99.int red6 = cm.getRed(pixels[i * iw + j + 1]);100.// int red8 = cm.getRed(pixels[(i + 1) * i w + j]);101.102.// 水平方向进行中值滤波103.if(red4 >= red5) {104.if(red5 >= red6) {105.red = red5;106.} else{107.if(red4 >= red6) {108.red = red6;109.} else{110.red = red4;111.}112.}113.} else{114.if(red4 > red6) {115.red = red4;116.} else{117.if(red5 > red6) { 118.red = red6; 119.} else{120.red = red5; 121.}122.}123.}124.125.int green4 = cm.getGreen(pixels[i * iw + j - 1]);126.int green5 = cm.getGreen(pixels[i * iw + j] );127.int green6 = cm.getGreen(pixels[i * iw + j + 1]);128.129.// 水平方向进行中值滤波130.if(green4 >= green5) {131.if(green5 >= green6) {132.green = green5;133.} else{134.if(green4 >= green6) { 135.green = green6; 136.} else{137.green = green4; 138.}139.}140.} else{141.if(green4 > green6) {142.green = green4;143.} else{144.if(green5 > green6) {145.green = green6; 146.} else{147.green = green5; 148.}149.}150.}151.152.// int blue2 = cm.getBlue(pixels[(i - 1) * iw + j]);153.int blue4 = cm.getBlue(pixels[i * iw + j -1]);154.int blue5 = cm.getBlue(pixels[i * iw + j]);155.int blue6 = cm.getBlue(pixels[i * iw + j + 1]);156.// int blue8 = cm.getBlue(pixels[(i + 1) * iw + j]);157.158.// 水平方向进行中值滤波159.if(blue4 >= blue5) {160.if(blue5 >= blue6) {161.blue = blue5;162.} else{163.if(blue4 >= blue6) { 164.blue = blue6; 165.} else{166.blue = blue4;167.}168.}169.} else{170.if(blue4 > blue6) {171.blue = blue4;172.} else{173.if(blue5 > blue6) {174.blue = blue6;175.} else{176.blue = blue5;177.}178.}179.}180.pixels[i * iw +181.j] = alpha << 24| red << 16| green << 8| blue;182.}183.}184.185.// 将数组中的象素产生一个图像186.Image tempImg=Toolkit.getDefaultToolkit().createImage(new Memory ImageSource(iw,ih, pixels, 0, iw));187.image = new BufferedImage(tempImg.getWidth(null),tempImg.getHei ght(null), BufferedImage.TYPE_INT_BGR );188.image.createGraphics().drawImage(tempImg, 0, 0, null);189.return image;190.191.}192.193.194.195.196.public BufferedImage getGrey() {197.ColorConvertOp ccp=new ColorConvertOp(ColorSpace.getInstance(Col orSpace.CS_GRAY), null);198.return image=ccp.filter(image,null);199.}200.201.//Brighten using a linear formula that increases all color values202.public BufferedImage getBrighten() {203.RescaleOp rop=new RescaleOp(1.25f, 0, null);204.return image=rop.filter(image,null);205.}206.//Blur by "convolving" the image with a matrix207.public BufferedImage getBlur() {208.float[] data = {209..1111f, .1111f, .1111f,210..1111f, .1111f, .1111f,211..1111f, .1111f, .1111f, }; 212.ConvolveOp cop = new ConvolveOp(new Kernel(3, 3, data));213.return image=cop.filter(image,null);214.215.}216.217.// Sharpen by using a different matrix218.public BufferedImage getSharpen() {219.float[] data = {220.0.0f, -0.75f, 0.0f,221.-0.75f, 4.0f, -0.75f,222.0.0f, -0.75f, 0.0f};223.ConvolveOp cop = new ConvolveOp(new Kernel(3, 3, data));224.return image=cop.filter(image,null);225.}226.// 11) Rotate the image 180 degrees about its center point 227.public BufferedImage getRotate() {228.AffineTransformOp atop=new AffineTransformOp(AffineTransform.get RotateInstance(Math.PI,image.getWidth()/2,image.getHeight()/2),229.AffineTransformOp.TYPE_NEAREST_NEIGHBOR);230.return image=atop.filter(image,null);231. 232.}233.234.public BufferedImage getProcessedImg()235.{236.return image;237.}238.239.public static void main(String[] args) throws IOException {240.FileInputStream fin=new FileInputStream(args[0]);241.BufferedImage bi=ImageIO.read(fin);242.MyImgFilter flt=new MyImgFilter(bi);243.flt.changeGrey();244.flt.getGrey();245.flt.getBrighten();246.bi=flt.getProcessedImg();247.248.String pname=args[0].substring(0,args[0].lastIndexOf(".")); 249.File file = new File(pname+".jpg");250.ImageIO.write(bi, "jpg", file);251.}252.253.}运行java myfilter.MyImgFilter t6.bmp,请确认图片t6.bmp与myfilter目录在同一目录下。
java实现随机验证码图片生成
java实现随机验证码图⽚⽣成本⽂实例为⼤家分享了java⽣成随机验证码图⽚的具体代码,供⼤家参考,具体内容如下1.controller/*** 获取随机数验证码图⽚** @param request HttpServletRequest* @param response HttpServletResponse*/@GetMapping(value = "/getRandomCode" ,produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) public void getRandomCode(HttpServletRequest request, HttpServletResponse response) {baseService.getRandomCode(request, response);}2.servicevoid getRandomCode(HttpServletRequest request, HttpServletResponse response);3.serviceImpl@Autowiredprivate RedisTemplate redisTemplate;@Autowiredprivate CodeImageUtils codeImageUtils;/*** 获取随机数验证码图⽚*/@Overridepublic void getRandomCode(HttpServletRequest request, HttpServletResponse response) {try {// 设置输出类型为图⽚response.setContentType("image/jpeg");// ⽣成随机码String verificationCode = codeImageUtils.getRandomCode();// 背景颜⾊与字符颜⾊Color color = codeImageUtils.getRandomColor();Color reverseColor = codeImageUtils.getReverseColor(color);//创建⼀张彩⾊的图⽚BufferedImage bi = new BufferedImage(100, 30, BufferedImage.TYPE_INT_RGB);Graphics2D graphics = bi.createGraphics();//设置字体graphics.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 16));graphics.setColor(color);//绘制背景graphics.fillRect(0, 0, 100, 30);graphics.setColor(reverseColor);//绘制字符graphics.drawString(verificationCode, 18, 20);//绘制最多50个随机噪点//绘制最多50个随机噪点Random random = new Random();int n = random.nextInt(50);for (int i = 0; i < n; i++) {graphics.drawRect(100, 30, 1, 1);}// 放到redis中 sessionId:code,过期时间60sredisTemplate.opsForValue().set(request.getSession().getId(),verificationCode,60, TimeUnit.SECONDS); //输出到客户端ServletOutputStream sos = response.getOutputStream();JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(sos);encoder.encode(bi);sos.flush();}catch (Exception ex){log.error("⽣成验证码失败!",ex);}}4.CodeImageUtils@Componentpublic class CodeImageUtils {@AutowiredRedisTemplate redisTemplate;/*** ⽣成4位随机的验证码字符串** @return*/public String getRandomCode() {// 通过random⽣成4位随机数字码Random random = new Random();StringBuilder rs = new StringBuilder();for (int i = 0; i < 4; i++) {rs.append(random.nextInt(10));}return rs.toString();}/*** ⽣成随机的颜⾊** @return*/public Color getRandomColor() {Random random = new Random();return new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)); }/*** 获取某颜⾊的反⾊* @param color* @return*/public Color getReverseColor(Color color) {return new Color(255 - color.getRed(), 255 - color.getGreen(), 255 - color.getBlue()); }/*** 校验* @param code* @return*/public boolean valid(HttpServletRequest request,String code){// 获取缓存的codeObject cacheCode = redisTemplate.opsForValue().get(request.getSession().getId()); if(cacheCode ==null){return false;}return code.equals(cacheCode);}}5.请求该接⼝6.ImageIOJPEGCodec这个在⾼版本的jdk中过期了,替换为ImageIO//输出到客户端ServletOutputStream sos = response.getOutputStream();/*JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(sos);encoder.encode(bi);*/ImageIO.write(bi, "PNG", sos);sos.flush();7.sessionId不⼀致以上代码在单节点部署情况下暂时没发现什么问题,但是在多节点部署时会出现sessionId不⼀致的问题,(别问我怎么知道的…踩坑使我进步)。
java验证码实现原理
java验证码实现原理Java验证码实现原理验证码(CAPTCHA)是一种用于防止自动化程序攻击的技术。
Java作为一种广泛使用的编程语言,也提供了多种方法来实现验证码功能。
本文将介绍Java验证码的实现原理。
1. 什么是验证码?验证码是一种人机交互技术,通过给用户展示一个难以被计算机识别的图形或文字,要求用户输入正确的答案来验证用户是否为人类。
这种技术主要用于防止自动化程序攻击,例如防止恶意软件通过自动化方式注册大量账号、发送垃圾邮件等。
2. Java中的验证码实现Java中提供了多种方式来实现验证码,例如使用第三方库、使用Java Servlet API等。
下面将分别介绍这些方法的原理。
2.1 使用第三方库在Java中,有很多第三方库可以用于生成和验证验证码。
其中比较流行的有Google的reCAPTCHA和Kaptcha等。
reCAPTCHA是Google开发的一款免费且易于使用的服务,用于保护网站免受垃圾邮件和恶意软件攻击。
它基于先进的机器学习技术,在用户完成简单任务(例如选择图像中所有包含某个物体的图像)后生成一个随机字符串作为验证码,并将其与Google服务器上的预定义答案进行比较。
如果用户输入的答案与预定义答案匹配,则验证通过。
Kaptcha是一种Java验证码库,它可以生成各种验证码,例如数字、字母、中文等。
它使用Java的Graphics2D API在内存中生成验证码图片,并将其输出到客户端。
Kaptcha还提供了多种选项来自定义验证码的样式和行为。
使用第三方库可以方便地实现验证码功能,但需要注意选择合适的库并防止版本兼容性问题。
2.2 使用Java Servlet APIJava Servlet API是Java EE中用于创建Web应用程序的标准API之一。
它提供了一个名为Servlet的接口,开发人员可以通过实现该接口来处理HTTP请求和响应。
在Servlet中实现验证码功能通常有以下几个步骤:1. 生成随机字符串作为验证码,并将其存储在Session中。
java 验证码生成校验流程 -回复
java 验证码生成校验流程-回复生成和校验验证码是网络应用程序中常见的安全机制之一。
本文将详细介绍使用Java编程语言生成和校验验证码的流程,并提供一步一步的实现方法。
一、什么是验证码?验证码,全称为“全自动区分计算机和人类的公开图灵测试”,是一种用于确认用户是否为人类的技术。
它通常以图像或文字的形式显示,并要求用户正确地输入验证码以完成验证。
验证码的主要目的是防止恶意程序或机器人在网络应用程序中自动化执行任务,例如暴力破解密码或进行垃圾邮件的自动发送。
二、生成验证码的流程1. 定义验证码的属性:在Java中,我们可以定义一个验证码类,其中包含属性如宽度、高度、长度、字符类型等。
这些属性将在后续生成和校验过程中使用。
2. 生成随机字符序列:使用Java的随机数生成器,我们可以生成一个随机的字符序列作为验证码的内容。
可以根据需要定义字符的范围,例如数字、字母(大小写)、符号等。
3. 绘制验证码图像:使用Java的绘图工具,我们可以将随机生成的字符序列绘制为图像。
可以设置图像的宽度、高度、背景色、前景色等。
4. 输出图像:将绘制好的验证码图像输出到前端页面或保存为文件。
可以使用Java提供的图像输出库,例如Java 2D库或第三方库。
5. 存储验证码的值:为了进行验证码的校验,我们需要将生成的验证码值存储在后台。
可以将其存储在内存中、数据库中或客户端的会话中。
三、校验验证码的流程1. 获取用户输入的验证码:在前端页面上,用户需要输入验证码,并提交到后台进行校验。
可以使用HTML表单元素,例如输入框和提交按钮。
2. 从存储的位置获取验证码的值:通过之前存储的方式,我们可以从内存、数据库或会话中获取生成的验证码的值。
3. 比较用户输入的验证码和存储的验证码值:使用Java编程语言,我们可以将用户输入的验证码与存储的验证码值进行比较。
如果相等,则验证通过,否则验证失败。
4. 完成校验结果的反馈:根据校验结果,我们可以向用户反馈验证的结果。
一步步实现滑动验证码(拼图验证码),Java图片处理关键代码
⼀步步实现滑动验证码(拼图验证码),Java图⽚处理关键代码 最近滑动验证码在很多⽹站逐步流⾏起来,⼀⽅⾯对⽤户体验来说,⽐较新颖,操作简单,另⼀⽅⾯相对图形验证码来说,安全性并没有很⼤的降低。
当然到⽬前为⽌,没有绝对的安全验证,只是不断增加攻击者的绕过成本。
接下来分析下滑动验证码的核⼼流程:1. 后端随机⽣成抠图和带有抠图阴影的背景图⽚,后台保存随机抠图位置坐标2. 前端实现滑动交互,将抠图拼在抠图阴影之上,获取到⽤户滑动距离值,⽐如以下⽰例3. 前端将⽤户滑动距离值传⼊后端,后端校验误差是否在容许范围内。
这⾥单纯校验⽤户滑动距离是最基本的校验,出于更⾼的安全考虑,可能还会考虑⽤户滑动的整个轨迹,⽤户在当前页⾯的访问⾏为等。
这些可以很复杂,甚⾄借助到⽤户⾏为数据分析模型,最终的⽬标都是增加⾮法的模拟和绕过的难度。
这些有机会可以再归纳总结常⽤到的⽅法,本⽂重点集中在如何基于Java来⼀步步实现滑动验证码的⽣成。
可以看到,滑动图形验证码,重要有两个图⽚组成,抠块和带有抠块阴影的原图,这⾥⾯有两个重要特性保证被暴⼒破解的难度:抠块的形状随机和抠块所在原图的位置随机。
这样就可以在有限的图集中制造出随机的、⽆规律可寻的抠图和原图的配对。
⽤代码如何从⼀张⼤图中抠出⼀个有特定随机形状的⼩图呢?第⼀步,先确定⼀个抠出图的轮廓,⽅便后续真正开始执⾏图⽚处理操作图⽚是有像素组成,每个像素点对应⼀种颜⾊,颜⾊可以⽤RGB形式表⽰,外加⼀个透明度,把⼀张图理解成⼀个平⾯图形,左上⾓为原点,向右x轴,向下y轴,⼀个坐标值对应该位置像素点的颜⾊,这样就可以把⼀张图转换成⼀个⼆维数组。
基于这个考虑,轮廓也⽤⼆维数组来表⽰,轮廓内元素值为1,轮廓外元素值对应0。
这时候就要想这个轮廓形状怎么⽣成了。
有坐标系、有矩形、有圆形,没错,⽤到数学的图形函数。
典型⽤到⼀个圆的函数⽅程和矩形的边线的函数,类似:(x-a)²+(y-b)²=r²中,有三个参数a、b、r,即圆⼼坐标为(a,b),半径r。
java实现简单的验证码功能
java实现简单的验证码功能最近要做⼀个⽹站,要求实现验证码程序,经过不断调试,终于成功实现功能。
⼀、验证码⽣成类⽣成验证码的话需要⽤到java的Graphics类库,画出⼀个验证码废话不多说,直接上代码package verificationCode;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.awt.image.RenderedImage;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.util.HashMap;import java.util.Map;import java.util.Random;import javax.imageio.ImageIO;public class generateCode {private static int width = 150;// 定义图⽚的widthprivate static int height = 48;// 定义图⽚的heightprivate static int codeCount = 4;// 定义图⽚上显⽰验证码的个数private static int xx = 25;private static int fontHeight = 42;private static int codeY = 42;private static char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R','S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };/*** ⽣成⼀个map集合* code为⽣成的验证码* codePic为⽣成的验证码BufferedImage对象* @return*/public static Map<String,Object> generateCodeAndPic() {// 定义图像bufferBufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// Graphics2D gd = buffImg.createGraphics();// Graphics2D gd = (Graphics2D) buffImg.getGraphics();Graphics gd = buffImg.getGraphics();// 创建⼀个随机数⽣成器类Random random = new Random();// 将图像填充为⽩⾊gd.setColor(Color.WHITE);gd.fillRect(0, 0, width, height);// 创建字体,字体的⼤⼩应该根据图⽚的⾼度来定。
java 验证码生成
java 验证码生成验证码效果图import java.awt.Color;import java.awt.Font;import java.io.IOException;import java.io.OutputStream;import java.util.ArrayList;import java.util.List;import javax.imageio.ImageIO;import javax.servlet.Servlet;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import ng.math.RandomUtils;import nl.captcha.Captcha;import nl.captcha.Captcha.Builder;import nl.captcha.gimpy.BlockGimpyRenderer;import nl.captcha.text.producer.ChineseTextProducer;import nl.captcha.text.producer.DefaultTextProducer;import nl.captcha.text.renderer.DefaultWordRenderer;import nl.captcha.text.renderer.WordRenderer;public class CaptchaServlet extends HttpServlet implements Servlet {private static final long serialVersionUID = 1L;private static final String PARAM_HEIGHT = "height"; // 高度默认为50 private static final String PARAM_WIDTH = "width";// 宽度默认为200private static final String PAEAM_NOISE = "noise";// 干扰线条默认是没有干扰线条private static final String PAEAM_TEXT = "text";// 文本protected int _width = 150;protected int _height = 40;protected boolean _noise = false;protected String _text ="number:1,word:1,number:1,number:1,word:1";/*** 初始化过滤器.将配置文件的参数文件赋值** @throws ServletException*/@Overridepublic void init() throws ServletException {if (getInitParameter(PARAM_HEIGHT) != null) {_height =Integer.valueOf(getInitParameter(PARAM_HEIGHT));}if (getInitParameter(PARAM_WIDTH) != null) {_width = Integer.valueOf(getInitParameter(PARAM_WIDTH)); }if (getInitParameter(PAEAM_NOISE) != null) {_noise = Boolean.valueOf(getInitParameter(PAEAM_NOISE));}if (getInitParameter(PAEAM_NOISE) != null) {_text = String.valueOf(getInitParameter(PAEAM_TEXT)); }}/*** 因为获取图片只会有get方法*/@Overridepublic void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Builder builder = new Captcha.Builder(_width, _height);// 增加边框// builder.addBorder();// 是否增加干扰线条if (_noise == true) {builder.addNoise();}// ----------------自定义字体大小-----------// 自定义设置字体颜色和大小最简单的效果多种字体随机显示 List<Font> fontList = new ArrayList<Font>();fontList.add(new Font("微软雅黑",YOUT_NO_START_CONTEXT, 30));// 可以设置斜体之类的 DefaultWordRenderer dwr = newDefaultWordRenderer(getRandomColor(), fontList);// 加入多种颜色后会随机显示字体空心WordRenderer wr = dwr;// 增加文本,默认为5个随机字符.if (_text == null) {builder.addText();} else {String[] ts = _text.split(",");for (int i = 0; i < ts.length; i++) {String[] ts1 = ts[i].split(":");if ("chinese".equals(ts1[0])) {builder.addText(newChineseTextProducer(Integer.parseInt(ts1[1])), wr);} else if ("number".equals(ts1[0])) {// 这里没有0和1是为了避免歧义和字母I和Ochar[] numberChar = new char[] { '2', '3', '4', '5', '6', '7', '8' };builder.addText(newDefaultTextProducer(Integer.parseInt(ts1[1]), numberChar), wr); } else if ("word".equals(ts1[0])) {// 原理同上char[] numberChar = new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'k', 'm', 'n', 'p', 'r','w', 'x', 'y' };builder.addText(newDefaultTextProducer(Integer.parseInt(ts1[1]), numberChar), wr); } else {builder.addText(newDefaultTextProducer(Integer.parseInt(ts1[1])), wr);}}}// --------------添加背景-------------// 设置背景渐进效果以及颜色 form为开始颜色,to为结束颜色// GradiatedBackgroundProducer gbp=new GradiatedBackgroundProducer();// gbp.setFromColor(Color.yellow);// gbp.setToColor(Color.red);// 无渐进效果,只是填充背景颜色// FlatColorBackgroundProducer fbp=new// FlatColorBackgroundProducer(Color.red);// 加入网纹--一般不会用// SquigglesBackgroundProducer sbp=new SquigglesBackgroundProducer();// 没发现有什么用,可能就是默认的// TransparentBackgroundProducer tbp = new// TransparentBackgroundProducer();// builder.addBackground(gbp);// ---------装饰字体---------------// 字体边框齿轮效果默认是3builder.gimp(new BlockGimpyRenderer(1));// 波纹渲染相当于加粗// builder.gimp(new RippleGimpyRenderer());// 修剪--一般不会用// builder.gimp(new ShearGimpyRenderer(Color.red));// 加网--第一个参数是横线颜色,第二个参数是竖线颜色// builder.gimp(newFishEyeGimpyRenderer(Color.red,Color.yellow));// 加入阴影效果默认3,75// builder.gimp(new DropShadowGimpyRenderer());// 创建对象Captcha captcha = builder.build();req.getSession().setAttribute("simpleCaptcha", captcha); resp.setHeader("Cache-Control","private,no-cache,no-store");resp.setContentType("image/png");try {OutputStream os = resp.getOutputStream();ImageIO.write(captcha.getImage(), "png", os);os.close();} catch (IOException e) {e.printStackTrace();}}public Color getRandomColor() {int n = RandomUtils.nextInt(100);if (n % 3 == 1) {return Color.RED;} else if (n % 3 == 2) {return Color.BLUE;}return Color.GREEN;}}</pre>。
java识别验证码的方法
java识别验证码的方法
Java识别验证码的方法主要有以下几种:
1. 使用开源的OCR(Optical Character Recognition,光学字符识别)库,例如Tesseract。
Tesseract是一个强大的OCR引擎,可以识别多种语言的文本。
使用Tesseract识别验证码需要先对验证码进行预处理,例如二值化、去噪等,然后将处理后的图像输入到Tesseract中进行识别。
2. 使用机器学习算法,例如卷积神经网络(Convolutional Neural Network,CNN)或循环神经网络(Recurrent Neural Network,RNN)。
这些算法可以通过训练大量的验证码图片来学习识别验证码的规律,从而实现自动识别验证码。
3. 使用第三方服务,例如Google Cloud Vision API、Amazon Rekognition等。
这些服务提供了图像识别功能,可以识别出图像中的文字、物体等。
使用这些服务需要先上传验证码图片,然后调用相应的API进行识别。
无论使用哪种方法,都需要对验证码进行适当的预处理,以提高识别的准确率。
常见的预处理方法包括二值化、去噪、缩放等。
同时,需要注意保护用户隐私和数据安全,避免将用户数据泄露给第三方或用于其他用途。
java实现随机生成验证码图片
java实现随机⽣成验证码图⽚验证码验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全⾃动区分计算机和⼈类的图灵测试)的缩写。
由于计算机⽆法解答CAPTCHA的问题,所以回答出问题的⽤户就可以被认为是⼈类。
作⽤防⽌恶意破解密码、刷票、论坛灌⽔、刷页。
有效防⽌某个⿊客对某⼀个特定注册⽤户⽤特定程序暴⼒破解⽅式进⾏不断的登录尝试,实际上使⽤验证码是现在很多⽹站通⾏的⽅式(⽐如招商银⾏的⽹上个⼈银⾏,百度社区),我们利⽤⽐较简易的⽅式实现了这个功能。
虽然登录⿇烦⼀点,但是对⽹友的密码安全来说这个功能还是很有必要,也很重要。
但我们还是提醒⼤家要保护好⾃⼰的密码,尽量使⽤混杂了数字、字母、符号在内的6位以上密码,不要使⽤诸如1234之类的简单密码或者与⽤户名相同、类似的密码,免得你的账号被⼈盗⽤给⾃⼰带来不必要的⿇烦。
验证码通常使⽤⼀些线条和⼀些不规则的字符组成,主要作⽤是为了防⽌⼀些⿊客把密码数据化盗取。
分类现在常见的验证码主要有gif验证码⼿机短信验证码⼿机语⾳验证码视频验证码实例这⾥只是⽤java⽣出⼀个验证码的图⽚,并没有在在⽹页的操作package com.xn;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;/*** 验证码⽣成⼯具类** @leo*/public class ValidateCode {// 图⽚的宽度。
ocr识别验证码的java实现
近年来,随着互联网的飞速发展以及信息技术的深入应用,验证码识别技术已经成为了信息安全领域中的一个热门话题。
在这个过程中,OCR(Optical Character Recognition,光学字符识别)技术作为验证码识别的一种重要方法,已经得到了广泛的应用。
本文将从OCR识别验证码的Java实现这一主题入手,深入探讨其原理、实现方法以及在实际开发中的应用。
1. OCR识别验证码的原理我们来简要介绍一下OCR识别验证码的原理。
OCR技术通过对图像或文档进行扫描,识别其中的文字、数字和符号,将其转化为可以编辑和处理的文本格式。
在验证码识别中,通过OCR技术可以将图片验证码中的文字内容提取出来,从而实现自动化识别和验证的功能。
在Java开发中,我们可以利用相关的OCR库和算法来实现验证码识别的功能。
2. OCR识别验证码的Java实现方法针对OCR识别验证码的Java实现,我们可以选择使用一些成熟的OCR库,例如Tesseract、Asprise OCR等。
这些库提供了丰富的API和文档,可以方便地在Java项目中进行集成和调用。
另外,我们还可以通过Java图像处理库来对验证码图片进行预处理,提高识别的准确性和稳定性。
在实际应用中,我们可以结合验证码的特点和实际需求,选择合适的OCR实现方法,以达到最佳的识别效果。
3. OCR识别验证码的实际应用在实际开发中,OCR识别验证码的应用非常广泛,涉及到了网页爬虫、自动化测试、信息采集等多个领域。
通过OCR识别验证码,我们可以实现网页自动登录、数据采集与分析等功能。
在Java开发中,我们可以通过调用OCR库提供的API,对验证码进行快速、准确的识别,从而提高系统的自动化程度和效率。
4. 个人观点和理解从个人角度来看,OCR识别验证码的Java实现是一个非常有挑战性和技术含量的任务。
我们需要充分理解验证码识别的原理和技术,结合Java编程的特点和优势,进行系统设计和实现。
java图形验证码
要么这样试试,应该也可以。在servlet里一开始写一句:
System.setProperty("java.awt.headless","true");
web服务器的java虚拟机必须加以个参数java.awt.headless=true
以tomcat为例
可以在/etc/profile或启动web服务的用户的.bash_profile中的CATALINA_OPTS变量中加入:
CATALINA_OPTS="... -Djava.awt.headless=true"
其他的也可以看看启动脚本。只要加上这个参数就没问题了。
throws ServletException,IOException {
doGet(request,response);
}
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException {
out.close();
}
}
java的图片处理包需要图形环境,而linux上没有启动图形环境,找不到图形环境的server(X11 window server using ':0.0' )所以会报这个错。而通过java -Djava.awt.headless=true 这个参数的指定就可以避免java 2d去找图形环境。
c=s.charAt(i);
gra.drawString(c ,i*7 4,11); //7为宽度,11为上下高度位置
}
Java实现图形验证码
Java实现图形验证码实现类import java.awt.*;import java.awt.image.BufferedImage;import java.io.IOException;import java.io.OutputStream;import java.util.Random;import javax.imageio.ImageIO;public class ImageVerificationCode {/*** 验证码图⽚的长*/private final int weight = 100;/*** 验证码图⽚的宽*/private final int height = 40;/*** 获取随机数对象*/private final Random r = new Random();/*** 字体数组 {"宋体", "华⽂楷体", "⿊体", "微软雅⿊", "楷体_GB2312"};*/private final String[] fontNames = {"Georgia"};/*** ⽤来保存验证码的⽂本内容*/private String text;/*** 将验证码图⽚写出的⽅法* @param image* @param out* @throws IOException*/public static void output(BufferedImage image, OutputStream out) throws IOException {ImageIO.write(image, "JPEG", out);}/*** 获取随机的颜⾊** @return*/private Color randomColor() {//这⾥为什么是225,因为当r,g,b都为255时,即为⽩⾊,为了好辨认,需要颜⾊深⼀点。
java 验证码生成校验流程 -回复
java 验证码生成校验流程-回复Java验证码生成校验流程验证码是一种常用的用于验证用户身份或防止网络恶意攻击的方法。
在Web应用程序中,常见的验证码有图片验证码,短信验证码等。
本文将以Java为例,详细介绍验证码生成和校验的流程。
一、生成验证码1. 首先,我们需要定义验证码的相关参数,如验证码的长度、宽度、高度、字体等信息。
通常,这些参数会定义在一个配置文件中,以方便后续的调整和管理。
2. 在Java中,我们可以使用第三方库来生成验证码,如Google的Kaptcha、JCaptcha等。
这些库提供了丰富的功能,可以生成验证码图片,并将验证码保存到session或redis等存储介质中。
在本文中,我们选择使用Kaptcha作为示例。
3. 通过引入Kaptcha的依赖包,我们可以在代码中创建一个Kaptcha 对象,并设置相应的参数。
例如,我们可以指定验证码的长度为4个字符,宽度为200像素,高度为50像素,字体为Arial,并设置字体大小和颜色等。
4. 调用Kaptcha的createText方法,生成一个随机的验证码字符串。
该方法会根据指定的长度从一组预定义的字符中随机选择字符,并将其组合成一个字符串。
5. 接下来,我们可以调用Kaptcha的createImage方法,将验证码字符串转换成一个BufferedImage对象。
然后,通过ImageIO的write方法将BufferedImage对象以JPEG、PNG等格式保存为图片文件。
同时,我们还可以将验证码字符串保存到session或redis中,以备后续的校验。
至此,我们已经完成了验证码的生成过程。
二、校验验证码1. 当用户提交表单时,我们需要从表单中获取用户输入的验证码字符串。
2. 首先,我们需要从session或redis中获取之前生成的验证码字符串。
这可以通过HttpServletRequest对象的getSession方法获取到HttpSession对象,再通过HttpSession的getAttribute方法获取验证码字符串。
java超经漂亮验证码
java超经漂亮验证码 1package com.zly.xsp.image;23import java.awt.Color;4import java.awt.Font;5import java.awt.Graphics;6import java.awt.Graphics2D;7import java.awt.image.BufferedImage;8import java.io.IOException;9import java.io.OutputStream;10import java.util.Random;1112import javax.imageio.ImageIO;13import javax.servlet.http.HttpServletRequest;14import javax.servlet.http.HttpServletResponse;15import javax.servlet.http.HttpSession;1617public class CreateImageCode {18// 图⽚的宽度。
19private int width = 160;20// 图⽚的⾼度。
21private int height = 40;22// 验证码字符个数23private int codeCount = 4;24// 验证码⼲扰线数25private int lineCount = 20;26// 验证码27private String code = null;28// 验证码图⽚Buffer29private BufferedImage buffImg = null;30 Random random = new Random();3132public CreateImageCode() {33 creatImage();34 }3536public CreateImageCode(int width, int height) {37this.width = width;38this.height = height;39 creatImage();40 }4142public CreateImageCode(int width, int height, int codeCount) {43this.width = width;44this.height = height;45this.codeCount = codeCount;46 creatImage();47 }4849public CreateImageCode(int width, int height, int codeCount, int lineCount) {50this.width = width;51this.height = height;52this.codeCount = codeCount;53this.lineCount = lineCount;54 creatImage();55 }5657// ⽣成图⽚58private void creatImage() {59int fontWidth = width / codeCount;// 字体的宽度60int fontHeight = height - 5;// 字体的⾼度61int codeY = height - 8;6263// 图像buffer64 buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);65 Graphics g = buffImg.getGraphics();66//Graphics2D g = buffImg.createGraphics();67// 设置背景⾊68 g.setColor(getRandColor(200, 250));69 g.fillRect(0, 0, width, height);70717273// 设置字体74//Font font1 = getFont(fontHeight);75 Font font = new Font("Fixedsys", Font.BOLD, fontHeight);76 g.setFont(font);7778// 设置⼲扰线79for (int i = 0; i < lineCount; i++) {80int xs = random.nextInt(width);81int ys = random.nextInt(height);82int xe = xs + random.nextInt(width);83int ye = ys + random.nextInt(height);84 g.setColor(getRandColor(1, 255));85 g.drawLine(xs, ys, xe, ye);86 }8788// 添加噪点89float yawpRate = 0.01f;// 噪声率90int area = (int) (yawpRate * width * height);91for (int i = 0; i < area; i++) {92int x = random.nextInt(width);93int y = random.nextInt(height);9495 buffImg.setRGB(x, y, random.nextInt(255));96 }979899 String str1 = randomStr(codeCount);// 得到随机字符100this.code = str1;101for (int i = 0; i < codeCount; i++) {102 String strRand = str1.substring(i, i + 1);103 g.setColor(getRandColor(1, 255));104// g.drawString(a,x,y);105// a为要画出来的东西,x和y表⽰要画的东西最左侧字符的基线位于此图形上下⽂坐标系的 (x, y) 位置处106107 g.drawString(strRand, i*fontWidth+3, codeY);108 }109110111 }112113// 得到随机字符114private String randomStr(int n) {115 String str1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";116 String str2 = "";117int len = str1.length() - 1;118double r;119for (int i = 0; i < n; i++) {120 r = (Math.random()) * len;121 str2 = str2 + str1.charAt((int) r);122 }123return str2;124 }125126// 得到随机颜⾊127private Color getRandColor(int fc, int bc) {// 给定范围获得随机颜⾊128if (fc > 255)129 fc = 255;130if (bc > 255)131 bc = 255;132int r = fc + random.nextInt(bc - fc);133int g = fc + random.nextInt(bc - fc);134int b = fc + random.nextInt(bc - fc);135return new Color(r, g, b);136 }137138/**139 * 产⽣随机字体140*/141private Font getFont(int size) {142 Random random = new Random();143 Font font[] = new Font[5];144 font[0] = new Font("Ravie", Font.PLAIN, size);145 font[1] = new Font("Antique Olive Compact", Font.PLAIN, size);146 font[2] = new Font("Fixedsys", Font.PLAIN, size);147 font[3] = new Font("Wide Latin", Font.PLAIN, size);148 font[4] = new Font("Gill Sans Ultra Bold", Font.PLAIN, size);149return font[random.nextInt(5)];150 }151152// 扭曲⽅法153private void shear(Graphics g, int w1, int h1, Color color) {154 shearX(g, w1, h1, color);155 shearY(g, w1, h1, color);156 }157158private void shearX(Graphics g, int w1, int h1, Color color) {159160int period = random.nextInt(2);161162boolean borderGap = true;163int frames = 1;164int phase = random.nextInt(2);165166for (int i = 0; i < h1; i++) {167double d = (double) (period >> 1)168 * Math.sin((double) i / (double) period169 + (6.2831853071795862D * (double) phase)170 / (double) frames);171 g.copyArea(0, i, w1, 1, (int) d, 0);172if (borderGap) {173 g.setColor(color);174 g.drawLine((int) d, i, 0, i);175 g.drawLine((int) d + w1, i, w1, i);176 }177 }178179 }180181private void shearY(Graphics g, int w1, int h1, Color color) {182183int period = random.nextInt(40) + 10; // 50;184185boolean borderGap = true;186int frames = 20;187int phase = 7;188for (int i = 0; i < w1; i++) {189double d = (double) (period >> 1)190 * Math.sin((double) i / (double) period191 + (6.2831853071795862D * (double) phase)192 / (double) frames);193 g.copyArea(i, 0, 1, h1, 0, (int) d);194if (borderGap) {195 g.setColor(color);196 g.drawLine(i, (int) d, i, 0);197 g.drawLine(i, (int) d + h1, i, h1);198 }199200 }201202 }203204205206public void write(OutputStream sos) throws IOException {207 ImageIO.write(buffImg, "png", sos);208 sos.close();209 }210211public BufferedImage getBuffImg() {212return buffImg;213 }214215public String getCode() {216return code.toLowerCase();217 }218219//使⽤⽅法220/*public void getCode3(HttpServletRequest req, HttpServletResponse response,HttpSession session) throws IOException{ 221 // 设置响应的类型格式为图⽚格式222 response.setContentType("image/jpeg");223 //禁⽌图像缓存。
Java验证码(思路清晰,很容易理解)
Java验证码(思路清晰,很容易理解)<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ page contentType="image/jpeg"import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio. *"%><%!//生成随机颜色Color getRandColor(Random random, int fc, int bc) {if (fc > 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 String getRandChar() {int rand = (int) Math.round(Math.random() * 2);long itmp = 0;char ctmp = '\u0000';//根据rand的值来决定是生成一个大写字母、小写字母还是数字switch (rand) {//生成大写字母case 1:itmp = Math.round(Math.random() * 25 + 65);ctmp = (char) itmp;return String.valueOf(ctmp);//生成小写字母case 2:itmp = Math.round(Math.random() * 25 + 97);ctmp = (char) itmp;return String.valueOf(ctmp);//生成数字default:itmp = Math.round(Math.random() * 9);return String.valueOf(itmp);}}//产生随机字体private Font getFont() {Random random = new Random();Font font[] = new Font[5];font[0] = new Font("Ravie", Font.PLAIN, 18);font[1] = new Font("Antique Olive Compact", Font.PLAIN, 18); font[2] = new Font("Forte", Font.PLAIN, 18);font[3] = new Font("Wide Latin", Font.PLAIN, 18);font[4] = new Font("Gill Sans Ultra Bold", Font.PLAIN, 18); return font[random.nextInt(5)];}%><%//阻止生成的页面内容被缓存,保证每次重新生成验证码response.setHeader("Pragma", "No-cache");response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0);response.setContentType("image/jpeg");//指定验证码图片的大小int width = 70;int height = 20;//生成一张新图片BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);//在图片中绘制内容Graphics g = image.getGraphics();Random random = new Random();// 设定图像背景色(因为是做背景,所以偏淡)//g.setColor(getRandColor(random, 200, 250));g.fillRect(0, 0, width, height);//设置图形验证码中字符串的字体和大小//g.setFont(new Font("Forte", Font.PLAIN, 20));g.setFont(getFont());//随机产生10条干扰线,使图象中的认证码不易被其它程序探测到for (int i = 0; i < 10; i++) {int y = random.nextInt(height);int y1 = random.nextInt(height);g.setColor(getRandColor(random, 160, 200));g.drawLine(1, y, width, y1);}//该变量用于保存系统生成的随机字符String sRand = "";for (int i = 0; i < 4; i++) {//取得一个随机字符String tmp = getRandChar();sRand += tmp;//将系统生成的随即字符添加到图形验证码图片上g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));g.drawString(tmp, 15 * i + 5, 15);}//取得用户sessionsession.setAttribute("code", sRand);// 图象生效g.dispose();// 输出图象到页面ImageIO.write(image, "JPEG", response.getOutputStream());。
java验证码的实现原理
java验证码的实现原理
Java验证码的实现原理是通过生成随机的字符串或数字,并将其显示在网页、移动应用或其他形式的用户界面上,以验证用户的真实性或防止机器人或自动化程序的恶意访问。
具体实现的步骤如下:
1. 生成随机字符串:使用Java的Random类等随机数生成器,生成指定长度的随机字符串。
可以使用字母、数字或符号组成字符串,根据需要进行自定义。
2. 存储验证码:将生成的验证码字符串存储在服务器端的某个变量或数据结构中,以备后续的验证操作。
3. 图片生成:使用Java的图形库(如AWT、Java 2D或第三
方库),将生成的验证码字符串绘制在图片上。
4. 图片展示:将生成的验证码图片通过HTTP请求返回给用户的浏览器或移动应用,供用户观看和输入。
5. 用户输入:用户通过输入设备(如键盘、鼠标或触摸屏)输入验证码字符串。
6. 验证:服务器端接收到用户输入的验证码字符串后,与之前存储的验证码进行比对。
如果一致,则验证通过;否则,验证失败。
验证码的实现原理主要依赖于服务器端生成随机字符串和图形库进行验证码图片的绘制。
通过将验证码字符串展示给用户,并要求用户输入该字符串,可以验证用户是否为人类或真实用户。
由于验证码每次生成都是随机的,机器人或自动化程序很难猜测或模拟生成验证码,从而有效地防止了恶意访问的行为。
java验证码范围 -回复
java验证码范围-回复Java验证码范围在当今数字化时代,保护用户信息的安全性已成为网站和应用程序开发的重要任务之一。
为了防止机器恶意攻击和自动化注册,开发人员通常会使用验证码来验证用户身份。
Java是一种流行的编程语言,提供了各种开发验证码所需的功能和库。
本文将一步一步介绍Java验证码的范围,包括生成和验证验证码的方法。
第一步:验证码的定义和用途验证码是一种由字母和数字组成的图像,用户被要求输入验证码以证明他们是真实的用户而不是机器人。
验证码通常用于注册页面、登录页面、账号激活、密码重置等环节,以确保用户输入的信息是准确和安全的。
第二步:生成验证码Java提供了一个强大的库——java.awt和javax.imageio来生成验证码图像。
以下是一个简单的示例,用于生成4位数字验证码的方法:javapublic static BufferedImage generateCaptchaImage(String captcha) {int width = 200; 图像的宽度int height = 50; 图像的高度BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics2D g2d = image.createGraphics();设定背景色为白色g2d.setColor(Color.WHITE);g2d.fillRect(0, 0, width, height);设定字体Font font = new Font("Arial", Font.BOLD, 40);g2d.setFont(font);随机生成字体颜色Random random = new Random();int red = random.nextInt(256);int green = random.nextInt(256);int blue = random.nextInt(256);Color randomColor = new Color(red, green, blue);g2d.setColor(randomColor);将验证码绘制到图像上g2d.drawString(captcha, 50, 40);释放资源g2d.dispose();return image;}该方法接收一个由4位数字组成的验证码作为参数,并返回一个包含验证码的BufferedImage对象。
java生成验证码图片的方法
java⽣成验证码图⽚的⽅法本⽂实例为⼤家分享了java⽣成验证码图⽚的具体代码,供⼤家参考,具体内容如下⽰例⼀:import mons.codec.binary.Base64;import ng.RandomStringUtils;import ng.StringUtils;import javax.imageio.ImageIO;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import java.awt.*;import java.awt.image.BufferedImage;import java.io.ByteArrayOutputStream;import java.util.Random;public class RandomVerifyCode {private static final String RANDOM_NUM = "23456789";private static final String RANDOM_LETTER = "ABCDEFGHJKMNPQRSTUVWXYZ";private static final String RANDOM_LETTER_SMALL = "abcdefghjkmnpqrstuvwxyz";private static final String RANDOM_STRING = RANDOM_NUM + RANDOM_LETTER + RANDOM_LETTER_SMALL; private int width = 95;// 图⽚宽private int height = 25;// 图⽚⾼private int lineSize = 40;// ⼲扰线数量private int stringNum = 4;// 随机产⽣字符数量private Random random = new Random();/*** 获得字体*/private Font getFont() {return new Font("Fixedsys", Font.CENTER_BASELINE, 18);}/*** 获得颜⾊*/private Color getRandColor(int fc, int bc) {if (fc > 255)fc = 255;if (bc > 255)bc = 255;int r = fc + random.nextInt(bc - fc - 16);int g = fc + random.nextInt(bc - fc - 14);int b = fc + random.nextInt(bc - fc - 18);return new Color(r, g, b);}/*** ⽣成随机图⽚(BASE64格式)*/public String getRandcode(HttpServletRequest request, StringBuffer imgBuffer) {// BufferedImage类是具有缓冲区的Image类,Image类是⽤于描述图像信息的类BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);Graphics g = image.getGraphics();// 产⽣Image对象的Graphics对象,改对象可以在图像上进⾏各种绘制操作g.fillRect(0, 0, width, height);//图⽚⼤⼩g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));//字体⼤⼩g.setColor(getRandColor(110, 133));//字体颜⾊// 绘制⼲扰线for (int i = 0; i <= lineSize; i++) {drowLine(g);}// 绘制随机字符String randomString = "";for (int i = 1; i <= stringNum; i++) {randomString = drowString(g, randomString, i);}g.dispose();ByteArrayOutputStream out = new ByteArrayOutputStream();String encode = null;try {// 将内存中的图⽚通过流动形式输出到客户端ImageIO.write(image, "JPEG", out);encode = "data:image/jpeg;base64,"+Base64.encodeBase64String(out.toByteArray());out.close();} catch (Exception e) {LogHelper.error("登陆控制","验证码⽣成","将内存中⽣成的验证码图⽚输出为BASE64格式编码失败!"); }imgBuffer.append(encode);return randomString;}/*** 绘制字符串*/private String drowString(Graphics g, String randomString, int i) {g.setFont(getFont());g.setColor(new Color(random.nextInt(101), random.nextInt(111), random.nextInt(121)));String rand = String.valueOf(getRandomString(random.nextInt(RANDOM_STRING.length())));randomString += rand;g.translate(random.nextInt(3), random.nextInt(3));g.drawString(rand, 13 * i, 16);return randomString;}/*** 绘制⼲扰线*/private void drowLine(Graphics g) {int x = random.nextInt(width);int y = random.nextInt(height);int xl = random.nextInt(13);int yl = random.nextInt(15);g.drawLine(x, y, x + xl, y + yl);}/*** 获取随机的字符*/public String getRandomString(int num) {return String.valueOf(RANDOM_STRING.charAt(num));}public static String randomString(int length){return RandomStringUtils.random(length, RANDOM_STRING.toCharArray());}}⽰例⼆:import javax.imageio.ImageIO;import java.awt.*;import java.awt.image.BufferedImage;import java.awt.image.RenderedImage;import java.io.FileOutputStream;import java.io.OutputStream;import java.util.HashMap;import java.util.Map;import java.util.Random;public class CodeUtil {private static int width = 90;// 定义图⽚的width 90private static int height = 20;// 定义图⽚的height 20private static int codeCount = 4;// 定义图⽚上显⽰验证码的个数private static int xx = 15;private static int fontHeight = 18;private static int codeY = 16;private static char[] codeSequence = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '2', '3', '4', '5', '6', '7', '8', '9'};public static Map<String,RenderedImage> codePicMap = new HashMap<>();/*** ⽣成⼀个map集合* code为⽣成的验证码* codePic为⽣成的验证码BufferedImage对象** @return*/public static Map<String, Object> generateCodeAndPic() {// 定义图像bufferBufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // Graphics2D gd = buffImg.createGraphics();// Graphics2D gd = (Graphics2D) buffImg.getGraphics();Graphics gd = buffImg.getGraphics();// 创建⼀个随机数⽣成器类Random random = new Random();// 将图像填充为蓝⾊// gd.setColor(Color.WHITE);gd.setColor(new Color(232,240,254));gd.fillRect(0, 0, width, height);// 创建字体,字体的⼤⼩应该根据图⽚的⾼度来定。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java图形验证码.txt43风帆,不挂在桅杆上,是一块无用的布;桅杆,不挂上风帆,是一根平常的柱;理想,不付诸行动是虚无缥缈的雾;行动,而没有理想,是徒走没有尽头的路。
44成功的门往往虚掩着,只要你勇敢去推,它就会豁然洞开。
思路:图片验证码的实现主要的技术点是如何生成一个图片。
生成图片可以使用java.awt包下的类来实现。
我们先写一个简单的生成图片的程序HelloImage.java。
以下是代码部分。
package com.vogoal.test;import java.awt.Color;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import javax.imageio.ImageIO;/*** @author SinNeR@* create a image*/public class HelloImage {public static void main(String[] args){BufferedImage image = new BufferedImage(80, 25,BufferedImage.TYPE_INT_RGB);Graphics g = image.getGraphics();g.setColor(new Color(255,255,255));g.fillRect(0, 0, 80, 25);g.setColor(new Color(0,0,0));g.drawString("HelloImage",6,16);g.dispose();try{ImageIO.write(image, "jpeg", new File("C:\\helloImage.jpeg"));}catch(IOException e){e.printStackTrace();}}}编译后,在DOS下调用这个程序,正常情况下,会在C盘根目录下生成一张名字helloImage.jpeg为的图片。
图片上有文字HelloImage。
简单介绍下生成图片的流程:建立BufferedImage对象。
指定图片的长度宽度和色彩。
BufferedImage image = new BufferedImage(80,25,BufferedImage.TYPE_INT_RGB);取得Graphics对象,用来绘制图片。
Graphics g = image.getGraphics();绘制图片背景和文字。
释放Graphics对象所占用的资源。
g.dispose();通过ImageIO对象的write静态方法将图片输出。
ImageIO.write(image, "jpeg", new File("C:\\helloImage.jpeg"));知道了图片的生成方法,剩下的问题就是如何将随机数生成到页面上了。
要显示图片,我们只要将生成的图片流返回给response对象,这样用户请求的时候就可以得到图片。
而一个jsp页面的page参数的contentType属性可以指定返回的response对象的形式,我们平时的jsp页面中设定的contentType是text/html,所以会被以HTML文件的形式读取分析。
如果设定为image/jpeg,就会被以图片的形式读取分析。
确定了这点后就可以着手实现。
修改生成图片的类,添加生成随机字符串的方法,并取得用户传过来的response对象将图片流输出到response对象中。
同时为了更友好和可订制,添加了一个构造函数,可以修改图片验证码的长度,以及验证码的码字范围。
并且可以设定验证码的背景色。
(用户使用时可以设定验证图片的背景色与页面的背景色相同)写一个jsp文件,用来调用生成验证码图片的类。
并得到生成的验证码,存入session。
以下是生成验证码图片的类RandImgCreater。
(操作系统的原因,没有写注释,避免乱码)package com.vogoal.util.img;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.IOException;import java.util.Random;import javax.imageio.ImageIO;import javax.servlet.http.HttpServletResponse;/*** @author SinNeR* * image check creater*/public class RandImgCreater {private static final String CODE_LIST = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";private HttpServletResponse response = null;private static final int HEIGHT = 20;private static final int FONT_NUM = 4;private int width = 0;private int iNum = 0;private String codeList = "";private boolean drawBgFlag = false;private int rBg = 0;private int gBg = 0;private int bBg = 0;public RandImgCreater(HttpServletResponse response) {this.response = response;this.width = 13 * FONT_NUM + 12;this.iNum = FONT_NUM;this.codeList = CODE_LIST;}public RandImgCreater(HttpServletResponse response,int iNum,String codeList) { this.response = response;this.width = 13 * iNum + 12;this.iNum = iNum;this.codeList = codeList;}public String createRandImage(){BufferedImage image = new BufferedImage(width, HEIGHT,BufferedImage.TYPE_INT_RGB);Graphics g = image.getGraphics();Random random = new Random();if ( drawBgFlag ){g.setColor(new Color(rBg,gBg,bBg));g.fillRect(0, 0, width, HEIGHT);}else{g.setColor(getRandColor(200, 250));g.fillRect(0, 0, width, HEIGHT);for (int i = 0; i < 155; i++) {g.setColor(getRandColor(140, 200));int x = random.nextInt(width);int y = random.nextInt(HEIGHT);int xl = random.nextInt(12);int yl = random.nextInt(12);g.drawLine(x, y, x + xl, y + yl);}}g.setFont(new Font("Times New Roman", Font.PLAIN, 18));String sRand="";for (int i=0;i<iNum;i++){int rand=random.nextInt(codeList.length());String strRand=codeList.substring(rand,rand+1);sRand+=strRand;g.setColor(newColor(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));g.drawString(strRand,13*i+6,16);}g.dispose();try{ImageIO.write(image, "JPEG", response.getOutputStream());}catch(IOException e){}return sRand;}public void setBgColor(int r,int g,int b){drawBgFlag = true;this.rBg = r;this.gBg = g;this.bBg = b;}private Color getRandColor(int fc, int bc) {Random random = new Random();if (fc > 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);}}以下是调用生成验证码图片的类的jsp文件:<%@ page contentType="image/jpeg" import="com.vogoal.util.img.*" %><%response.setHeader("Pragma","No-cache");response.setHeader("Cache-Control","no-cache");response.setDateHeader("Expires", 0);RandImgCreater rc = new RandImgCreater(response);//RandImgCreater rc = new RandImgCreater(response,8,"abcdef");//rc.setBgColor(100,100,100);String rand = rc.createRandImage();session.setAttribute("rand",rand);%>将java程序编译后得到的class,放到Tomcat自己的web应用的class的目录下,并写一个测试程序。