现在许多系统的注册登录或者发布信息模块都添加的随机验证码功能就是为了避免自动注册程序或者自动发布程序的使用
验证码实际上就是随机选择一些字符以图片的形式展现在页面上如果进行提交操作的同时需要将图片上的字符同时提交如果提交的字符与服务器session保存的不同则认为提交信息无效为了避免自动程序分析解析图片通常会在图片上随机生成一些干扰线或者将字符进行扭曲增加自动识别验证码的难度
在这里我们使用java实现验证码
<%@ page contentType=image/jpeg import=javaawt*javaawtimage*javautil*javaximageio* %>
<%!
Color getRandColor(int fcint bc){//给定范围获得随机颜色
Random random = new Random();
if(fc>) fc=;
if(bc>) bc=;
int r=fc+randomnextInt(bcfc);
int g=fc+randomnextInt(bcfc);
int b=fc+randomnextInt(bcfc);
return new Color(rgb);
}
%>
<%
//设置页面不缓存
responsesetHeader(PragmaNocache);
responsesetHeader(CacheControlnocache);
responsesetDateHeader(Expires );
// 在内存中创建图象
int width= height=;
BufferedImage image = new BufferedImage(width height BufferedImageTYPE_INT_RGB);
// 获取图形上下文
Graphics g = imagegetGraphics();
//生成随机类
Random random = new Random();
// 设定背景色
gsetColor(getRandColor());
gfillRect( width height);
//设定字体
gsetFont(new Font(Times New RomanFontPLAIN));
// 随机产生条干扰线使图象中的认证码不易被其它程序探测到
gsetColor(getRandColor());
for (int i=;i<;i++)
{
int x = randomnextInt(width);
int y = randomnextInt(height);
int xl = randomnextInt();
int yl = randomnextInt();
gdrawLine(xyx+xly+yl);
}
// 取随机产生的认证码(位数字)
String codeList = ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz;
String sRand=;
for (int i=;i<;i++){
int a=randomnextInt(codeListlength());
String rand=codeListsubstring(aa+);
sRand+=rand;
// 将认证码显示到图象中
gsetColor(new Color(+randomnextInt()+randomnextInt()+randomnextInt()));//调用函数出来的颜色相同可能是因为种子太接近所以只能直接生成
gdrawString(rand*i+);
}
// 将认证码存入SESSION
sessionsetAttribute(randsRand);
// 图象生效
gdispose();
// 输出图象到页面
ImageIOwrite(image JPEG responsegetOutputStream());
outclear();
out = pageContextpushBody();
%>