IntelliJ IDEA实现网页生成验证码相关模块:
importcom.sun.image.codec.jpeg.JPEGCodec;importcom.sun.image.codec.jpeg.JPEGImageEncoder;import java.awt.*;importjava.awt.image.BufferedImage;importjava.io.ByteArrayInputStream;importjava.io.ByteArrayOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.util.HashMap;importjava.util.Map;importjava.util.Random;public final classImageUtil {private static final char[] chars = { ‘0‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘,‘7‘, ‘8‘, ‘9‘, ‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘, ‘G‘, ‘H‘, ‘I‘};private static final int SIZE = 4;private static final int LINES = 5;private static final int WIDTH = 80;private static final int HEIGHT = 40;private static final int FONT_SIZE = 30;public static MapcreateImage() {
StringBuffer sb= newStringBuffer();
BufferedImage image= newBufferedImage(WIDTH, HEIGHT,
BufferedImage.TYPE_INT_RGB);
Graphics graphic=image.getGraphics();
graphic.setColor(Color.LIGHT_GRAY);
graphic.fillRect(0, 0, WIDTH, HEIGHT);
Random ran= newRandom();for (int i = 1; i <= SIZE; i++) {int r =ran.nextInt(chars.length);
graphic.setColor(getRandomColor());
graphic.setFont(new Font(null, Font.BOLD +Font.ITALIC, FONT_SIZE));
graphic.drawString(chars[r]+ "", (i - 1) * WIDTH /SIZE,
HEIGHT/ 2);
sb.append(chars[r]);
}for (int i = 1; i <= LINES; i++) {
graphic.setColor(getRandomColor());
graphic.drawLine(ran.nextInt(WIDTH), ran.nextInt(HEIGHT),
ran.nextInt(WIDTH), ran.nextInt(HEIGHT));
}
Map map = new HashMap();
map.put(sb.toString(), image);returnmap;
}public staticColor getRandomColor() {
Random ran= newRandom();
Color color= new Color(ran.nextInt(256), ran.nextInt(256),
ran.nextInt(256));returncolor;
}public staticInputStream getInputStream(BufferedImage image)throwsIOException {
ByteArrayOutputStream bos= newByteArrayOutputStream();
JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(bos);
encoder.encode(image);byte[] imageBts =bos.toByteArray();
InputStream in= newByteArrayInputStream(imageBts);returnin;
}
}
生成验证码ImageUtill类
/*** 产生登录页面验证码*/@RequestMapping("/createImage.do")public voidcreateImage(
HttpServletResponse response, HttpSession session)throwsException {
Map imageMap =ImageUtil.createImage();
String code=imageMap.keySet().iterator().next();
session.setAttribute("imageCode", code);
BufferedImage image=imageMap.get(code);
response.setContentType("image/jpeg");
OutputStream ops=response.getOutputStream();
ImageIO.write(image,"jpeg", ops);
ops.close();
}
JSP网页调用(片段,将上面的ceateImage.do放入src中):
验证码:
程序确定是无误的!
可以写成Java程序进行验证图片的生成:
但是:在网页中无法显示验证码图片。错误信息是无法写入Tomcat的temp目录,但temp目录肯定是存在的,原因是写入temp目录必须要管理员权限。
解决方法:
进入tomcat安装目录:C:\Program Files\Apache Software Foundation\Tomcat 8.5
右击temp属性:
对所有用户勾选所有权限,问题解决!!!