原文转载自:http://747017186.iteye.com/blog/2275867
转载内容:
1、验证码生成的基础类:
package com.hljw.health.plat.action.portalpage; import java.awt.Color; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.util.Random; /** * 验证码图片生成器 * * @author huangjunhua * */ public class IdentifyingCode { /** * 验证码图片的宽度。 */ private int width = 80; /** * 验证码图片的高度。 */ private int height = 40; /** * 验证码的数量。 */ private Random random = new Random(); public IdentifyingCode(){} /** * 生成随机颜色 * @param fc 前景色 * @param bc 背景色 * @return Color对象,此Color对象是RGB形式的。 */ public Color getRandomColor(int fc, int bc) { if (fc > 255) fc = 200; 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); } /** * 绘制干扰线 * @param g Graphics2D对象,用来绘制图像 * @param nums 干扰线的条数 */ public void drawRandomLines(Graphics2D g ,int nums ){ g.setColor(this.getRandomColor(160, 200)) ; for(int i=0 ; i<nums ; i++){ int x1 = random.nextInt(width) ; int y1 = random.nextInt(height); int x2 = random.nextInt(12) ; int y2 = random.nextInt(12) ; g.drawLine(x1, y1, x2, y2) ; } } /** * 获取随机字符串, * 此函数可以产生由大小写字母,汉字,数字组成的字符串 * @param length 随机字符串的长度 * @return 随机字符串 */ public String drawRandomString(int length , Graphics2D g){ StringBuffer strbuf = new StringBuffer() ; String temp = "" ; int itmp = 0 ; for(int i=0 ; i<length ; i++){ switch(random.nextInt(5)){ case 1: //生成A~Z的字母 itmp = random.nextInt(26) + 65 ; temp = String.valueOf((char)itmp); break; case 2: //生成数字 itmp = random.nextInt(26) + 97 ; temp = String.valueOf((char)itmp); // case 3: //生成汉字 // String[] rBase = {"0" , "1" , "2" , "3" , "4" , "5" , "6" , "7" , // "8" , "9" , "a" , "b" , "c" , "d" , "e" , "f" }; // int r1 = random.nextInt(3)+11 ; //生成第1位的区码 // String strR1 = rBase[r1] ; //生成11~14的随机数 // int r2 ; //生成第2位的区码 // if(r1 == 13) // r2 = random.nextInt(7) ; //生成0~7的随机数 // else // r2 = random.nextInt(16) ; //生成0~16的随机数 // String strR2 = rBase[r2] ; // int r3 = random.nextInt(6) + 10 ; //生成第1位的位码 // String strR3 = rBase[r3] ; // int r4 ; //生成第2位的位码 // if(r3 == 10) // r4 = random.nextInt(15) + 1; //生成1~16的随机数 // else if(r3 == 15) // r4 = random.nextInt(15) ; //生成0~15的随机数 // else // r4 = random.nextInt(16) ; //生成0~16的随机数 // String strR4 = rBase[r4] ; // //将生成的机内码转换成数字 // byte[] bytes = new byte[2] ; // String strR12 = strR1 + strR2 ; //将生成的区码保存到字节数组的第1个元素中 // int tempLow = Integer.parseInt(strR12, 16) ; // bytes[0] = (byte)tempLow; // String strR34 = strR3 + strR4 ; //将生成的区码保存到字节数组的第2个元素中 // int tempHigh = Integer.parseInt(strR34, 16) ; // bytes[1] = (byte)tempHigh; // temp = new String(bytes); //根据字节数组生成汉字 // break; default: itmp = random.nextInt(10) + 48 ; temp = String.valueOf((char)itmp) ; break; } Color color = new Color(20+random.nextInt(20) , 20+random.nextInt(20) ,20+random.nextInt(20) ); g.setColor(color) ; //想文字旋转一定的角度 AffineTransform trans = new AffineTransform(); trans.rotate(random.nextInt(45)*3.14/180, 15*i+8, 7) ; //缩放文字 float scaleSize = random.nextFloat() + 0.8f ; if(scaleSize>1f) scaleSize = 1f ; trans.scale(scaleSize, scaleSize) ; g.setTransform(trans) ; g.drawString(temp, 15*i+18, 30) ;//字体出现的坐标 strbuf.append(temp) ; } g.dispose() ; return strbuf.toString() ; } public int getWidth() { return width; } public void setWidth(int width) { this.width = width; } public int getHeight() { return height; } public void setHeight(int height) { this.height = height; } }
2、 专门负责在页面请求生成验证码图片的servlet:
package com.hljw.health.plat.action.portalpage; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @SuppressWarnings("serial") public class PictureCheckCode extends HttpServlet { public PictureCheckCode() { super(); } public void init() throws ServletException { super.init() ; } public void destroy() { super.destroy(); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response) ; } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置不缓存图片 response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "No-cache"); response.setDateHeader("Expires", 0) ; //指定生成的相应图片 response.setContentType("image/jpeg") ; IdentifyingCode idCode = new IdentifyingCode(); BufferedImage image =new BufferedImage(idCode.getWidth() , idCode.getHeight() , BufferedImage.TYPE_INT_BGR) ; Graphics2D g = image.createGraphics() ; //定义字体样式 Font myFont = new Font("黑体" , Font.BOLD , 25) ; //设置字体 g.setFont(myFont) ; g.setColor(idCode.getRandomColor(200 , 250)) ; //绘制背景 g.fillRect(0, 0, idCode.getWidth() , idCode.getHeight()) ; g.setColor(idCode.getRandomColor(180, 200)) ; idCode.drawRandomLines(g, 160) ; String verifyCode=idCode.drawRandomString(4, g) ; System.out.println("**************"+verifyCode); request.getSession().setAttribute("verifyCode", verifyCode);//把验证码保存到session当中 g.dispose() ; ImageIO.write(image, "JPEG", response.getOutputStream()) ; } }
3、web.xml文件的配置:
<!-- 图像验证码的servlet --> <servlet> <servlet-name>PictureCheckCode</servlet-name> <servlet-class>com.hljw.health.plat.action.portalpage.PictureCheckCode</servlet-class> </servlet> <servlet-mapping> <servlet-name>PictureCheckCode</servlet-name> <url-pattern>/PictureCheckCode.action</url-pattern> </servlet-mapping>
4、JSP页面请求:
页面结构:
<input type="text" name="identifyingCode" id="identifyingCode"/> <img width="80" height="40" border="0" id="JS_captcha" onclick="reflushVerify();"/>
JS:
$(function(){ reflushVerify();//加载验证码 }); //刷新验证码 function reflushVerify(){ var imgsrc="PictureCheckCode?random="+Math.random();//验证码加上随机刷新可以得到不同的验证码,如果不加则验证码不会变化,这一点非常重要,实现局部刷新 $("#JS_captcha").attr("src",imgsrc); }
相关推荐
首先,我们来看标题"java生成图片验证码"。这个标题暗示我们将探讨的是在Java环境中生成随机的、可读性较差的文本,并将其转化为图像的过程,以创建一个验证码。验证码通常由字母、数字或两者混合组成,设计的目的...
Java生成算数运算中文图片验证码的实现,结合了编程语言、图像处理和安全验证的多种技术,为用户提供了一种既安全又友好的验证方式。下面我们将深入探讨这个主题。 首先,验证码的核心是生成随机的算数运算表达式。...
随机验证码。 - 随机生成十组六位字符组成的验证码。 - 验证码由大小写字母、数字字符组成。
java生成随机验证码, 这是一个demo, eclipse项目,导入eclipse即可
在IT领域,验证码(CAPTCHA)是一...在提供的压缩包文件“图片验证码生成”中,可能包含了实现上述功能的源代码示例,你可以通过学习和理解这些代码,加深对Java生成图片验证码的理解,并根据实际需求进行调整和优化。
本参考资料主要围绕Java生成中英文验证码展开,旨在帮助开发者理解并实现验证码功能。 首先,验证码的生成通常涉及到以下几个关键步骤: 1. **随机字符生成**:验证码由一组随机字符组成,可以是数字、字母,也...
- **绘制图像**:使用Java的`Graphics2D`类在内存中创建一个新的GIF图像,并在其上绘制验证码字符串。可以调整字体、颜色、角度等属性增加难度。 - **添加干扰元素**:为了提高安全性,通常会添加一些随机的线条、...
验证码(CAPTCHA)是一种用于验证用户是否为人类的自动化测试技术。...以上就是使用Java生成验证码的基本流程和关键知识点。通过调整各种参数和细节,可以根据实际需求定制出更复杂、更难被机器识别的验证码系统。
这个"java生成验证码demo"提供了生成自定义验证码图片的方法,包括设置图片尺寸、验证码长度,以及添加各种视觉混淆元素,以增加机器识别的难度。 首先,我们要理解验证码的基本原理。它通常由一组随机生成的字母或...
### 使用Java生成随机数字和验证码 #### 1. 导入必要包 在文件的部分内容中,可以看到以下导入语句: ```java import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; ...
验证码是网络应用中常见的一种安全机制,用于防止自动...总的来说,Java生成随机验证码的过程涵盖了随机数生成、字符串处理、图像处理等多个编程领域。通过合理的设计和实现,可以创建出既安全又用户友好的验证码系统。
本话题主要关注如何使用Java生成包含随机加减法问题的图形验证码。这种验证码不仅增加了安全性,还为用户提供了验证他们是否为人类的互动方式。 首先,`IdentifyingCode.java`可能是一个类,它代表验证码对象,包含...
2. **生成图像**:使用Java的`java.awt`和`javax.imageio`包来创建和操作图像。创建一个新的`BufferedImage`对象,然后在画布上绘制随机颜色的背景。接着,用随机角度和位置绘制验证码字符串,可能还会添加一些噪声...
1. **随机生成字符串**:使用`Random`类生成一个随机的字符串,通常包含4到6个字符。可以限制字符集为大小写字母和数字。例如: ```java String characters = ...
Java生成图像验证码涉及到以下几个关键知识点: 1. **随机数生成**:验证码通常由一组随机生成的字符组成,可以是数字、字母或者是两者的混合。Java中的`Random`类可以用于生成随机数,然后结合字符集(如ASCII或...
3. 创建验证码:在需要生成验证码的控制器方法中,使用JCaptcha的API创建并返回验证码图像。 4. 存储验证码:将生成的验证码字符串存储在session或cookie中,以便后续验证。 5. 验证用户输入:在用户提交表单时,...
在这个"JSP生成数字验证码程序例子"中,我们将探讨如何利用JSP来生成一种常见的安全机制——数字验证码。 验证码的主要目的是防止自动化程序(如机器人或爬虫)进行非法操作,比如注册、登录或提交表单。它们通常...
1. 生成随机验证码:使用随机数生成器生成随机验证码,例如使用 Java 的 `Random` 类。 2. 创建图像:使用 Java 的 `BufferedImage` 类创建一个图像,用于显示验证码。 3. 画图:使用 Java 的 `Graphics` 类在图像上...
本文将详细介绍如何使用Java生成图片验证码,并将其应用于前端页面,以及如何进行验证码的校验。 #### 二、关键类与方法 1. **`HttpServlet`**: - `HttpServlet`是Servlet的一个抽象基类,提供了处理HTTP请求的...