第一:写一个图片生成类
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>