java实现限制验证码次数登录

package com.spring.controller;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class VerifyCodeServlet extends HttpServlet {
// 验证码图片的宽度。
private int width = 60;
// 验证码图片的高度。
private int height = 20;
// 验证码字符个数
private int codeCount = 4;
private int x = 0;
// 字体高度
private int fontHeight;
private int codeY;
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' };

⑵ spring框架的java登录验证码怎么写

可以参考下下面的代码,这个代码是servlet生成的,稍微修改下就能用的

packageservlet;

importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.image.BufferedImage;
importjava.io.IOException;
importjava.io.OutputStream;
importjava.util.Random;

importjavax.imageio.ImageIO;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjavax.servlet.http.HttpSession;

{

publicvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{

BufferedImageimage=newBufferedImage(100,30,BufferedImage.TYPE_INT_RGB);
Graphicsg=image.getGraphics();
Randomr=newRandom();
g.setColor(newColor(r.nextInt(255),r.nextInt(255),r.nextInt(255)));
g.fillRect(0,0,100,30);
g.setColor(newColor(255,255,255));
g.setFont(newFont(null,Font.BOLD,24));
Stringcode=getCode();
HttpSessionsession=request.getSession();
session.setAttribute("textcode",code);

g.drawString(code,10,25);
response.setContentType("image/jpeg");
OutputStreamos=response.getOutputStream();
ImageIO.write(image,"jpeg",os);
os.close();
}
//随机生成验证码字符串的类
publicstaticStringgetCode(){
char[]letters={'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'};
Stringcode="";
boolean[]bool=newboolean[letters.length];

for(inti=0;i<5;i++){
intnum;
do{
num=(int)(Math.random()*(letters.length));
}while(bool[num]);
code+=letters[num];
bool[num]=true;
}
returncode.toUpperCase();
}

}

⑶ 怎样用java实现验证码

package com.servlet;

import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.io.*;
import java.util.*;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.imageio.ImageIO;

public class PictureCheckCode extends HttpServlet {

private static final long serialVersionUID = 1L;

public PictureCheckCode() {
super();
}

public void destroy() {
super.destroy();
}

public void init() throws ServletException {
super.init();
}
/*该方法主要作用是获得随机生成的颜色*/
public Color getRandColor(int s,int e){
Random random=new Random ();
if(s>255) s=255;
if(e>255) e=255;
int r,g,b;
r=s+random.nextInt(e-s); //随机生成RGB颜色中的r值
g=s+random.nextInt(e-s); //随机生成RGB颜色中的g值
b=s+random.nextInt(e-s); //随机生成RGB颜色中的b值
return new Color(r,g,b);
}

@Override
public void service(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");
int width=86,height=22; //指定生成验证码的宽度和高度
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //创建BufferedImage对象,其作用相当于一图片
Graphics g=image.getGraphics(); //创建Graphics对象,其作用相当于画笔
Graphics2D g2d=(Graphics2D)g; //创建Grapchics2D对象
Random random=new Random();
Font mfont=new Font("楷体",Font.BOLD,16); //定义字体样式
g.setColor(getRandColor(200,250));
g.fillRect(0, 0, width, height); //绘制背景
g.setFont(mfont); //设置字体
g.setColor(getRandColor(180,200));

//绘制100条颜色和位置全部为随机产生的线条,该线条为2f
for(int i=0;i<100;i++){
int x=random.nextInt(width-1);
int y=random.nextInt(height-1);
int x1=random.nextInt(6)+1;
int y1=random.nextInt(12)+1;
BasicStroke bs=new BasicStroke(2f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); //定制线条样式
Line2D line=new Line2D.Double(x,y,x+x1,y+y1);
g2d.setStroke(bs);
g2d.draw(line); //绘制直线
}
//输出由英文,数字,和中文随机组成的验证文字,具体的组合方式根据生成随机数确定。
String sRand="";
String ctmp="";
int itmp=0;
//制定输出的验证码为四位
for(int i=0;i<4;i++){
switch(random.nextInt(3)){
case 1: //生成A-Z的字母
itmp=random.nextInt(26)+65;
ctmp=String.valueOf((char)itmp);
break;
case 2: //生成汉字
String[] rBase={"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};
//生成第一位区码
int r1=random.nextInt(3)+11;
String str_r1=rBase[r1];
//生成第二位区码
int r2;
if(r1==13){
r2=random.nextInt(7);
}else{
r2=random.nextInt(16);
}
String str_r2=rBase[r2];
//生成第一位位码
int r3=random.nextInt(6)+10;
String str_r3=rBase[r3];
//生成第二位位码
int r4;
if(r3==10){
r4=random.nextInt(15)+1;
}else if(r3==15){
r4=random.nextInt(15);
}else{
r4=random.nextInt(16);
}
String str_r4=rBase[r4];
//将生成的机内码转换为汉字
byte[] bytes=new byte[2];
//将生成的区码保存到字节数组的第一个元素中
String str_12=str_r1+str_r2;
int tempLow=Integer.parseInt(str_12, 16);
bytes[0]=(byte) tempLow;
//将生成的位码保存到字节数组的第二个元素中
String str_34=str_r3+str_r4;
int tempHigh=Integer.parseInt(str_34, 16);
bytes[1]=(byte)tempHigh;
ctmp=new String(bytes);
break;
default:
itmp=random.nextInt(10)+48;
ctmp=String.valueOf((char)itmp);
break;
}
sRand+=ctmp;
Color color=new Color(20+random.nextInt(110),20+random.nextInt(110),random.nextInt(110));
g.setColor(color);
//将生成的随机数进行随机缩放并旋转制定角度 PS.建议不要对文字进行缩放与旋转,因为这样图片可能不正常显示
/*将文字旋转制定角度*/
Graphics2D g2d_word=(Graphics2D)g;
AffineTransform trans=new AffineTransform();
trans.rotate((45)*3.14/180,15*i+8,7);
/*缩放文字*/
float scaleSize=random.nextFloat()+0.8f;
if(scaleSize>1f) scaleSize=1f;
trans.scale(scaleSize, scaleSize);
g2d_word.setTransform(trans);
g.drawString(ctmp, 15*i+18, 14);
}
HttpSession session=request.getSession(true);
session.setAttribute("randCheckCode", sRand);
g.dispose(); //释放g所占用的系统资源
ImageIO.write(image,"JPEG",response.getOutputStream()); //输出图片
}
}

⑷ java如何破解验证码实现登陆

登入好破解,无非是生成一个cookie,验证码的破解就麻烦了,一两句话肯定是解释不了的,不过有识别验证码的软件,有些识别率还是挺高的

⑸ Java短信验证码功能怎么实现

实现jiava短信验证码可以按下面的步奏进行:
1、首先,找到一个支持Java语言的接口短信平台。
2、接着下载接口文档,和自己的开发平台进行对接。
3、注意在对接之前测试一下短信的速度,一旦对接好想换就比较麻烦,之前就吃过这个亏,最后有个朋友介绍我去短信网。
4、如果要购买的话,一定要多测试几家。
如果在碰到有疑问的地方一定要和技术或者客服多多沟通。

⑹ 验证码怎么用java代码实现验证

package util; import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.util.Random;import javax.imageio.ImageIO; public final class ImageUtil { // 验证码字符集 private static final char[] chars = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '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', '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'}; // 字符数量 private static final int SIZE = 4; // 干扰线数量 private static final int LINES = 5; // 宽度 private static final int WIDTH = 80; // 高度 private static final int HEIGHT = 40; // 字体大小 private static final int FONT_SIZE = 30; /** * 生成随机验证码及图片 * 返回的数组中,第1个值是验证码,第2个值是图片 */ public static Object[] createImage() { StringBuffer sb = new StringBuffer(); // 1.创建空白图片 BufferedImage image = new BufferedImage( WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); // 2.获取图片画笔 Graphics graphic = image.getGraphics(); // 3.设置画笔颜色 graphic.setColor(Color.LIGHT_GRAY); // 4.绘制矩形背景 graphic.fillRect(0, 0, WIDTH, HEIGHT); // 5.画随机字符 Random ran = new Random(); for (int i = 0; i <SIZE; i++) { // 取随机字符索引 int n = ran.nextInt(chars.length); // 设置随机颜色 graphic.setColor(getRandomColor()); // 设置字体大小 graphic.setFont(new Font( null, Font.BOLD + Font.ITALIC, FONT_SIZE)); // 画字符 graphic.drawString( chars[n] + "", i * WIDTH / SIZE, HEIGHT / 2); // 记录字符 sb.append(chars[n]); } // 6.画干扰线 for (int i = 0; i < LINES; i++) { // 设置随机颜色 graphic.setColor(getRandomColor()); // 随机画线 graphic.drawLine(ran.nextInt(WIDTH), ran.nextInt(HEIGHT), ran.nextInt(WIDTH), ran.nextInt(HEIGHT)); } // 7.返回验证码和图片 return new Object[]{sb.toString(), image}; } /** * 随机取色 */ public static Color getRandomColor() { Random ran = new Random(); Color color = new Color(ran.nextInt(256), ran.nextInt(256), ran.nextInt(256)); return color; } public static void main(String[] args) throws IOException { Object[] objs = createImage(); BufferedImage image = (BufferedImage) objs[1]; OutputStream os = new FileOutputStream("d:/1.png"); ImageIO.write(image, "jpeg", os); os.close(); } }

⑺ 怎么用java实现验证码

1、网上有JS插件啊,这个用java实现的话还是比较麻烦哦,需要java调用画图。我有一个内写好的容例子,是java和servlet做的。

2、亲们,这个验证码我做了很久才弄出来的,希望大家别介意我收费哦!

⑻ Java如何实现验证码验证功能

Java如何实现验证码验证功能呢?日常生活中,验证码随处可见,他可以在一定程度上保护账号安全,那么他是怎么实现的呢?

Java实现验证码验证功能其实非常简单:用到了一个Graphics类在画板上绘制字母,随机选取一定数量的字母随机生成,然后在画板上随机生成几条干扰线。

首先,写一个验证码生成帮助类,用来绘制随机字母:

  • importjava.awt.Color;

  • importjava.awt.Font;

  • importjava.awt.Graphics;

  • importjava.awt.image.BufferedImage;

  • importjava.io.IOException;

  • importjava.io.OutputStream;

  • importjava.util.Random;

  • importjavax.imageio.ImageIO;

  • publicfinalclassGraphicHelper{

  • /**

  • *以字符串形式返回生成的验证码,同时输出一个图片

  • *

  • *@paramwidth

  • *图片的宽度

  • *@paramheight

  • *图片的高度

  • *@paramimgType

  • *图片的类型

  • *@paramoutput

  • *图片的输出流(图片将输出到这个流中)

  • *@return返回所生成的验证码(字符串)

  • */

  • publicstaticStringcreate(finalintwidth,finalintheight,finalStringimgType,OutputStreamoutput){

  • StringBuffersb=newStringBuffer();

  • Randomrandom=newRandom();

  • BufferedImageimage=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);

  • Graphicsgraphic=image.getGraphics();

  • graphic.setColor(Color.getColor("F8F8F8"));

  • graphic.fillRect(0,0,width,height);

  • Color[]colors=newColor[]{Color.BLUE,Color.GRAY,Color.GREEN,Color.RED,Color.BLACK,Color.ORANGE,

  • Color.CYAN};

  • //在"画板"上生成干扰线条(50是线条个数)

  • for(inti=0;i<50;i++){

  • graphic.setColor(colors[random.nextInt(colors.length)]);

  • finalintx=random.nextInt(width);

  • finalinty=random.nextInt(height);

  • finalintw=random.nextInt(20);

  • finalinth=random.nextInt(20);

  • finalintsignA=random.nextBoolean()?1:-1;

  • finalintsignB=random.nextBoolean()?1:-1;

  • graphic.drawLine(x,y,x+w*signA,y+h*signB);

  • }

  • //在"画板"上绘制字母

  • graphic.setFont(newFont("ComicSansMS",Font.BOLD,30));

  • for(inti=0;i<6;i++){

  • finalinttemp=random.nextInt(26)+97;

  • Strings=String.valueOf((char)temp);

  • sb.append(s);

  • graphic.setColor(colors[random.nextInt(colors.length)]);

  • graphic.drawString(s,i*(width/6),height-(height/3));

  • }

  • graphic.dispose();

  • try{

  • ImageIO.write(image,imgType,output);

  • }catch(IOExceptione){

  • e.printStackTrace();

  • }

  • returnsb.toString();

  • }

  • }

接着,创建一个servlet,用来固定图片大小,以及处理验证码的使用场景,以及捕获页面生成的验证码(捕获到的二维码与用户输入的验证码一致才能通过)。

  • importjava.io.OutputStream;

  • importjavax.servlet.ServletException;

  • importjavax.servlet.annotation.WebServlet;

  • importjavax.servlet.http.HttpServlet;

  • importjavax.servlet.http.HttpServletRequest;

  • importjavax.servlet.http.HttpServletResponse;

  • importjavax.servlet.http.HttpSession;

  • @WebServlet(urlPatterns="/verify/regist.do")

  • {

  • =3398560501558431737L;

  • @Override

  • protectedvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)

  • throwsServletException,IOException{

  • //获得当前请求对应的会话对象

  • HttpSessionsession=request.getSession();

  • //从请求中获得URI(统一资源标识符)

  • Stringuri=request.getRequestURI();

  • System.out.println("hello:"+uri);

  • finalintwidth=180;//图片宽度

  • finalintheight=40;//图片高度

  • finalStringimgType="jpeg";//指定图片格式(不是指MIME类型)

  • finalOutputStreamoutput=response.getOutputStream();//获得可以向客户端返回图片的输出流

  • //(字节流)

  • //创建验证码图片并返回图片上的字符串

  • Stringcode=GraphicHelper.create(width,height,imgType,output);

  • System.out.println("验证码内容:"+code);

  • //建立uri和相应的验证码的关联(存储到当前会话对象的属性中)

  • session.setAttribute(uri,code);

  • System.out.println(session.getAttribute(uri));

  • }

  • }

接着写一个html注册页面用来检验一下:

  • <html>

  • <head>

  • <metacharset="UTF-8">

  • <title>注册</title>

  • <linkrel="stylesheet"href="styles/general.css">

  • <linkrel="stylesheet"href="styles/cell.css">

  • <linkrel="stylesheet"href="styles/form.css">

  • <scripttype="text/javascript"src="js/ref.js"></script>

  • <styletype="text/css">

  • .logo-container{

  • margin-top:50px;

  • }

  • .logo-containerimg{

  • width:100px;

  • }

  • .message-container{

  • height:80px;

  • }

  • .link-container{

  • height:40px;

  • line-height:40px;

  • }

  • .link-containera{

  • text-decoration:none;

  • }

  • </style>

  • </head>

  • <body>

  • <divclass="containerform-container">

  • <formaction="/wen/regist.do"method="post">

  • <divclass="form"><!--注册表单开始-->

  • <divclass="form-row">

  • <spanclass="cell-1">

  • <iclass="fafa-user"></i>

  • </span>

  • <spanclass="cell-11"style="text-align:left;">

  • <inputtype="text"name="username"placeholder="请输入用户名">

  • </span>

  • </div>

  • <divclass="form-row">

  • <spanclass="cell-1">

  • <iclass="fafa-key"></i>

  • </span>

  • <spanclass="cell-11"style="text-align:left;">

  • <inputtype="password"name="password"placeholder="请输入密码">

  • </span>

  • </div>

  • <divclass="form-row">

  • <spanclass="cell-1">

  • <iclass="fafa-keyboard-o"></i>

  • </span>

  • <spanclass="cell-11"style="text-align:left;">

  • <inputtype="password"name="confirm"placeholder="请确认密码">

  • </span>

  • </div>

  • <divclass="form-row">

  • <spanclass="cell-7">

  • <inputtype="text"name="verifyCode"placeholder="请输入验证码">

  • </span>

  • <spanclass="cell-5"style="text-align:center;">

  • <imgsrc="/demo/verify/regist.do"onclick="myRefersh(this)">

  • </span>

  • </div>

  • <divclass="form-row"style="border:none;">

  • <spanclass="cell-6"style="text-align:left">

  • <inputtype="reset"value="重置">

  • </span>

  • <spanclass="cell-6"style="text-align:right;">

  • <inputtype="submit"value="注册">

  • </span>

  • </div>

  • </div><!--注册表单结束-->

  • </form>

  • </div>

  • </body>

  • </html>

效果如下图:



当点击刷新页面的时候,验证码也会随着变化,但我们看不清验证码时,只要点击验证码就会刷新,这样局部的刷新可以用JavaScript来实现。

在<img
src="/demo/verify/regist.do">中,添加一个问号和一串后缀数字,当刷新时让后缀数字不断改变,那么形成的验证码也会不断变化,我们可以采用的一种办法是后缀数字用date代替,date获取本机时间,时间是随时变的,这样就保证了刷新验证码可以随时变化。

代码如下:

  • functionmyRefersh(e){

  • constsource=e.src;//获得原来的src中的内容

  • //console.log("source:"+source);

  • varindex=source.indexOf("?");//从source中寻找?第一次出现的位置(如果不存在则返回-1)

  • //console.log("index:"+index);

  • if(index>-1){//如果找到了?就进入内部

  • vars=source.substring(0,index);//从source中截取index之前的内容(index以及index之后的内容都被舍弃)

  • //console.log("s:"+s);

  • vardate=newDate();//创建一个Date对象的一个实例

  • vartime=date.getTime();//从新创建的Date对象的实例中获得该时间对应毫秒值

  • e.src=s+"?time="+time;//将加了尾巴的地址重新放入到src上

  • //console.log(e.src);

  • }else{

  • vardate=newDate();

  • e.src=source+"?time="+date.getTime();

  • }

  • }

如回答不详细可追问

⑼ java 登陆时的验证码怎么做

后台写一个生成图片随机的代码,生成图片给前台。切换图片的时候,使用ajax获取图片数据就行。
附上生成图片的代码
public class ValidateCode {

private int width=180;
private int height=60;
private int codeCount = 4;
private int x = 0;
private int codeY;
private String Code;
private BufferedImage buffImg;
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','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', 'o', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
private int fontHeight;

public ValidateCode() {
x = width / (codeCount + 2);
fontHeight = height - 2;
codeY = height - 4;
CreateCode();
}

public void CreateCode(){

// 定义图像buffer
BufferedImage buffImg = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
Graphics2D g = buffImg.createGraphics();
// 创建一个随机数生成器类
Random random = new Random();

// 将图像填充为白色
g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height);

// 创建字体,字体的大小应该根据图片的高度来定。
Font font = new Font("Fixedsys", Font.PLAIN, fontHeight);
// 设置字体。
g.setFont(font);

// 画边框。
g.setColor(Color.BLACK);
g.drawRect(0, 0, width - 1, height - 1);

// randomCode用于保存随机产生的验证码,以便用户登录后进行验证。
StringBuffer randomCode = new StringBuffer();
int red = 0, green = 0, blue = 0;

// 随机产生codeCount数字的验证码。
for (int i = 0; i < codeCount; i++) {
// 得到随机产生的验证码数字。
String strRand = String.valueOf(codeSequence[random.nextInt(62)]);
// 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。
red = random.nextInt(255);
green = random.nextInt(255);
blue = random.nextInt(255);

// 用随机产生的颜色将验证码绘制到图像中。
g.setColor(new Color(red, green, blue));
g.drawString(strRand, (i ) * x+20, codeY);

// 将产生的四个随机数组合在一起。
randomCode.append(strRand);
}
this.Code=randomCode.toString().toUpperCase();
this.buffImg=buffImg;

}

public String getCode() {
return Code;
}

public void setCode(String code) {
Code = code;
}

public BufferedImage getBuffImg() {
return buffImg;
}

public void setBuffImg(BufferedImage buffImg) {
this.buffImg = buffImg;
}
}

