原文转载自: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生成随机验证码, 这是一个demo, eclipse项目,导入eclipse即可
本文档讲述了如何使用java来随机的生成验证码
java后台生成背景色透明验证码的方法,可直接调用。本方法只生成随机字符数字组成的四位验证码。
是一个完整的例子!生成的验证码有中文的,英文的,数字的
自己写的验证码,不仅能够实现加干扰条,还能实现字符倾斜,是数字和字母的混合
java验证码生成,数字+字母 史上最牛逼的验证码,很好用的,不信试试。
csdn上三种java验证码生成方法,以及谷歌开源验证码,总共四种验证码生成集合。将生成的四个验证图片放在一个页面上以供比对,全部可以运行。 四种方法分别为: 1. 数字、字母、汉字混合验证码,叠影(给力)、扭曲 ...
JSP生成数字验证码程序例子
为了防止某些用户使用软件进行登录和发布信息,很多网站在用户登录或者发布信息时,都要求用户输入验证码。验证码通常是以一幅图片的形式显示的,用户按照图片中显示的数字或者字母依次输入,服务端将对用户输入和...
java生成四位随机数,包含数字和字母 区分大小写,特别适合做验证码,android开发
demo导入eclipse直接可用,中文并有算数运算,并且可验证用户输入值,还有详细说明文档,简单易懂
验证码的作用:有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上是用验证码是现在很多网站通行的方式(比如招商银行的网上个人银行,腾讯的QQ社区),我们利用比较简易的方式...
用Java写了一个4位(可多位)验证码生成器,封装在一个类里,只需调用一个方法,写入生成图片的类型和生成图片路径,可直接生成验证码,并返回验证码信息。 最简单的使用方法:解压包后,进入captcha文件夹,双击...
jsp常用经典代码(md5java实现,生成中文/数字验证码,解决中文乱码) 自己平时收集的好资料和大家一起分享!!
在我们项目中间经常会用到验证码...这是一个生成验证码的例子,直接可以用在项目中...生成带条纹的含有字母和数字的随机验证码!
用java编写的四位随机的验证码,包括数字跟字母 简单易懂
纯Java生成验证码图片工具类。使用时直接解压,将工具类导入Java项目即可,直接调用生成验证码方法即可。
主要介绍了java 随机生成6位短信验证码的实例代码,文中给大家扩展介绍了java随机生成四位数字验证码的方法,需要的朋友可以参考下
主要介绍了Java 生成图片验证码3种方法(字母、加减乘除、中文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