生成图形验证码

  1. 前端jsp
<img id="imgCaptcha" src="${contextPath}/CaptchaServlet" class="code" onclick="javascript:refresh(this);" />

2.点击图片刷新

function refresh(obj) {
	console.log(obj);
    obj.src = "<%=basePath%>/CaptchaServlet?"+Math.random();  
}

3.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 captchaServlet extends HttpServlet{
	
	@Override
	public 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.getRandcode(request, response);//输出图片方法  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     doGet(req, resp);
		super.doPost(req, resp);
	}
}


RandomValidateCode绘制类

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.ui.Model;

public class RandomValidateCode {
	public static final String RANDOMCODEKEY = "RANDOMVALIDATECODEKEY";// 放到session中的key  
    private Random random = new Random();  
    // 随机产生数字与字母组合的字符串  
    private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";  
    /* 
     * private String randString = "0123456789";//随机产生只有数字的字符串 private String 
     * randString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生只有字母的字符串 
     */  
    private int width = 150;// 图片宽  
    private int height = 45;// 图片高  
    private int lineSize = 80;// 干扰线数量  
    private int stringNum = 4;// 随机产生字符数量  
  
    /* 
     * 获得字体 
     */  
    private Font getFont() {  
        return new Font("Fixedsys", Font.CENTER_BASELINE,38);  
    }  
  
    /* 
     * 获得颜色 
     */  
    private Color getRandColor(int fc, int bc) {  
        if (fc > 255)  
            fc = 255;  
        if (bc > 255)  
            bc = 255;  
        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);  
    }  
  
    /** 
     * 生成随机图片 
     */  
    public void getRandcode(HttpServletRequest request,  
            HttpServletResponse response) {  
        HttpSession session = request.getSession();  
        // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类  
        BufferedImage image = new BufferedImage(width, height,  
                BufferedImage.TYPE_INT_RGB);  
        Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作  
        Graphics2D g2=(Graphics2D)g;
        g2.setBackground(new Color(19, 124, 189));
        g2.fillRect(0, 0, width, height);  
        g2.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 28));  
        g2.setColor(getRandColor(110, 133));  
        
        // 绘制干扰线  
        for (int i = 0; i <= lineSize; i++) {  
            drowLine(g2);  
        }  
        // 绘制随机字符  
        String randomString = "";  
        for (int i = 1; i <= stringNum; i++) {  
            randomString = drowString(g2, randomString, i);  
        }  
        //将生成的随机字符串保存到session中,而jsp界面通过session.getAttribute("RANDOMCODEKEY"),  
        //获得生成的验证码,然后跟用户输入的进行比较  
        session.removeAttribute("RANDOMCODEKEY");  
        session.setAttribute("RANDOMCODEKEY", randomString); 
        g2.dispose();  
        try {  
            // 将内存中的图片通过流动形式输出到客户端  
            ImageIO.write(image, "JPEG", response.getOutputStream());  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
  
    }  
  
    /* 
     * 绘制字符串 
     */  
    private String drowString(Graphics g, String randomString, int i) {  
        g.setFont(getFont());  
        g.setColor(new Color(random.nextInt(101), random.nextInt(111), random  
                .nextInt(121)));  
        String rand = String.valueOf(getRandomString(random.nextInt(randString  
                .length())));  
        randomString += rand;  
        if(i==1){
        	g.translate(random.nextInt(3), 10);  
        }else{
        	g.translate(random.nextInt(3), random.nextInt(3)); 
        }
        
        g.drawString(rand, 23 * i, 26);  
        return randomString;  
    }  
  
    /* 
     * 绘制干扰线 
     */  
    private void drowLine(Graphics g) {  
        int x = random.nextInt(width);  
        int y = random.nextInt(height);  
        int xl = random.nextInt(13);  
        int yl = random.nextInt(15);  
        g.drawLine(x, y, x + xl, y + yl);  
    }  
  
    /* 
     * 获取随机的字符 
     */  
    public String getRandomString(int num) {  
        return String.valueOf(randString.charAt(num));  
    }  
}
原文地址:https://www.cnblogs.com/yonyong/p/11299007.html