前面讲到了验证码中的数字、字母和汉字的随机生成,但是验证码中肯定不仅仅是包含了这些东西啊。大家可以看到数字啊什么的是斜的,或者背景颜色是五颜六色的甚至各种线条都有。那么,这些东西该怎么实现呢?
1、背景颜色随机输出的实现,直接给代码吧- -
public Color getRandColor(int lower,int upper){?
? Random random = new Random();?
? if(upper>255)?
? ?upper=255;?
? if(upper<1)?
? ?upper=1;?
? if(lower<1)?
? ?lower=1;?
? if(lower>255)?
? ?lower=255;?
? int r=lower+random.nextInt(upper-lower);?
? int g=lower+random.nextInt(upper-lower);?
? int b=lower+random.nextInt(upper-lower);?
? return new Color(r,g,b);?
}?
2、随机绘制干扰线和干扰点- -
// 随机产生5条干扰线,使图象中的认证码不易被其它程序探测到?
? for(int i=0;i<5;i++){?
? ?int x=random.nextInt(width);?
? ?int y=random.nextInt(height);?
? ?int x1=random.nextInt(width);?
? ?int y1=random.nextInt(height);?
? ?g.drawLine(x, y, x1, y1);?
? }?
? //随机产生100个点,使图中认证码不易被其它程序探测到(线的起点和终点一样就是成一个点了)
? for(int i=0;i<100;i++){?
? int x=random.nextInt(width);?
? int y=random.nextInt(height); ?
? g.drawLine(x, y, x, y);?
?}
3、图片的旋转与缩放,jferedImage;?
import java.io.IOException;?
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;
public class ImageServlet extends HttpServlet {?
public void doGet(HttpServletRequest request, HttpServletResponse response)?
? ?throws ServletException, IOException {?
? ? ? ? ? ? doPost(request, response);?
}?
public void doPost(HttpServletRequest request, HttpServletResponse response)?
? ?throws ServletException, IOException {?
? int width=150;//验证码图片宽度?
? int height=60;//验证码图片高度?
? BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);?
? Graphics g=image.getGraphics(); //创建一个图形类
? Random random=new Random();//创建一个随机类?
? g.setColor(getRandColor(200,250));//背景颜色要偏淡?
? g.fillRect(0, 0, width, height);//画背景?
? g.setColor(getRandColor(0,255));//边框颜色?
? ? ? ? g.drawRect(0, 0, width-1, height-1);//画边框?
?// 随机产生5条干扰线,使图象中的认证码不易被其它程序探测到?
? for(int i=0;i<5;i++){?
? ?int x=random.nextInt(width);?
? ?int y=random.nextInt(height);?
? ?int x1=random.nextInt(width);?
? ?int y1=random.nextInt(height);?
? ?g.drawLine(x, y, x1, y1);?
? }?
? //随机产生100个点,使图中认证码不易被其它程序探测到(线的起点和终点一样就是成一个点了)
? for(int i=0;i<100;i++){?
? int x=random.nextInt(width);?
? int y=random.nextInt(height); ?
? g.drawLine(x, y, x, y);?
?}
? g.setColor(getRandColor(160,200));
? ? ? ? Font font = new Font("Times New Roman", Font.ITALIC,38); ?// 创建字体,字体的大小应该根据图片的高度来定。?
? ? ? ? g.setFont(font);//设置字体?
? ? ? ? int length = 6; ?// 设置默认生成6个验证码?
? String s="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; // 设置备选验证码:包括"a-z"和数字"0-9"?
? String sRand="";?
? ? ?
? ? ? ? // 用随机产生的颜色将验证码绘制到图像中。?
? ? ? ? // 生成随机颜色(因为是做前景,所以偏深) ??
? ? ? ? //调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成?
? ? ? ? g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110))); ??
? for(int i=0;i<length;i++){?
? ?String ch=String .valueOf(s.charAt(random.nextInt(s.length())));?
? ?sRand+=ch;?
? ?g.drawString(ch, 22*i+12, (random.nextInt(5)-2)*i+40);?
? ?//drawString(a,x,y)a为要画出来的东西,x和y表示要画的东西最左侧字符的基线位于此图形上下文坐标系的 (x, y) 位置处
? }?
? //将生成的字符串存储在session中?
? HttpSession session=request.getSession(); ??
? session.setAttribute("checkCode", sRand);?
? g.dispose();//图像生效?
? //禁止图像缓存?
? response.setHeader("Pragma", "No-cache");?
? response.setHeader("Cache-Control", "no-cache");?
? response.setDateHeader("Expires", 0); ??
? response.setContentType("image/jpeg");?
? //创建二进制的输出流?
? ServletOutputStream sos=response.getOutputStream();?
? ? ? ? // 将图像输出到Servlet输出流中。?
? ? ? ? ImageIO.write(image, "jpeg", sos);?
? ? ? ? sos.flush();?
? ? ? ? sos.close();?
}
public Color getRandColor(int lower,int upper){?
? Random random = new Random();?
? if(upper>255)?
? ?upper=255;?
? if(upper<1)?
? ?upper=1;?
? if(lower<1)?
? ?lower=1;?
? if(lower>255)?
? ?lower=255;?
? int r=lower+random.nextInt(upper-lower);?
? int g=lower+random.nextInt(upper-lower);?
? int b=lower+random.nextInt(upper-lower);?
? return new Color(r,g,b);?
}?
}
?