1.生成验证码图片,包含干扰点
原理其实十分简单,就是生成一串随机的字符串,然后将其以图片的方式显示出来
package com.manage.model;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class CheckCode extends HttpServlet {
private static final int CODE_LENGTH = 5;//验证码的位数
private static final int WIDTH = CODE_LENGTH*18;//验证码图片的宽度,跟验证码的位数相关
private static final int HEIGHT = 30;//验证码图片的高度
private static final String CODES = "0123456789abcdefghijklmnopqr" +
"stuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";//验证码字符库
private static final Color BACKGROUND_COLOR = Color.BLACK;//验证码图片的背景颜色
private static final Color CODE_COLOR = Color.RED;//验证码字体的颜色
private static final int POINT_NUM = 100;//干扰点的数量
private static final Color POINT_COLOR = Color.WHITE;//干扰点的颜色
private static final Font CODE_FONT = new Font("Consolas",Font.BOLD,30);
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取session
HttpSession session = request.getSession();
//禁止浏览器缓存随机图片
response.setDateHeader("Expires", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
//通知浏览器以图片的方式打开发送的数据
response.setHeader("Content-Type", "image/jpeg");
//在内存中创建一幅图片
BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
//获取画笔
Graphics g = image.getGraphics();
//设置黑色背景
g.setColor(BACKGROUND_COLOR);
g.fillRect(0, 0, WIDTH, HEIGHT);
//画干扰点
Random random = new Random();
for(int i=0;i<POINT_NUM;i++){
g.setColor(POINT_COLOR);
g.drawOval(random.nextInt(WIDTH), random.nextInt(HEIGHT),1,1);
}
//生成随机验证码
char[] randCode = new char[CODE_LENGTH];
for(int i=0;i<CODE_LENGTH;i++){
randCode[i] = CODES.charAt(random.nextInt(CODES.length()));
}
String code = new String(randCode);
//显示验证码显示的样式
g.setColor(CODE_COLOR);
g.setFont(CODE_FONT);
g.drawString(code, 2, 25);
//向浏览器输出验证码图片
ImageIO.write(image, "jpg", response.getOutputStream());
//将code写入session中
session.setAttribute("checkCode", code);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
2.验证码图片点击刷新
<script language="javascript" type="text/javascript">
var pic = document.getElementById('checkCode');
pic.src = "你的servlet的URL"+"?d="+Math.random();
</script>
之所以要加上Math.random(),是因为浏览器有缓存,访问同一个URL地址的话,浏览器会去取原来缓存中的验证码图片,这样就会导致错误。加上了随机数,可以使得前后两次的URL产生变化,浏览器每次都对服务器发出新的请求,从而获得正确的验证码图片。
3.服务器端
服务器端在用session验证的时候,要记得用户输入的验证码,无论是大写还是小写都要当成相同的格式来对待。当然也可以设计成区分大小写的形式。
4.最后生成的图片
例如: