session案例一次性校验码
一次性验证码的主要目的就是为了限制人们利用工具软件来暴力猜测密码。
服务器程序接收到表单数据后,首先判断用户是否填写了正确的验证码,只有该验证码与服务器端保存的验证码匹配时,服务器程序才开始正常的表单处理流程。
密码猜测工具要逐一尝试每个密码的前题条件是先输入正确的验证码,而验证码是一次性有效的,这样基本上就阻断了密码猜测工具的自动地处理过程。
下面就让我们看看源码:
一次性验证码源码:
package cn.csdn.web.util;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
public class ImageUtil {
private static final int WIDTH = 130;
private static final int HEIGHT = 25;
private static final int IMAGETYPE = BufferedImage.TYPE_INT_RGB;
public static String checkCode;
private static void setFont(Graphics g) {
//写汉字
String base = "\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9\u4e0a\u7740";
//写4个字
Color c = Color.BLUE;
g.setColor(c);
Font font = new Font("宋体", Font.ITALIC, 20);
g.setFont(font);
StringBuffer sb = new StringBuffer();
//产生汉字
for(int i=0;i<4;i++){
int location = new Random().nextInt(base.length()-1);
char chr = base.charAt(location);
sb.append(chr+"");
}
checkCode=sb.toString();
Graphics2D gd = (Graphics2D) g;
gd.rotate(0.05);
//把汉字写到图片上
g.drawString(checkCode, 10, 20);
}
private static void setRandomLine(Graphics g) {
Color c = Color.GREEN;
g.setColor(c);
for (int i = 0; i <= 4; i++) {
int x1 = new Random().nextInt(WIDTH);
int y1 = new Random().nextInt(HEIGHT);
int x2 = new Random().nextInt(WIDTH);
int y2 = new Random().nextInt(HEIGHT);
g.drawLine(x1, y1, x2, y2);
}
}
private static void setBorder(Graphics g) {
Color c = Color.BLACK;
g.setColor(c);
g.drawRect(1, 1, WIDTH - 2, HEIGHT - 2);
}
private static void setBackground(Graphics g) {
Color c = Color.WHITE;
g.setColor(c);
g.fillRect(0, 0, WIDTH, HEIGHT);
}
public static void outImage(OutputStream os) throws IOException{
// 2、创建图片
BufferedImage image = new BufferedImage(WIDTH, HEIGHT, IMAGETYPE);
// 3、得到图型
Graphics g = image.getGraphics();
// 4、设置图片背景色
setBackground(g);
// 5、向图片上写边框
setBorder(g);
// 6、向图片上写干扰线
setRandomLine(g);
// 7、向图片上写数据
setFont(g);
// 8、把图片写给浏览器
ImageIO.write(image, "gif", os);
}
}