参考了些网上代码,自己写了一个验证
第一:写一个图片生成类
第二:
前端获取验证码
第一:写一个图片生成类
package com.demo.util;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 生成一个校验图片
*/
public class ImageUtil {
private static final int WIDTH = 80;
private static final int HIGHT = 30;
private static final char[] CODE_SEQUENCE = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
// 验证码字符个数
private static final int CODE_COUNT = 4;
// 字体的位置参数
private static final int FONT_AREA = WIDTH / (CODE_COUNT + 1);
public static void createCheckImg(HttpServletRequest request,
HttpServletResponse response) throws IOException {
// 定义图像
BufferedImage bi = new BufferedImage(WIDTH, HIGHT,
BufferedImage.TYPE_INT_RGB);
Graphics2D gd = bi.createGraphics();
// 随机数
Random random = new Random();
// 矩形填充为白色
gd.fillRect(0, 0, WIDTH, HIGHT);
gd.setColor(Color.white);
// 根据高宽设置字体
// 字体四种风格 plain bold italic
Font font = new Font("Fixedsys", Font.BOLD, HIGHT - 5);
gd.setFont(font);
// 画边框
gd.setColor(Color.BLACK);
gd.drawRect(0, 0, WIDTH - 1, HIGHT - 1);
gd.setColor(Color.BLACK);
// 随机产生几条干扰线
for (int i = 0; i < 6; i++) {
int x1 = random.nextInt(WIDTH);
int y1 = random.nextInt(HIGHT);
int x2 = random.nextInt(20);
int y2 = random.nextInt(10);
gd.drawLine(x1, y1, x1 + x2, y1 + y2);
}
// 产生随机码
int red = 0, green = 0, blue = 0;
// 存储数据的buffer
StringBuffer sb = new StringBuffer();
for (int i = 0; i < CODE_COUNT; i++) {
// 得到随机数
String strRand = String.valueOf(CODE_SEQUENCE[random.nextInt(36)]);
// 产生随机的颜色
red = random.nextInt(255);
green = random.nextInt(255);
blue = random.nextInt(255);
// 将验证码绘成图案
gd.setColor(new Color(red, green, blue));
gd.drawString(strRand, (i ) * FONT_AREA, HIGHT - 4);// x,y表坐标位置,按照宽度分5个坐标
// 拼接数字
sb.append(strRand);
}
// 设置session
request.getSession().setAttribute("checkCode", sb.toString());
// 禁止图像缓存。
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg");
ServletOutputStream sos = response.getOutputStream();
ImageIO.write(bi, "jpg", sos);
sos.close();
}
}
第二:
前端获取验证码
<img src="${ctx}/uploadFile/createImg" id="checkImg" alt="wait..."/>
<a href="#" onclick="changeImg()">换一张</a>
<script type="text/javascript">
//换验证图片
function changeImg(){
var img = $("#checkImg");
var imgSrc = img.attr("src");
img.attr("src",changeUrl(imgSrc));
}
//无了使图片不一样,不让浏览器加上缓存,所以用时间戳来作为参数
function changeUrl(imgSrc){
var timestamp = (new Date()).valueOf();
var indexTemp =imgSrc.indexOf("=");
if(indexTemp>0){
var subUrl = imgSrc.substring(0,indexTemp);
var resultUrl = subUrl + "=" + timestamp;
return resultUrl;
}else{
var resultUrl = imgSrc + "?" + "timestamp=" + "timestamp";
return resultUrl;
}
}
</script>