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;

@controller
public 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;

@component
public 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 验证码的生成和校验的资料请关注www.887551.com其它相关文章!