在实际开发各类应用管理系统的时候,应当考虑到系统的安全性,为了防止非法用户采起穷举法在线***,应当在登陆模块采用了验证码手段。该模块主要设计思想是:用图片格式显示随机码,即在服务器端经过程序将随机产生的验证码字符画在带有干扰点的背景图片上,把该图片放置在网页上,在客户端显示出来的是一幅带有干扰因素的图片;另外一方面,在服务器端准备好几张背景图片,这些背景图片的格式、颜色、花纹等干扰方式各不相同,每次随机抽取其中一幅做为背景,这样就加大了经过工具来解读图片上字符的难度,从而在必定程度上提升安全。验证码的程序实现过程:java
(1)文件结构
所有源程序共包括三个文件:
Checkcode.java:这是一个Servlet服务器端脚本,集成了生成随机数、绘制验证码、添加干扰点等方法。将整个实现逻辑封装在服务器端,主要是从安全性的角度考虑。
Denglu.jsp:这也是一个JSP脚本,它将调用Checkcode.java产生的验证码图片显示在客户端。
Jiancha.jsp:这是一个JSP脚本,用于检查用户输入的验证码。安全
(2)程序流程
用户请求Denglu.jsp页面时,服务器调用Checkcode.java的getRandomO方法,产生4位数字和字母混合的随机字符串。
Public String getRandom0{
Char[]str={‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’,‘0’,‘a’,‘b’,‘C’,‘d’,'e',‘f’,‘g’,‘h’,‘i’,'j',‘k’,‘l’,‘m’,‘n’,
‘o’,‘P’,‘q’,'r','s','t',‘U’,‘v’,‘W’,‘X’,‘Y’,‘z’);
For(int i=0;i<4;i++){
int j=random.nextInt(36);
c[i]=str[j];服务器
}
return string.Valueof(c[0])+string.valueOf(c[1])+string.valueOf(c[2])+string.valueOf(c[3]);
} session
服务器执行Servlet的doGetO方法,将随机字符串绘制在背景图片上。
Sting Codel=request.getParameter("Checkcode");//取Denglu.jsp传递的参数
Response.setcontentType("p_w_picpath/jpeg");
Response.setheader("Cache—control","no—store");
servletOutputStream outpic=response.getOutputstream();
Inputstrem picname=new FileInputStream(new file("e:/pic01.jpg"));//取背景图片
JPEGImagedecode playcoder=JPEGCodec.ceateJPEGDecoder(picname);//创建JPEG×××
Bufferedlmage Bufpic=decoder.decodeAsBufferedlmage();//生成缓冲图像
Graphics gra=BufImage.getCraphics();//取图形上下文dom
gra.setColor(new color(O,0,0));//设置字符串颜色
gra.setFont(new Font("Times New Roman",Font.ITALIC,24));//设置字体
gra.drawstring(Codel,10,25);//写入随机字符串对随机图片添加干扰点,防止扫描识别
Random ranl=new Random();//随机产生400个干扰点(背景图片大小120*60)
For(int i=O;i<400;i++){
int x=random.nextInt(120);
int y=random.nextInt(60);
gra.setcolor(new color.grean);
gra.drawLine(x,y,x+1,y+1);
}jsp
将处理好的缓冲图像从新编码为JPEG输出
JPEGImageEncode
outcode=JPEGCodec.createJPEGEncoder(picname);
outcode.encode(bufpic);
picname.close();ide
而后把生成的验证码做为session变量写入,所以在接收登陆页面输入的数据页面中,可用用户输入的验证码和这个session变量做比较,若是相同则表示验证经过。工具