Servlet在界面当中实现图片验证码

Servlet实现在界面中显示图片验证码功能
创建验证码生成的工具类…方便调用


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

/**
 * @program: ServletDom
 * @description: 验证码生成工具类
 **/
public class VerifyCodeUtil {
    private static final Integer W=100; //设置宽度
    private static final Integer H=40;  //设置高度
    //设置验证码生成库
    private static final String CODE = "abcdefghijkimnABCDEFGHIJKIMN0123456789";
    //设置验证码的字符数量
    private static final Integer CODE_COUNT = 4;
    //干扰线的数量
    private static final Integer LINE_COUNT = 4;

    //创建随机数对象
    static Random random = new Random();

    /**
     * 封装获取Map键值对
     * @return
     */
    public static Map<String, BufferedImage> getMap(){
        //构建一张空白透明的图片,用来生成验证码
        BufferedImage image = new BufferedImage(W,H,BufferedImage.TYPE_INT_BGR);
        //创建画笔;
        Graphics g = image.getGraphics();
        //设置画笔的颜色
        g.setColor(getColor());//存放随机颜色
        //给图片填充背景色
        g.fillRect(0,0,W,H);
        //创建字体对象
        Font font = new Font("黑体",Font.BOLD,25);
        //设置字体
        g.setFont(font);
        //创建可追加字符对象
        StringBuffer sb = new StringBuffer();
        //循环写入验证码
        for (int i=0;i<CODE_COUNT;i++){
            //设置画笔颜色,写入字体的颜色
            g.setColor(getColor());
            //获取验证码字符
            char c = getChar();
            //绘制到图片中           位置    高度
            g.drawString(c+"",i*20+5,25);
            //c+"":将参数c装换成字符串
            sb.append(c);
        }
        //绘制干扰线
        for (int i = 0; i < LINE_COUNT; i++) {
            //设置画笔颜色
            g.setColor(getColor());
            //两点确定一条线
            int xStart=random.nextInt(W+1);
            int yStart=random.nextInt(H+1);
            int xEnd=random.nextInt(W+1);
            int yEnd=random.nextInt(H+1);
            //绘制线条
            g.drawLine(xStart, yStart, xEnd, yEnd);
        }
        //画噪点
        int total = (int) (W*H*0.02);
        for (int i = 0; i < total; i++) {
            //设置画笔颜色
            g.setColor(getColor());
            int x = random.nextInt(W);
            int y = random.nextInt(H);
            //绘制点
            image.setRGB(x,y,getColor().getRGB());
        }
        Map<String,BufferedImage> map = new HashMap<>();
        map.put(sb.toString(),image);
        return map;
    }
    //封装得到图片静态方法
    public static BufferedImage getImage(Map<String,BufferedImage> map){
        Set<Map.Entry<String,BufferedImage>> set = map.entrySet();
        //得到set迭代器
        Iterator<Map.Entry<String, BufferedImage>> iterator = set.iterator();
        //由于此处mao只有一组织,直接得到键值对
        Map.Entry<String,BufferedImage> entry = iterator.next();
        return entry.getValue();
    }
    //封装得到数值静态方法
    public static String getCode(Map<String,BufferedImage> map){
        Set<Map.Entry<String,BufferedImage>> set = map.entrySet();
        //得到set迭代器
        Iterator<Map.Entry<String, BufferedImage>> iterator = set.iterator();
        //由于此处mao只有一组织,直接得到键值对
        Map.Entry<String,BufferedImage> entry = iterator.next();
        return entry.getKey();
    }
    /**
     * 封装随机获取颜色
     * @return
     */
    private static Color getColor(){
        return new Color(random.nextInt(256),random.nextInt(256),random.nextInt(256));
    }

    /**
     * 封装获取验证码字符方法
     * @return
     */
    private static char getChar(){
        //在仓库CODE中随机获取一个
        return CODE.charAt(random.nextInt(36));
    }
}

Servlet控制器 在这里向网页传输图片


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.image.BufferedImage;
import java.io.IOException;
import java.util.Map;

/**
 * @program: ServletDom
 * @description: 验证码图片servlet
 **/
@WebServlet("/imgCode")
public class ImageCodeServlet extends HttpServlet {
    @Override
    public void service(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        //设置响应格式
        response.setContentType("image/jpeg");
        //获得验证码的map
        Map<String, BufferedImage> map = VerifyCodeUtil.getMap();
        //获取map中的图片
        BufferedImage img = VerifyCodeUtil.getImage(map);
        //获取map中的数据
        String code = VerifyCodeUtil.getCode(map);
        System.out.println(code);
        //将图片放入输出流中,写到网页上
        ImageIO.write(img,"jpeg",response.getOutputStream());
    }
}

<html>
	<head>
		<title>Code</title>
		<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
	</head>
	<body onload="date_user()">
		<img id="num" src="imgCode" /> <!--src里的参数写ImageCodeServlet的路径-->
	</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java.小小白

生活不易

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值