JSP/Servlet||cms生成验证码示例

本文通过一个CheckCodeServlet示例,详细讲解如何在CMS系统中生成并使用验证码。代码包括随机数生成、服务器端验证码创建、存储到Session以及生成验证码图片的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

具体解析看代码注释

 

需要一个CheckCodeServlet完成下面的功能

  • 创建一个生成随机数的方法
//生成随机数据的函数
private int generRandomInt(int start,int range){
	return new Random().nextInt(range - start) + start;
}
  • 服务器端随机生成验证码
    //随机生成验证码
    //创建一个包含所有我们的随机验证码中要出现的字符的字符串
    String str = "abcdefghijklmnopqrstuvwxyz0123456789";
    //获取这个串的长度
    int len = str.length();
    //创建一个字符列表,存验证码
    ArrayList<String> cs = new ArrayList<>() ;
    for (int i = 0 ; i < 4 ; i++) {
    //生成一个0 - len之间的随机数
    int index = generRandomInt(0,len);
    // 获取随机的字符
    char c = str.charAt(index);
    // 追加进字符列表
    cs.add(String.valueOf(c));
    }
  • 验证码存入Session
//存入session
request.getSession().setAttribute("checkcode",cs);
  • 生成验证码图片
//生成验证码图片
        //生成图片缓存
        BufferedImage img = new BufferedImage(44,20,BufferedImage.TYPE_INT_ARGB);
        //拿到画笔 Graphics
        Graphics2D g2 = (Graphics2D) img.getGraphics();
        //设置画笔前景色
        g2.setColor(Color.WHITE);
        // 因为缓存默认背景是黑色,改图片背景白色
        g2.fillRect(0,0,44,20);
        //字符的初始偏移量
        int offset = 5;
        // 字符战胜的宽度
        int width = 8;
        //生成位置
        int x = offset;
        int y = 18;
        // 在白色背景上画出验证码
        for(int i = 0 ; i < 4 ; i++){
            //先要把前景改为其它颜色
            //随机生成红绿兰透明度四个值,每个是0-255之间的随机数
            int r = generRandomInt(0,100);
            int g = generRandomInt(0,100);
            int b = generRandomInt(0,100);
            int a = 255;generRandomInt(0,100);
            Color c = new Color(r,g,b,a);
            //把前景色设置成随机的色彩
            g2.setColor(c);
            //画字符
            g2.drawString(cs.get(i),x + (width * i),y);
        }
//设置mime类型
        response.setContentType("image/png");
        //生成图片并写到客户端
        ImageIO.write(img,"png",response.getOutputStream());

实现的完整代码:

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;

//生成验证码,响应给客户端
@WebServlet(name = "CheckCodeServlet",urlPatterns = "/backend/images/checkcodes.png")
public class CheckCodeServlet extends HttpServlet {
    //生成随机数据的函数
    private int generRandomInt(int start,int range){
        return new Random().nextInt(range - start) + start;
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //随机生成验证码
        //创建一个包含所有我们的随机验证码中要出现的字符的字符串
        String str = "abcdefghijklmnopqrstuvwxyz0123456789";
        //获取这个串的长度
        int len = str.length();
        //创建一个字符列表,存验证码
        ArrayList<String> cs = new ArrayList<>() ;
        for (int i = 0 ; i < 4 ; i++) {
            //生成一个0 - len之间的随机数
            int index = generRandomInt(0,len);
            // 获取随机的字符
            char c = str.charAt(index);
            // 追加进字符列表
            cs.add(String.valueOf(c));
        }

        //存入session
        request.getSession().setAttribute("checkcode",cs);

        //生成验证码图片
        //生成图片缓存
        BufferedImage img = new BufferedImage(44,20,BufferedImage.TYPE_INT_ARGB);
        //拿到画笔 Graphics
        Graphics2D g2 = (Graphics2D) img.getGraphics();
        //设置画笔前景色
        g2.setColor(Color.WHITE);
        // 因为缓存默认背景是黑色,改图片背景白色
        g2.fillRect(0,0,44,20);
        //字符的初始偏移量
        int offset = 5;
        // 字符战胜的宽度
        int width = 8;
        //生成位置
        int x = offset;
        int y = 18;
        // 在白色背景上画出验证码
        for(int i = 0 ; i < 4 ; i++){
            //先要把前景改为其它颜色
            //随机生成红绿兰透明度四个值,每个是0-255之间的随机数
            int r = generRandomInt(0,100);
            int g = generRandomInt(0,100);
            int b = generRandomInt(0,100);
            int a = 255;generRandomInt(0,100);
            Color c = new Color(r,g,b,a);
            //把前景色设置成随机的色彩
            g2.setColor(c);
            //画字符
            g2.drawString(cs.get(i),x + (width * i),y);
        }
        //设置mime类型
        response.setContentType("image/png");
        //生成图片并写到客户端
        ImageIO.write(img,"png",response.getOutputStream());
    }

}

注意,我们上面示例的路径/backend/images/checkcodes.png 所以,我们要在所设定的jsp文件里增加路径,这个根据读者的项目,合理引用,这里这是提供一个可以实现生成验证码的示例

测试页面

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值