您的位置:首页 > 编程语言 > Java开发

Java实现随机验证码功能实例

2014-03-30 21:02 1006 查看
package com.product.common.util;

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.Image;

import java.awt.MediaTracker;

import java.awt.image.BufferedImage;

import java.awt.image.ImageProducer;

import java.awt.image.PixelGrabber;

import java.util.Random;

import javax.imageio.ImageIO;

import javax.imageio.stream.FileImageInputStream;

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 ValidateCodeServlet extends HttpServlet {

 private static final long serialVersionUID = 1L;

 // 验证码图片的宽度。

 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' };

 

 public void init() throws ServletException {

  // 从web.xml中获取初始信息

  // 宽度

  String strWidth = this.getInitParameter("width");

  // 高度

  String strHeight = this.getInitParameter("height");

  // 字符个数

  String strCodeCount = this.getInitParameter("codeCount");

  // 将配置的信息转换成数值

  try {

   if (strWidth != null && strWidth.length() != 0) {

    width = Integer.parseInt(strWidth);

   }

   if (strHeight != null && strHeight.length() != 0) {

    height = Integer.parseInt(strHeight);

   }

   if (strCodeCount != null && strCodeCount.length() != 0) {

    codeCount = Integer.parseInt(strCodeCount);

   }

  } catch (NumberFormatException e) {

  }

  x = width / (codeCount + 1);

  fontHeight = height - 2;

  codeY = height - 4;

 }

 protected void service(HttpServletRequest req, HttpServletResponse resp)

   throws ServletException, java.io.IOException {

  // 定义图像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);

  // 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到。

  g.setColor(Color.BLACK);

  for (int i = 0; i < 10; i++) {

   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);

  }

  

  for(int j = 0 ; j <= 360 ; j+=9){

   int x = (int)Math.sin(1 * Math.PI/180);

   int y = (int)(80 + 40 * x);

   int xl = random.nextInt(12);

   int yl = random.nextInt(12);

   //g.drawLine(x, y, x + xl, y + yl);

  }

  // 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(36)]);

   // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。

   red = random.nextInt(255);

   green = random.nextInt(255);

   blue = random.nextInt(255);

   // 用随机产生的颜色将验证码绘制到图像中。

   g.setColor(new Color(red, green, blue));

   g.drawString(strRand, (i + 1) * x, codeY);

   // 将产生的四个随机数组合在一起。

   randomCode.append(strRand);

  }

  // 将四位数字的验证码保存到Session中。

  HttpSession session = req.getSession();

  session.setAttribute("validateCode", randomCode.toString());

  

  // 禁止图像缓存。

  resp.setHeader("Pragma", "no-cache");

  resp.setHeader("Cache-Control", "no-cache");

  resp.setDateHeader("Expires", 0);

  resp.setContentType("image/jpeg");

  // 将图像输出到Servlet输出流中。

  ServletOutputStream sos = resp.getOutputStream();

  

  //buffImg = twistImage(buffImg,true,3,3.1);

    

  ImageIO.write(buffImg, "jpeg", sos);

  sos.close();

 }

 

 

 public BufferedImage twistImage(BufferedImage  srcImage ,boolean bxDir,double dMultValue,double dPhase){

  

  BufferedImage destImage = new BufferedImage(srcImage.getWidth(),srcImage.getHeight(),1);

  //Image image =   

  //将位图背景添加为白色

  Graphics graphics = destImage.getGraphics();

  graphics.fillRect(0, 0, destImage.getWidth(), destImage.getHeight());

  graphics.dispose();

  double dBaseAxisLen = bxDir ? (double)destImage.getHeight():(double)destImage.getWidth();

  

  for(int i = 0 ; i < 10 ; i++){

   

   for(int j = 0 ; j < 10 ; j++){

    

    double dx = 0;

    dx = bxDir ?(Math.PI*(double)j)/dBaseAxisLen:(Math.PI*(double)i)/dBaseAxisLen;

    dx += dPhase;

    double dy = Math.sin(dx);//取得当前点的颜色

    int nOldX = 0,nOldY = 0;

    nOldX = bxDir ? i + (int)(dy * dMultValue):i;

    nOldY = bxDir ? j : j +(int)(dy * dMultValue);

    //ImageProducer imageProducer = destImage.getSource();//获取生成图像像素的对象

    //PixelGrabber pixelGrabber = new PixelGrabber();

    //PixelGrabber   grabber   =   new   PixelGrabber(srcImage,   0,   0,   srcImage.getWidth(),  srcImage.getHeight(), 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息