验证码

图片验证码简单示例

1、ImageCode.java

复制代码
package com.example.entity;

import java.awt.image.BufferedImage;

/**
 * Description:图片验证码类
 * Package:com.example.entity
 *
 * @author lightbc
 * @version 1.0
 */
public class ImageCode {

    private BufferedImage image;

    public ImageCode(BufferedImage image){
        this.image=image;
    }

    public BufferedImage getImage() {
        return image;
    }

    public void setImage(BufferedImage image) {
        this.image = image;
    }
}
复制代码

2、ImageCodeUtil.java

复制代码
package com.example.utils;

import com.example.entity.ImageCode;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Random;

/**
 * Description:图片二维码处理工具类
 * Package:com.example.utils
 *
 * @author lightbc
 * @version 1.0
 */
public class ImageCodeUtil {

    //随机验证码取值范围
    private static String CODE_RANDOM_RANGE = "0123456789QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm";

    //图片验证码的宽
    private static int IMAGE_CODE_WIDTH = 100;

    //图片验证码的高
    private static int IMAGE_CODE_HEIGHT = 50;

    //验证码的长度
    private static int IMAGE_CODE_LEN = 6;

    private Random random = new Random();

    /**
     * 创建图片验证码
     * @return imagecode对象
     */
    public ImageCode createCode(){
        String sRandom;
        BufferedImage image = new BufferedImage(IMAGE_CODE_WIDTH,IMAGE_CODE_HEIGHT,BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = image.createGraphics();
        //设置图片验证码背景色为白色
        g2.setBackground(Color.white);
        g2.fillRect(0,0,IMAGE_CODE_WIDTH,IMAGE_CODE_HEIGHT);
        g2.setFont(new Font("宋体",Font.ITALIC,30));
        for(int i=0;i<IMAGE_CODE_LEN;i++){
            int randomIndex = random.nextInt(CODE_RANDOM_RANGE.length());
            sRandom=String.valueOf(CODE_RANDOM_RANGE.charAt(randomIndex));
            g2.setColor(createRandomColor(0,100));
            g2.drawString(sRandom,15*i+5,35);
        }
        //在图片验证码中间划条横线
        g2.drawLine(0,IMAGE_CODE_HEIGHT/2,IMAGE_CODE_WIDTH,IMAGE_CODE_HEIGHT/2);
        return new ImageCode(image);
    }

    /**
     * 生成随机RGB颜色
     * @param bc 最小值
     * @param ac 最大值
     * @return color
     */
    public Color createRandomColor(int bc,int ac){
        int r = ac+random.nextInt(ac-bc);
        int g = ac+random.nextInt(ac-bc);
        int b = ac+random.nextInt(ac-bc);
        return new Color(r,g,b);
    }
}
复制代码

3、ImageCodeController.java

复制代码
package com.example.controller;

import com.example.entity.ImageCode;
import com.example.utils.ImageCodeUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Description:图片验证码控制器
 * Package:com.example.controller
 *
 * @author lightbc
 * @version 1.0
 */
@Controller
@RequestMapping("/auth/ic")
public class ImageCodeController {

    @GetMapping(value = "/code/index")
    public String codeIndex(){
        return "code";
    }

    @GetMapping(value = "/get/image/code")
    @ResponseBody
    public void getImageCode(HttpServletRequest request, HttpServletResponse response) throws IOException {
        ImageCode imageCode = new ImageCodeUtil().createCode();
        ImageIO.write(imageCode.getImage(),"JPEG",response.getOutputStream());
    }

}
复制代码

4、效果展示

 

 

posted @   lightbc  阅读(293)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示