java实现验证码制作(servlet)

一、验证码的定义与作用
验证码是一种区分用户是计算机还是人的全自动程序。它有以下几点作用:可以防止恶意破解密码,刷票、论坛灌水、有效防止某个黑客对某一特定注册用户用特定程序暴力破解方式进行不断登录尝试。
二、使用serlvet实现验证码的制作
1.大体思路与步骤
首先制作前台页面,包括一个用于输入验证码的text文本框和一个用于显示图片的标签,与其它不同的是,标签的src路径值不是固定的图片路径,而是一个serlvet类的地址。也就是说,通过这个serlvet类会随机生成一个图片然后输出,显示到前台来。这个就是大体的思路。至于怎样生成图片就请看下文。
2.serlvet中使用的类介绍
a:BufferedImage图像数据缓冲区(由于一共需要绘制四个数字,所以每绘制一个就将它存到这个类中)
b:Graphics绘制图片
c:Color获取颜色(包括图片背景和每一个文字的颜色)
d:Random生成随机数
e:ImageIO输出图片(最终生成一个图片的类)
3.生成图片实现类的大体流程
a:定义BufferedImage对象
b:通过a得到的对象获取Graphics
c:通过Random产生随机验证码信息
d:使用Graphics绘制图片
e:将验证码信息存储到session中,便于后面的比较验证
f:使用ImageIO输出图片
4.servlet类的关键代码

public class ImageServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{
        BufferedImage bi = new BufferedImage(68,22,BufferedImage.TYPE_INT_RGB);
        Graphics g = bi.getGraphics();
        Color c = new Color(200,150,255);//验证码背景颜色
        g.setColor(c);
        g.fillRect(0, 0, 68, 22);//所绘制图片的大小

        char[] ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();
        Random r = new Random();
        int len=ch.length,index;
        StringBuffer sb = new StringBuffer();
        for(int i=0; i<4; i++){
            index = r.nextInt(len);
            g.setColor(new Color(r.nextInt(88),r.nextInt(188),r.nextInt(255)));
            g.drawString(ch[index]+"", (i*15)+3, 18);
            sb.append(ch[index]);
        }
        request.getSession().setAttribute("piccode", sb.toString());
        ImageIO.write(bi, "JPG", response.getOutputStream());
    }
}

三、刷新验证码功能的实现
实现动态刷新的本质也就是重新访问servlet类让他重新生成一个图片。所以根据这个原理,可以在前台页面中编写一个js方法用于刷新。具体代码如下:

function reloadCode(){
            var time = new Date().getTime();
            document.getElementById("imagecode").src="<%=request.getContextPath() %>/servlet/ImageServlet?d="+time;
        }

其中request.getContextPath()是获得绝对路径。

猜你喜欢

转载自blog.csdn.net/dglsx123/article/details/79644263