读书人

验证码 的生成种

发布时间: 2012-10-11 10:16:10 作者: rapoo

验证码 的生成类
<input type="text" maxlength="4" tabindex="3" name="authorcode" id="authorcode"/>
<img id="randomCodeImg" src="getAuthcode.do" onclick="this.src='getAuthcode.do?id=' + Math.random()" style="vertical-align: middle;" alt="验证码 的生成种" title="如果看不清楚,请点图片重新生成" />


package com.s.controller;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GraphicsEnvironment;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import com.s.controller.BaseController;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class AuthcodeController extends BaseController {

static final long serialVersionUID = 19881218; //明明的生日


@RequestMapping("/getAuthcode.do")
public void getAuthcode(HttpServletRequest request,HttpServletResponse response) throws IOException{

response.setContentType("image/jpeg");
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
// 在内存中创建图象
int width=60, height=20;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

// 获取图形上下文
Graphics g = image.getGraphics();

//生成随机类
Random random = new Random();

// 设定背景色
g.setColor(new Color(255,255,255));
g.fillRect(0, 0, width, height);


//设定字体
g.setFont(new Font("Comic Sans MS",Font.PLAIN,18));
//画边框
g.setColor(this.getRndColor());
// g.drawRect(0,0,width-1,height-1);

// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
g.setColor(this.getRndColor());
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);
}


// 取随机产生的认证码(4位数字)
String sRand="";
for (int i=0;i<4;i++){
String rand=String.valueOf(random.nextInt(10));
sRand+=rand;
// 将认证码显示到图象中
g.setColor(new Color(127,127,127));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
g.drawString(rand,13*i+6,16);
}
request.getSession().setAttribute("acode",sRand);
// 图象生效
g.dispose();
ServletOutputStream responseOutputStream =response.getOutputStream();
// 输出图象到页面
ImageIO.write(image, "JPEG", responseOutputStream);

//以下关闭输入流!
responseOutputStream.flush();
responseOutputStream.close();
}

// 检查验证码正不正确
@RequestMapping("/isokAuthcode.do")
public void isokAuthcode(){

}

private Color getRndColor(){//给定范围获得随机颜色
return new Color(this.rnd(),this.rnd(),this.rnd());
}


/**随机生成0-255的数字**/
private int rnd(){
java.util.Random random = new java.util.Random();
return random.nextInt(255);
}
/**把除了大小写字母和数字外的字符全过滤掉**/
private char filter(int k){
if(k<65)k=48+(k%10);
if(k>64&&k<96)k=65+(k%26);
if(k>96)k=97+(k%26);
return (char)k;
}
/**取得一个随机字体**/
private String getRndFontNames(){
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] k = ge.getAvailableFontFamilyNames();
java.util.Random r = new java.util.Random();
return k[r.nextInt(k.length)];
}


}

读书人网 >软件架构设计

热点推荐