RandomValidateCode.java
package com.checkcode.servlet; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class RandomValidateCode { public static final String RANDOMCODEKEY = "randomValidateCode"; // 放到session中的key private Random random = new Random(); private String randomString = ""; // 随机产生的字符串 private int width = 80; // 宽 private int height = 30; // 高 private int lineSize = 40; // 干扰线数量 private int randomSize = 4; // 验证码字符数量 /** * 获取可随机产生的字符串 0-9/a-z/A-Z */ public void getRandomString() { StringBuilder str = new StringBuilder(); for (int i = 0; i <= 9; i++) { str.append(i); } for (int i = 0; i < 26; i++) { str.append((char) (i + 65)); } for (int i = 0; i < 26; i++) { str.append((char) (i + 97)); } this.randomString = str.toString(); } /** * 获取颜色 * * @param fc * @param bc * @return */ public Color getColor(int fc, int bc) { if (fc > 225) { fc = 225; } if (bc > 225) { bc = 225; } int r = fc + random.nextInt(bc - fc - 16); int g = fc + random.nextInt(bc - fc - 14); int b = fc + random.nextInt(bc - fc - 18); return new Color(r, g, b); } /** * 获取字体 * * @return */ public Font getFont() { return new Font("Arial", Font.PLAIN, 18); } /** * 生成随机图片 * * @param request * @param response */ public void getRandomImage(HttpServletRequest request, HttpServletResponse response) { // 初始化字符串 getRandomString(); // 1.获取Image类 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); // 2.获取图形绘制类Graphics,对图片进行绘制 Graphics graphics = image.getGraphics(); graphics.fillRect(0, 0, width, height); graphics.setFont(getFont()); graphics.setColor(getColor(110, 133)); // 3.绘制干扰线 for (int i = 0; i < lineSize; i++) { drawLine(graphics); } // 4.绘制随机字符 String str = ""; for (int i = 0; i < randomSize; i++) { str = drawString(graphics, str, i); } // 5.加入session request.getSession().removeAttribute(RANDOMCODEKEY); request.getSession().setAttribute(RANDOMCODEKEY, str.toLowerCase()); // 全部加入小写字符 System.out.println(str.toLowerCase()); // 6.处理绘制类 graphics.dispose(); // 7.输出到客户端 try { ImageIO.write(image, "JPEG", response.getOutputStream()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 绘制字符串 * * @param graphics * @param randomStr * @param i * @return */ private String drawString(Graphics graphics, String str, int i) { graphics.setFont(getFont()); graphics.setColor(new Color(random.nextInt(101), random.nextInt(111), random.nextInt(121))); String rand = String.valueOf(getRandomStr(random.nextInt(randomString .length()))); str += rand; graphics.translate(random.nextInt(3), random.nextInt(3)); graphics.drawString(rand, 13 * i, 16); return str; } /** * 通过随机数截取字符 * * @param num * @return */ public String getRandomStr(int num) { return String.valueOf(randomString.charAt(num)); } /** * 绘制干扰线 * * @param graphics */ private void drawLine(Graphics graphics) { int x1 = random.nextInt(width); int y1 = random.nextInt(height); int x2 = random.nextInt(13) + x1; int y2 = random.nextInt(15) + y1; //绘制一条干扰线,从(x1,y1)坐标到,(x2,y2)坐标 graphics.drawLine(x1, y1, x2, y2); } public static void main(String[] args) { System.out.println(); } }
ImageServlet.java
package com.checkcode.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ImageServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("image/jpeg"); // 设置相应类型,告诉浏览器输出的内容为图片 response.setHeader("Pragma", "No-cache"); // 设置响应头信息,告诉浏览器不要缓存此内容 response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expire", 0); RandomValidateCode randomValidateCode = new RandomValidateCode(); try { randomValidateCode.getRandomImage(request, response); // 输出图片方法 } catch (Exception e) { e.printStackTrace(); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
randomCode.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript"> function refresh(obj) { obj.src = "imageServlet?" + Math.random(); } </script> </head> <body> <form action="xxxServlet" method="post"> <label>输入验证码</label><br /> <input type="text" /> <img title="点击更换" onclick="javascript:refresh(this);" src="imageServlet"><br /> <input type="submit" value="登陆"> </form> </body> </html>
web.xml添加servlet配置
<servlet> <servlet-name>imageServlet</servlet-name> <servlet-class>com.checkcode.servlet.ImageServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>imageServlet</servlet-name> <url-pattern>/imageServlet</url-pattern> </servlet-mapping>