验证码 servlet实现

package cn.drp.validatecode;

import java.awt.image.*;
import com.sun.image.codec.jpeg.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.awt.*;
/*
* 功能:调用AuthCodeServlet可以生成一个4位数字的验证码图片,验证码的图片宽度和高度可以通过配置文件进行定义
* 验证码调用格式为: /servlet/AuthCodeServlet?w=78&h=32
* 或者使用默认长宽/servlet/AuthCodeServlet
*/
  public class AuthCodeServlet extends HttpServlet {
  // 处理post
    public void doPost(HttpServletRequest req,HttpServletResponse res)
    throws ServletException,IOException {
    doGet(req,res);
}

  //设置字体
  private Font mFont=new Font("Times New Roman", Font.PLAIN,16);

  public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
    HttpSession session=request.getSession();
    response.setContentType("image/gif");
    response.setHeader("Pragma","No-cache");
    response.setHeader("Cache-Control","no-cache");
    response.setDateHeader("Expires", 0);
    int width=70; //验证码默认长度
    int height=24; //验证码默认宽度
   
    //验证码中的值
    String[] AuthCode = {"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"};
    if(request.getParameter("w")!=null && !request.getParameter("w").equals(""))
      width = Integer.parseInt(request.getParameter("w"));
    if(request.getParameter("h")!=null && !request.getParameter("h").equals(""))
      height = Integer.parseInt(request.getParameter("h"));
               
    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(260,210));    //设置验证码的图片背景色
    gra.fillRect(0,0,width,height);
    gra.setColor(Color.BLUE); //设置字体色为蓝色
    gra.setFont(mFont); //设置定义的字体格式

    // 随机产生254条干扰直线,使图象中的验证码不易被解析程序分析到
    gra.setColor(getRandColor(110,240));
    for (int i=0;i<254;i++)
    {
      int x = random.nextInt(width);
      int y = random.nextInt(height);
            int xl = random.nextInt(63);
            int yl = random.nextInt(64);
      gra.drawLine(x,y,x+xl,y+yl);
    }

    // 取随机产生的验证码(4位数字)
    String sRand="";
    for (int i=0;i<5;i++){
//    String rand=String.valueOf(random.nextInt(10));
    String rand=AuthCode[random.nextInt(AuthCode.length)];
    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(sRand);
        session.setAttribute("authCode",sRand);
        JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(out);
        encoder.encode(image);
}

  static Color getRandColor(int ff,int cc){
          //给定范围获得随机颜色
          Random random = new Random();
          if(ff>255) ff=255;
          if(cc>255) cc=255;
          int r=ff+random.nextInt(cc-ff+50);
          int g=ff+random.nextInt(cc-ff+50);
          int b=ff+random.nextInt(cc-ff+50);
          if(r >255) {
           r = 100;
          }
          if(g >255) {
           g = 100;
          }
          if(b >255) {
           b = 100;
          }
          return new Color(r,g,b);
  }
}

来自:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值