ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

HttpServletResponse简单应用之生成随机数验证码图片

2022-05-25 18:35:28  阅读:150  来源: 互联网

标签:java resp HttpServletResponse 验证码 随机数 import 生成 图片


声明

本文部分内容参考自其他作者原创文章,仅供个人学习留档,特此声明

参考文章链接

(1条消息) B站---【狂神说Java】JavaWeb入门到实战---笔记_夜里的雨的博客-CSDN博客_狂神说java笔记

生成随机数验证码图片

一定要看代码注释加深理解!

思考一个问题,网页中的验证码功能是如何实现的?

1.之前已经学过了前端相关技术,可以使用前端的知识来生成验证码

2.后端实现:需要用到Java的图片类来生产一张验证码图片

接下来我们用java图片类来生成一张随机的验证码图片

1、代码

1.用于生成随机验证码图片的ImageServlet代码

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
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.Random;

public class ImageServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //让浏览器每隔一段时间刷新一次以实现验证码的自动刷新功能
        resp.setHeader("refresh","3");//让浏览器每3s刷新一次

        //创建一张图片
        BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
        //得到2D图片返回给g
        Graphics2D g = (Graphics2D) image.getGraphics();
        //设置图片的背景颜色
        g.setColor(Color.white);
        g.fillRect(0,0,80,20);//填充起始点为(0,0)也就是2D图片的左上角
        //给图片写数据
        g.setColor(Color.BLUE);//验证码字体为蓝色
        g.setFont(new Font(null,Font.BOLD,20));//设置字体粗细和大小
        g.drawString(makeNum(),0,20);//在2D图片的(0,20)坐标位置画出生成的随机数

        //告诉浏览器,这个请求用图片的方式打开
        resp.setContentType("image/jpeg");

        //网站存在缓存功能,我们不让浏览器缓存该2D图片
        resp.setDateHeader("expires",-1);//Expires:响应过期的日期和时间
        resp.setHeader("Cache-Control","no-cache");//Cache-Control:告诉所有的缓存机制是否可以缓存及缓存类型
        resp.setHeader("Pragma","no-cache");//Pragma:包括实现特定的指令,它可应用到响应链上的任何接收方

        //把图片写给浏览器
        ImageIO.write(image,"jpg", resp.getOutputStream());
    }
    //生成随机数
    private String makeNum(){
        Random random = new Random();
        String num = random.nextInt(9999999) + "";//带参的nextInt(int x)会生成一个范围在0~x(不包含x)内的任意正整数
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < 7-num.length() ; i++) {
            sb.append("0");
        }
        num = sb.toString() + num;
        return num;
    }

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

2.用于注册映射路径的web.xml代码

<servlet>
	<servlet-name>ImageServlet</servlet-name>
	<servlet-class>com.xy.servlet.ImageServlet</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>ImageServlet</servlet-name>
	<url-pattern>/img</url-pattern>
</servlet-mapping>

2、代码测试

如下图所示,生成的随机数验证码图片每过3s刷新一次,每次都是随机的


标签:java,resp,HttpServletResponse,验证码,随机数,import,生成,图片
来源: https://www.cnblogs.com/xypersonal/p/16310306.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有