在后端生成一个验证码用于返回到前端

@WebServlet("/checkServlet")
public class CheckCode extends HttpServlet {
    private static final int width = 80;
    private static final int height = 30;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        //获得字节输入流对象
        ServletOutputStream sos = resp.getOutputStream();
        //设置浏览器不要缓存此图片
        resp.setHeader("Pragma", "No-cache");
        resp.setHeader("Cache-Control", "no-cache");
        resp.setDateHeader("Expires", 0);
        //创建内存图片并获得其上下文
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
        //获得画笔
        Graphics g = image.getGraphics();
        //产生验证码
        String checkCode = getCheckCode();
        //转发为字符数组
        char[] rands = checkCode.toCharArray();
        //产生图像
        drawBackground(g);//这个是产生了背景图片
        drawRands(g,rands);//这个是产生了验证码在图片上
        //结束绘制过程,完成图像
        g.dispose();
        //将图片输入到客户端
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ImageIO.write(image, "JPEG", bos);
        byte[] bytes = bos.toByteArray();
        resp.setContentLength(bytes.length);
        sos.write(bytes);
        //关流
        sos.close();
        bos.close();
        //将验证码放到Session中
        req.getSession().setAttribute("checkCode", checkCode);
    }

    //定义一个方法获得四位数字的验证码
    private String getCheckCode() {
       String str = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
       int length = str.length();
        StringBuilder sb = new StringBuilder();
        Random r = new Random();
        for (int i = 0; i < 4; i++) {
            int index = r.nextInt(length);
            char c = str.charAt(index);
            sb.append(c);
        }
        return sb.toString();
    }

    //定义一个方法设置图片上的验证码位置
    private  void drawRands(Graphics g,char[] rands) {
        g.setColor(Color.red);
        g.setFont(new Font("楷体",Font.ITALIC,30));
        //在不同高度输入验证码的每一个字符
        g.drawString(""+rands[0] ,1,25);
        g.drawString(""+rands[1] ,20,24);
        g.drawString(""+rands[2] ,40,21);
        g.drawString(""+rands[3] ,60,20);
        System.out.println(rands);
    }

    //定义一个方法用来定义背景图片的大小和位置
    private void drawBackground(Graphics g) {
        //画背景
        g.setColor(Color.black);
        g.fillRect(0, 0, width, height);
        //产生120个干扰点
        for (int i = 0; i < 120; i++) {
            int x = (int) (Math.random() * width);
            int y = (int) (Math.random() * height);
            int red = (int) (Math.random() * 255);
            int green = (int) (Math.random() * 255);
            int blue = (int) (Math.random() * 255);
            g.setColor(new Color(red, green, blue));
            g.drawOval(x, y, 1, 0);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值