早年的验证码

package cn.code;

 

/*

 * $Id: RandomCodeImageServlet.java,v 1.2 2007/11/21 17:39:27 javacat Exp $

 */

 

 

 

 

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.ServletException;

import javax.imageio.ImageIO;

import java.io.IOException;

import java.awt.*;

import java.awt.image.BufferedImage;

import java.util.Date;

import java.util.Random;

 

/**

 * RandomCodeImageServlet

 *

 * @author Weibo Xie (weibo19832003 at gmail.com)

 *         Everything that has a beginning has an end.

 */

@SuppressWarnings("serial")

public class RandomCodeImageServlet extends HttpServlet{

private static final String CODE="code";

private static final String TIME="time";

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

}

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//设置页面不缓存

        response.setContentType("image/jpeg");

        response.setHeader("Pragma","No-cache");

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

        response.setDateHeader("Expires", 0);

 

// 在内存中创建图象

        int width=82, height=20;

        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.setFont(new Font("Dialog",Font.BOLD,16));

 

//画边框

//g.setColor(new Color());

//g.drawRect(0,0,width-1,height-1);

 

 

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

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

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

        }

 

// 取随机产生的认证码(6个字符)

        String sRand="";

        String rand="";

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

        int x=random.nextInt(2);

        if(x==0){

        int j=random.nextInt(26);

        int k = (0==random.nextInt(2))?(j+65):(j+97);

        char c=(char) k;

        rand=String.valueOf(c);

        }else{

        rand=String.valueOf(random.nextInt(10));

        }

        

   

     

        sRand+=rand.toUpperCase();

// 将认证码显示到图象中

        g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110))); //调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成

      

        g.drawString(rand,13*i+6,16+random.nextInt(3));

      

        

       

        }

       

// 将认证码md5后存入SESSION 

        request.getSession(true).setAttribute(CODE,sRand);

      request.getSession().setAttribute(TIME, System.currentTimeMillis());

     //   request.getSession(true).setMaxInactiveInterval(100);

 

// 图象生效

        g.dispose();  

 

// 输出图象到页面

        ImageIO.write(image, "JPEG", response.getOutputStream());

 

    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值