实现认证码技术,需要以下几方面的准备:
1.生成认证码:
我们可以让系统随机产生一个数字来作为认证码,这方面在javascript脚本语言和java语言中均可得以实现。前者可以用math.random()得到一个介于0与1之间的小数,用它乘以10000再取整数部分,即可得到0至9999之间的随机数。后者可以用random类的nextint(n)方法得到一个介于0至n-1之间的随机类。
在实现时,我们采用了前者,即用javascript生成的随机数作为认证码。主要原因是javascript是html内置的脚本语言,不管页面是前进、后退还是刷新,都能保证及时产生新的认证码,增加了随机性。而用java实现时,则不具备此特性,浏览器还保存原先的认证码,随机性不强。
2.生成认证码图象:
这是比较关键的部分。幸运的是,java语言给我们提供了强大的支持。我们可以利用bufferedimage类在内存中绘制图象,并可利用imageio类将图象输出到jsp页面中。在绘制图象时,我们就可以将随机产生的认证码,绘制到图象中,进而展现在用户面前。另,为了增加破译的难度,我们可以随机画一些点。
3.保存认证码:
在jsp语言中,我们可以充分利用该语言内置的session对象来保存认证码之值,方法是:session.setattribute("认证码名字",认证码之值)。并可用session.getattribute("认证码名字")得到系统保存的认证码之值,用来和用户输入的认证码相比较,很是方便。
三、认证码技术的jsp实现
1.image.jsp
这个jsp程序的功能是:根据页面参数rand生成相应的认证码图象,同时设定session变量rand,以便check.jsp验证用户输入的认证码时使用。
源程序如下:
<%@ page contenttype="image/jpeg" import="java.awt.*,
java.awt.image.*,java.util.*,javax.imageio.*" %>
<%
// 在内存中创建图象
int width=60, height=20;
bufferedimage image = new bufferedimage(width, height,
bufferedimage.type_int_rgb);
// 获取图形上下文
graphics g = image.getgraphics();
// 设定背景色
g.setcolor(color.white);
g.fillrect(0, 0, width, height);
//画边框
g.setcolor(color.black);
g.drawrect(0,0,width-1,height-1);
// 取随机产生的认证码(4位数字)
string rand = request.getparameter("rand");
rand = rand.substring(0,rand.indexof("."));
switch(rand.length())
{
case 1: rand = "000"+rand; break;
case 2: rand = "00"+rand; break;
case 3: rand = "0"+rand; break;
default: rand = rand.substring(0,4); break;
}
// 将认证码存入session
session.setattribute("rand",rand);
// 将认证码显示到图象中
g.setcolor(color.black);
g.setfont(new font("times new roman",font.plain,18));
g.drawstring(rand,10,15);
// 随机产生88个干扰点,使图象中的认证码不易被其它程序探测到
random random = new random();
for (int i=0;i<88;i++)
{
int x = random.nextint(width);
int y = random.nextint(height);
g.drawline(x,y,x,y);
}
// 图象生效
g.dispose();
// 输出图象到页面
imageio.write(image, "jpeg", response.getoutputstream());
%>
2.a.jsp
这个jsp程序的功能是:显示认证码,提供表单让用户输入认证码供校验用。注意,程序中显示认证码图象时,用了javascript的document.write,并用了math.random函数,从而保证了认证码的及时更新特性。
源程序如下:
<%@ page contenttype="text/html;charset=gb2312" %>
<!doctype html public "-//w3c//dtd html 4.01 transitional//en">
<html>
<head>
<title>认证码输入页面</title>
<meta http-equiv="content-type" content="text/html; charset=gb2312">
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
<body>
<form method=post action="check.jsp">
<table>
<tr>
<td align=left>系统产生的认证码:</td>
<td><script>document.write("<img border=0 src=image.jsp?
rand="+math.random()*10000+">");</script></td>
</tr>
<tr>
<td align=left>输入上面的认证码:</td>
<td><input type=text name=rand maxlength=4 value=""></td>
</tr>
<tr>
<td colspan=2 align=center><input type=submit value="提交检测"></td>
</tr>
</form>
</body>
</html>
3.check.jsp
这个jsp程序的作用是比较用户输入的认证码与session变量中保存的认证码,相同时提示认证成功,否则提示认证失败。
源程序如下:
<%@ page contenttype="text/html; charset=gb2312" language="java"
import="java.sql.*" errorpage="" %>
<html>
<head>
<title>认证码验证页面</title>
<meta http-equiv="content-type" content="text/html; charset=gb2312">
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
<body>
<%
string rand = (string)session.getattribute("rand");
string input = request.getparameter("rand");
%>
系统产生的认证码为: <%= rand %><br>
您输入的认证码为: <%= input %><br>
<br>
<%
if (rand.equals(input)) {
%>
<font color=green>输入相同,认证成功!</font>
<%
} else {
%>
<font color=red>输入不同,认证失败!</font>
<%
}
%>
</body>
</html>
新闻热点
疑难解答