利用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";
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(sb.toString(), 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, "jpeg", os);
}
}
使验证码图片在浏览器上打的代码:
//清除浏览器的缓存
response.setIntHeader("expires", 0);
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma","no-cache");
// 1、通知浏览器以图片方式打开
response.setHeader("Content-Type", "image/jpeg");
//写出图片
ImageUtil.outImage(response.getOutputStream());
HttpSession session = request.getSession();
//得到汉字
String ckcode = ImageUtil.checkCode;
//存入session中
session.setAttribute("ckcode", ckcode);