在做web开发的时候,常常需要使用到验证码。验证码的作用其实非常重要,通过它可以有效的防止有人通过使用暴力的手段破解掉用户的账号密码信息,验证码是一串随机生成的数字组合,而最重要的就是它具有扰乱人眼的背景图片。在互联网盛行的今天,信息安全更显得重要,所以验证码对于web开发必不可少。在后面的文章里,我还会谈谈在移动客户端上如何实现验证码这一重要的功能。
先看一看程序运行的效果:
很简单,只需要输入一个用户名和正确的验证码即可进入首页,否则提示出相应的错误信息。下面我们来看看程序是如何实现的:为了方便,代码写在了jsp页面中
<%@ page import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" pageEncoding="gbk"%>
<%@ page import="java.io.OutputStream"%>
<%-- 采用JPG格式的图片验证码 --%>
<%!Color getRandColor(int fc, int bc) //随机生成图片中rgb的值
{
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);
}
%>
<%
try
{
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);
OutputStream os = response.getOutputStream();
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(getRandColor(160, 200));
//生成图像内部的干扰线条
for (int i = 0; i < 155; i++)
{
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);
}
String sRand = "";
//生成4为随机的、有彩色值得验证码
for (int i = 0; i < 4; i++)
{
//生成一位验证码的值
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.setAttribute("yanzhengma_InSession", sRand);
g.dispose();
//生成JPEG格式的图片验证码
ImageIO.write(image, "JPEG", os);
os.flush();
os.close();
os = null;
// 用来将缓冲区的数据立即输出到浏览器当中
response.flushBuffer();
/* 两句关键代码 */
out.clear();
out = pageContext.pushBody();
}
catch (IllegalStateException e)
{
System.out.println(e.getMessage());
e.printStackTrace();
}
%>
具体的解释代码中已经注释的很清楚了,其实就是通过一张图片,在上面生成了一系列的干扰线条,从而使得破解程序无法进行识别,这里我们采用的是JPG格式的图片验证码,其他的方式还有好几种,这里不再叙述,当然现在验证码的花样也越来越多,原理都是不变的。
特别要提出的是out对象,out.clear()的作用是清空缓存,这里必须添加这两句话,out对象的另一个方法clearBuffer()作用是清空缓存的同时将其内容输出,具体的大家自己可以进行测试,由于上传了好多次,都没看到,所以这里先不提供源码下载,在后面将进行补充。
转载请注明出处,不得出现抄袭等情况。