⑽ 怎么用Java代码实现一个验证码,求具体实现方法

packageutil;

importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.image.BufferedImage;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.OutputStream;
importjava.util.Random;
importjavax.imageio.ImageIO;

publicfinalclassImageUtil{

//验证码字符集
privatestaticfinalchar[]chars={
'0','1','2','3','4','5','6','7','8','9',
'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',
'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'};
//字符数量
privatestaticfinalintSIZE=4;
//干扰线数量
privatestaticfinalintLINES=5;
//宽度
privatestaticfinalintWIDTH=80;
//高度
privatestaticfinalintHEIGHT=40;
//字体大小
privatestaticfinalintFONT_SIZE=30;

/**
*生成随机验证码及图片
*返回的数组中,第1个值是验证码,第2个值是图片
*/
publicstaticObject[]createImage(){
StringBuffersb=newStringBuffer();
//1.创建空白图片
BufferedImageimage=newBufferedImage(
WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);
//2.获取图片画笔
Graphicsgraphic=image.getGraphics();
//3.设置画笔颜色
graphic.setColor(Color.LIGHT_GRAY);
//4.绘制矩形背景
graphic.fillRect(0,0,WIDTH,HEIGHT);
//5.画随机字符
Randomran=newRandom();
for(inti=0;i<SIZE;i++){
//取随机字符索引
intn=ran.nextInt(chars.length);
//设置随机颜色
graphic.setColor(getRandomColor());
//设置字体大小
graphic.setFont(newFont(
null,Font.BOLD+Font.ITALIC,FONT_SIZE));
//画字符
graphic.drawString(
chars[n]+"",i*WIDTH/SIZE,HEIGHT/2);
//记录字符
sb.append(chars[n]);
}
//6.画干扰线
for(inti=0;i<LINES;i++){
//设置随机颜色
graphic.setColor(getRandomColor());
//随机画线
graphic.drawLine(ran.nextInt(WIDTH),ran.nextInt(HEIGHT),
ran.nextInt(WIDTH),ran.nextInt(HEIGHT));
}
//7.返回验证码和图片
returnnewObject[]{sb.toString(),image};
}

/**
*随机取色
*/
(){
Randomran=newRandom();
Colorcolor=newColor(ran.nextInt(256),
ran.nextInt(256),ran.nextInt(256));
returncolor;
}

publicstaticvoidmain(String[]args)throwsIOException{
Object[]objs=createImage();
BufferedImageimage=(BufferedImage)objs[1];
OutputStreamos=newFileOutputStream("d:/1.png");
ImageIO.write(image,"jpeg",os);
os.close();
}

}