SpringBoot 图形验证码的生成和校验

目录1. 编写工具类2. 编写 Controller 中的接口3. 获取验证码图片另一种方法1.添加依赖2.全部代码

1. 编写工具类

package com.cn.beauty.util;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.imageio.ImageIO;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.util.ArrayList;import java.util.Random;public class RandomValidateCodeUtil {    public static final String RANDOMCODEKEY = "MEISHANG-LOGIN-RANDOMVALIDATECODEKEY";//放到session中的key    private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生数字与字母组合的字符串    private int width = 95;// 图片宽    private int height = 40;// 图片高    private int stringNum = 4;// 随机产生字符数量    private static final Logger logger = LoggerFactory.getLogger(RandomValidateCodeUtil.class);    private Random random = new Random();    /**     * 获得字体     */    private Font getFont() {        return new Font("Wide Latin", Font.PLAIN, 18);    }    /**     * 获得颜色(粉色为主)     */    private Color getRandColor() {        ArrayList<Color> colors = new ArrayList<Color>();        colors.add(new Color(241, 158, 194));        colors.add(new Color(255, 94, 226));        colors.add(new Color(255, 156, 177));        colors.add(new Color(245, 152, 217));        colors.add(new Color(255, 85, 81));        colors.add(new Color(245, 152, 251));        int num = random.nextInt(6);        return colors.get(num);    }    /**     * 生成随机图片     */    public void getRandcode(HttpServletRequest request, HttpServletResponse response) {        HttpSession session = request.getSession();        // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);        Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作        g.fillRect(0, 0, width, height);//图片大小        g.setFont(new Font("Wide Latin", Font.PLAIN, 18));//字体大小        g.setColor(getRandColor());//字体颜色        // 添加噪点        float yawpRate = 0.01f;// 噪声率        int area = (int) (yawpRate * width * height);        for (int i = 0; i < area; i++) {            int x = random.nextInt(width);            int y = random.nextInt(height);            image.setRGB(x, y, random.nextInt(255));        }        // 绘制随机字符        String randomString = "";        for (int i = 1; i <= stringNum; i++) {            randomString = drowString(g, randomString, i);        }        logger.info(randomString);        //将生成的随机字符串保存到session中        session.removeAttribute(RANDOMCODEKEY);        session.setAttribute(RANDOMCODEKEY, randomString);        g.dispose();        try {            // 将内存中的图片通过流动形式输出到客户端            ImageIO.write(image, "JPEG", response.getOutputStream());        } catch (Exception e) {            logger.error("将内存中的图片通过流动形式输出到客户端失败>>>>   ", e);        }    }    /**     * 绘制字符串     */    private String drowString(Graphics g, String randomString, int i) {        g.setFont(getFont());        g.setColor(getRandColor());        String rand = String.valueOf(getRandomString(random.nextInt(randString                .length())));        randomString += rand;        g.translate(random.nextInt(3), random.nextInt(3));        g.drawString(rand, 20 * (i - 1) + 3, 25);        return randomString;    }    /**     * 获取随机的字符     */    public String getRandomString(int num) {        return String.valueOf(randString.charAt(num));    }}

2. 编写 Controller 中的接口

/** * @description 生成验证码 */@RequestMapping(value = "/user/getVerify")public void getVerify(HttpServletRequest request, HttpServletResponse response) {    try {        //设置相应类型,告诉浏览器输出的内容为图片        response.setContentType("image/jpeg");        //设置响应头信息,告诉浏览器不要缓存此内容        response.setHeader("Pragma", "No-cache");        response.setHeader("Cache-Control", "no-cache");        response.setDateHeader("Expire", 0);        RandomValidateCodeUtil randomValidateCode = new RandomValidateCodeUtil();        //输出验证码图片方法        randomValidateCode.getRandcode(request, response);    } catch (Exception e) {        log.error("获取验证码失败>>>>", e);    }}/** * @description 校验验证码 */@PostMapping("/user/checkVerify")public boolean checkVerify(@RequestParam String verifyInput, HttpSession session) {    try {        // 从session中获取随机数        String inputStr = verifyInput;        String random = (String) session.getAttribute("MEISHANG-LOGIN-RANDOMVALIDATECODEKEY");        if (random == null) {            return false;        }        if (random.equalsIgnoreCase(inputStr)) {            return true;        } else {            return false;        }    } catch (Exception e) {        log.error("验证码校验失败", e);        return false;    }}

3. 获取验证码图片

访问获取验证码接口

http://127.0.0.1:8605/user/getVerify

效果如下

另一种方法

1.添加依赖

<dependency>            <groupId>com.github.penggle</groupId>            <artifactId>kaptcha</artifactId>            <version>2.3.2</version>        </dependency>                <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>

项目结构

2.全部代码

UserController

package com.yzm.config;import java.util.HashMap;import javax.annotation.Resource;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import com.google.code.kaptcha.impl.DefaultKaptcha;import com.yzm.utils.Util;@Controllerpublic class TestControler {     @Resource    private DefaultKaptcha captchaProducer;    /**     * 登录验证码SessionKey     */    public static final String LOGIN_VALIDATE_CODE = "login_validate_code";    /**     * 登录验证码图片     */    @RequestMapping(value = {"/loginValidateCode"})    public void loginValidateCode(HttpServletRequest request, HttpServletResponse response) throws Exception{        Util.validateCode(request,response,captchaProducer,LOGIN_VALIDATE_CODE);    }     /**     * 检查验证码是否正确     */    @RequestMapping("/checkLoginValidateCode")    @ResponseBody    public HashMap checkLoginValidateCode(HttpServletRequest request,@RequestParam("validateCode")String validateCode) {        String loginValidateCode = request.getSession().getAttribute(LOGIN_VALIDATE_CODE).toString();        HashMap<String,Object> map = new HashMap<String,Object>();        if(loginValidateCode == null){            map.put("status",null);//验证码过期        }else if(loginValidateCode.equals(validateCode)){            map.put("status",true);//验证码正确        }else if(!loginValidateCode.equals(validateCode)){            map.put("status",false);//验证码不正确        }        map.put("code",200);        return map;    }}package com.yzm.controller;import java.util.Properties;import org.springframework.context.annotation.Bean;import org.springframework.stereotype.Component;import com.google.code.kaptcha.impl.DefaultKaptcha;import com.google.code.kaptcha.util.Config;@Componentpublic class TestConfig {     @Bean    public DefaultKaptcha getDefaultKaptcha() {        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();        Properties properties = new Properties();        // 图片边框        properties.setProperty("kaptcha.border", "no");        // 边框颜色        properties.setProperty("kaptcha.border.color", "black");        //边框厚度        properties.setProperty("kaptcha.border.thickness", "1");        // 图片宽        properties.setProperty("kaptcha.image.width", "200");        // 图片高        properties.setProperty("kaptcha.image.height", "50");        //图片实现类        properties.setProperty("kaptcha.producer.impl", "com.google.code.kaptcha.impl.DefaultKaptcha");        //文本实现类        properties.setProperty("kaptcha.textproducer.impl", "com.google.code.kaptcha.text.impl.DefaultTextCreator");        //文本集合,验证码值从此集合中获取        properties.setProperty("kaptcha.textproducer.char.string", "01234567890");        //验证码长度        properties.setProperty("kaptcha.textproducer.char.length", "4");        //字体        properties.setProperty("kaptcha.textproducer.font.names", "宋体");        //字体颜色        properties.setProperty("kaptcha.textproducer.font.color", "black");        //文字间隔        properties.setProperty("kaptcha.textproducer.char.space", "5");        //干扰实现类        properties.setProperty("kaptcha.noise.impl", "com.google.code.kaptcha.impl.DefaultNoise");        //干扰颜色        properties.setProperty("kaptcha.noise.color", "blue");        //干扰图片样式        properties.setProperty("kaptcha.obscurificator.impl", "com.google.code.kaptcha.impl.WaterRipple");        //背景实现类        properties.setProperty("kaptcha.background.impl", "com.google.code.kaptcha.impl.DefaultBackground");        //背景颜色渐变,结束颜色        properties.setProperty("kaptcha.background.clear.to", "white");        //文字渲染器        properties.setProperty("kaptcha.word.impl", "com.google.code.kaptcha.text.impl.DefaultWordRenderer");        Config config = new Config(properties);        defaultKaptcha.setConfig(config);        return defaultKaptcha;    } }

Util

package com.yzm.utils;import java.awt.image.BufferedImage;import javax.imageio.ImageIO;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.google.code.kaptcha.impl.DefaultKaptcha;public class Util {         /**     * 生成验证码图片     * @param request 设置session     * @param response 转成图片     * @param captchaProducer 生成图片方法类     * @param validateSessionKey session名称     * @throws Exception     */    public static void validateCode(HttpServletRequest request, HttpServletResponse response, DefaultKaptcha captchaProducer, String validateSessionKey) throws Exception{        // Set to expire far in the past.        response.setDateHeader("Expires", 0);        // Set standard HTTP/1.1 no-cache headers.        response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");        // Set IE extended HTTP/1.1 no-cache headers (use addHeader).        response.addHeader("Cache-Control", "post-check=0, pre-check=0");        // Set standard HTTP/1.0 no-cache header.        response.setHeader("Pragma", "no-cache");         // return a jpeg        response.setContentType("image/jpeg");         // create the text for the image        String capText = captchaProducer.createText();         // store the text in the session        request.getSession().setAttribute(validateSessionKey, capText);         // create the image with the text        BufferedImage bi = captchaProducer.createImage(capText);         ServletOutputStream out = response.getOutputStream();         // write the data out        ImageIO.write(bi, "jpg", out);        try {            out.flush();        } finally {            out.close();        }    }}

以上就是SpringBoot 图形验证码的生成和校验的详细内容,更多关于SpringBoot 验证码的生成和校验的资料请关注其它相关文章!

可就是这样,还是有人,期望过多的温暖。

SpringBoot 图形验证码的生成和校验

相关文章:

你感兴趣的文章:

标签云: