java.awt.image.*,java.util.*,javax.imageio.*" %>
<%!
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)
}
%>
<%
//设置页面不缓存
//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(getRandColor(200,250))
g.fillRect(0, 0, width, height)
//设定字体
g.setFont(new Font("Times New Roman",Font.PLAIN,18))
//画边框
//g.setColor(new Color())
//g.drawRect(0,0,width-1,height-1)
// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
g.setColor(getRandColor(160,200))
for (int i=0i<155i++)
{
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=0i<4i++){
String rand=String.valueOf(random.nextInt(10))
sRand+=rand
// 将认证码显示到图象中
g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)))
//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
g.drawString(rand,13*i+6,16)
}
// 将认证码存入SESSION
session.setAttribute("rand",sRand)
// 图象生效
g.dispose()
// 输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream())
%>
可以要,也可以不要。你是要加手机验证码还是图片验证码?如果是手机验证码,需要找第三方短信网站接口; 如果是图形验证码,有生成图形验证码的开发工具包。
过一段时间让这些数据失效就可以了。
jsp本身是包装了一个后台servlet对前台的输入,所以页面技术的支持就不是很好不过也不是不能做要做验证码,自然是要用到ajax技术了,后台写一个servlet,产生二个随机数,拼出这二个数的加法结果存到session中,然后把式子显示到前台。
数据提交jsp提交的时候,后台servlet把输入的验证码与session中取出来的值做比较,记得比完比session中这个attribute删掉。
关于ajax技术,我这里就不说了,google一下吧,提示你一点
可以在<body onload="init()">
然后写一个js方法,在init中用ajax访问验证码的servlet
祝你好运!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)