java生成登录页验证码

版权声明:本文为博主原创文章,如需转载请附上原文链接。 https://blog.csdn.net/Hi_Boy_/article/details/81126534


import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;


/**
 * @Description 生成登录页验证码和验证码图片
 * @Version v1.0
 */
@Controller
@RequestMapping("blue")
public class CodeController {

    /**
     * 日志
     */
    private static Log log = LogFactory.getLog(CodeController.class);

    /**
     * 定义图片的width
     */
    private int width = 160;

    /**
     * 定义图片的height
     */
    private int height = 56;


    /**
     * 字间隔
     */
    private int spacing = 20;

    /**
     * 字高度
     */
    private int fontHeight = 28;

    /**
     * 字行Y轴值
     */
    private int codeY = 35;

    /**
     * @param request  HttpServletRequest
     * @param response HttpServletResponse
     * @return
     * @Description: 返回验证码信息
     * @Author:[email protected]
     * @CreateDate:2015年1月26日 上午10:12:38
     * @Update:
     * @UpdateDate:
     * @UpdateDescription:
     */
    @RequestMapping("code")
    public void getCode(HttpServletRequest request, HttpServletResponse response)
            throws IOException {

        // 定义图像buffer
        BufferedImage buffImg = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);
        // Graphics2D gd = buffImg.createGraphics();
        // Graphics2D gd = (Graphics2D) buffImg.getGraphics();
        Graphics gd = buffImg.getGraphics();
        // 创建一个随机数生成器类
        Random random = new Random();
        // 将图像填充为白色
        gd.setColor(Color.white);
        gd.fillRect(0, 0, width, height);

        // 创建字体,字体的大小应该根据图片的高度来定。
        Font font = new Font("Fixedsys", Font.BOLD, fontHeight);
        // 设置字体。
        gd.setFont(font);

        // 画边框。
//		gd.setColor(Color.BLACK);
//		gd.drawRect(0, 0, width - 1, height - 1);

        // 随机产生40条干扰线,使图象中的认证码不易被其它程序探测到。
		gd.setColor(Color.BLACK);
		for (int i = 0; i < 40; i++) {
			int x = random.nextInt(width);
			int y = random.nextInt(height);
			int xl = random.nextInt(12);
			int yl = random.nextInt(12);
			gd.drawLine(x, y, x + xl, y + yl);
		}

        // randomCode用于保存随机产生的验证码,以便用户登录后进行验证。
        StringBuffer randomCode = new StringBuffer();
        int red = 0, green = 0, blue = 0;

        int p0 = random.nextInt(10), p1 = random.nextInt(10);

        String[] code = new String[]{String.valueOf(p0), "+", String.valueOf(p1), "=", "?"};


        // 随机产生code数字的验证码。
        for (int i = 0; i < code.length; i++) {
            // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。
            red = random.nextInt(255);
            green = random.nextInt(255);
            blue = random.nextInt(255);

            // 用随机产生的颜色将验证码绘制到图像中。
            gd.setColor(new Color(red, green, blue));
            gd.drawString(code[i], (i + 1) * spacing, codeY);

            // 将产生的四个随机数组合在一起。
            randomCode.append(code);
        }
        // 将四位数字的验证码保存到Session中。
        HttpSession session = request.getSession();
        log.debug(randomCode);
        session.setAttribute("code", p0 + p1);

        // 禁止图像缓存。
        response.setHeader("Pragma", "no-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);

        response.setContentType("image/jpeg");

        // 将图像输出到Servlet输出流中。
        ServletOutputStream sos = response.getOutputStream();
        ImageIO.write(buffImg, "jpeg", sos);
        sos.close();
    }

}

猜你喜欢

转载自blog.csdn.net/Hi_Boy_/article/details/81126534