原创 使用servlet编写一个验证码的例子收藏

ackage com.topsuntech.gUnit_cnpo.common.servlet;

import java.io.*;
import java.util.*;
import com.sun.image.codec.jpeg.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.awt.*;
import java.awt.image.*;

/*
 * 功能:调用AuthServlet可以生成一个验证码图片,图片的宽度和高度可以自定义
 * 调用格式: /servlet/AuthServlet?width=60&height=20
 *      或者/servlet/AuthServlet
 * 时间:2007-9-4
 * 
 *
 */
public class AuthServlet extends HttpServlet {
 private Font mFont=new Font("Times New Roman", Font.PLAIN,18);//设置字体
 //static String AuthCode="";

// 处理post
 public void doPost(HttpServletRequest request,HttpServletResponse response)
 throws ServletException,IOException {
   doGet(request,response);
 }

 public void doGet(HttpServletRequest request,HttpServletResponse response)
     throws ServletException,IOException {
// 取得一个1000-9999的随机数


     HttpSession session=request.getSession();//request.getSession(false)当参数为false时,有可能不创建session
     //session.setAttribute("getImg",s);
     response.setContentType("image/gif");
     response.setHeader("Pragma","No-cache");
     response.setHeader("Cache-Control","no-cache");
     response.setDateHeader("Expires", 0);
     int width=60;
     int height=20;
     if(request.getParameter("width")!=null && !request.getParameter("width").equals(""))
      width = Integer.parseInt(request.getParameter("width"));
     if(request.getParameter("height")!=null && !request.getParameter("height").equals(""))
      height = Integer.parseInt(request.getParameter("height"));
                 

     ServletOutputStream out=response.getOutputStream();
     BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //设置图片大小的
     Graphics gra=image.getGraphics();
     Random random=new Random();

     gra.setColor(getRandColor(200,250));    //设置背景色
     gra.fillRect(0,0,width,height);

     gra.setColor(Color.black); //设置字体色
     gra.setFont(mFont);


     // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
     gra.setColor(getRandColor(160,200));
     for (int i=0;i<155;i++)
     {
      int x = random.nextInt(width);
      int y = random.nextInt(height);
             int xl = random.nextInt(12);
             int yl = random.nextInt(12);
      gra.drawLine(x,y,x+xl,y+yl);
     }

     // 取随机产生的认证码(4位数字)
     String sRand="";
     for (int i=0;i<4;i++){
        String rand=String.valueOf(random.nextInt(10));
        sRand+=rand;
         // 将认证码显示到图象中
         gra.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
         gra.drawString(rand,13*i+6,16);
     }
         //System.out.println("showimage="+sRand);
         //session.setAttribute("getImg",sRand);
         session.setAttribute("AuthCode",sRand);
         //AuthCode = sRand;
         //session.putValue("AuthCode",sRand);
         JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(out);
         encoder.encode(image);
         //out.flush();

 }

   static Color getRandColor(int fc,int bc){//给定范围获得随机颜色
          Random random = new Random();
          if(fc>255) fc=255;
          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);
   }
  
   static public String getAuthCode(HttpSession session){//返回验证
    return (String)session.getAttribute("AuthCode");
         
   }
 

发表于 @ 2007年09月05日 09:40:00|评论(loading...)

 | 

用户操作
[即时聊天] [发私信] [加为好友]
weijiandong
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
文章分类
    收藏
      存档
      软件项目交易
      Csdn Blog version 3.1a
      Copyright © weijiandong