一、原理介绍:图片生成 你可能也猜想过验证码的图片不至于是预先做好了放在某个文件夹里的吧?NO,NO,试想,真的如此做的话,如果是4位验证码,并且字母数字混杂的话,这样的工作量美工肯定不接受:)所以,唯一的解释就是这些图片都是程序生成的。也就是程序“画”出来的!如何画?请看一段代码: int width=40, height=20; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics g = image.getGraphics(); //以下填充背景颜色 g.setColor(Color.decode('#66CCCF')); g.fillRect(0, 0, width, height); g.setColor(Color.decode('#01556B')); g.drawString(req.getParameter('yzm'),5,15); g.dispose();
二、验证码示例 这段代码摘自我要举的例子。我想玩过applet和swing的朋友应该不难理解。我们把页面传过来的(req.getParameter('yzm')“画”在一个40,20大小的矩形框内。这段代码当然要放一个servlet里面,这个servlet就是来负责画图的: import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.*; import javax.servlet.ServletContext; import java.io.OutputStream; import java.awt.*; import java.awt.image.*; import com.sun.image.codec.jpeg.*; /** * @version 1.0 * @author dennis */ public class Getshowimg extends HttpServlet { public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType('image/jpeg;charset=gb2312'); int width=40, height=20; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics g = image.getGraphics(); //以下填充背景颜色 g.setColor(Color.decode('#66CCCF')); g.fillRect(0, 0, width, height); g.setColor(Color.decode('#01556B')); g.drawString(req.getParameter('yzm'),5,15); g.dispose(); OutputStream toClient = resp.getOutputStream(); JPEGImageEncoder encoder =JPEGCodec.createJPEGEncoder(toClient); encoder.encode(image); toClient.close(); } }
三、验证码隐藏层工作原理好了,图已经知道怎么画了,接下来的问题就是我们怎么在页面上显示这个图?这个图同样也是个image,当然放在一个img元素里面。另外,我们应该在页面每一次刷新时都显示不同的验证码,所以应该在body的onload的事件里调用上面的servlet。来了,首先是页面: 验证码:
四、验证码输入正误检验在登陆按钮中加入事件,判断输入是否正确: if (document.form1.yzm.value!=document.getElementById('yzm1').innerText) { alert('请输入有效的验证码!'); document.form1.yzm.value=''; document.form1.yzm.focus(); return false; }
五、小结 这里给大家介绍的是Java语言的验证码原理,其实PHP等其他语言也是一样的可以照搬,如果你觉得有必要,后期可以加入PHP版! END
遇到报错请不要慌,先看看,自己能不能解决,如果还是有问题,欢迎一起交流~