验证码的前世与今生
验证码功能是HttpServletResponse的应用之一。
一般认为,验证码的实现方式有两类,第一类是前端实现方式;第二类是后端实现,需要用到Java图片类,通过生成一个图片实现。
在完成项目之前还需要对Maven和Tomcat进行一些基础的配置。这里不做详细的说
上述部署中,我们将这一文件的路径设置为
将主项目Generate Sources Root即Java文件放在com.zhou.servlet文件当中.
在这里,我们要实现的功能是,做一个六位的验证码,且每隔3秒进行一次刷新。下面的图片是项目生成成功之后的效果。
项目实现的大致思路如下
1. 利用Random函数生成一个随机数,将下一个整数从标准输入读取到变量num
中,‘ +“ ” ’将这一数字变成一个空串,其作用相当于是string valueof() 。
2. 利用StringBuffer函数做为缓冲区,利用for循环生成这个随机数,不足的部分补充成0,这样便完成了一个验证码随机数的产生
3.利用JavaWeb中的函数重写HttpServlet中doGet,并利用setHeader设置为每隔3秒进行一次刷新
4. 利用Java中Graphics2D画笔类工具将这一随机数变成图片,这里注意的是我们不能允许浏览器对这一内容进行缓存。(当然缓存也没有意义)
ps:很有意思的是,Java中的画笔工具与CSS中对字体的设置有异曲同工之秒,这里同样适用ITALIC将我们的验证码设置为斜体。
5.将图片送到浏览器,并不往在最后关闭流,释放系统资源。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | package com.zhou.servlet; 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 { //生成随机数 private String makeNum(){ Random random = new Random(); String num = random.nextInt( 99999999 )+ "" ; //变成了一个空串,相当于string valueof() StringBuffer sb = new StringBuffer(); for ( int i = 0 ; i < 7 -num.length(); i++) { sb.append( "0" ); } String s = sb.toString() + num; return num; } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //如何让浏览器5s刷新一次 resp.setHeader( "refresh" , "3" ); //在内存中创建一个图片 BufferedImage image = new BufferedImage( 80 , 20 ,BufferedImage.TYPE_INT_RGB); //需要图片的宽 高 //得到图片 Graphics2D graphics = (Graphics2D) image.getGraphics(); //笔 //设置图片的背景颜色 graphics.setColor(Color.white); graphics.fillRect( 0 , 0 , 80 , 20 ); //给图片写数据 graphics.setColor(Color.blue); graphics.setFont( new Font( null ,Font.ITALIC, 20 )); graphics.drawString(makeNum(), 0 , 20 ); //告诉浏览器,这个请求用图片的形势打开 resp.setContentType( "image/png" ); //网站存在缓存,我们需要不让浏览器缓存 resp.setDateHeader( "expirse" ,- 1 ); resp.setHeader( "Cache-Control" , "no-cache" ); resp.setHeader( "Pragma" , "no-cache" ); //把图片给浏览器 ImageIO.write(image, "png" ,resp.getOutputStream()); // resp.sendRedirect(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super .doPost(req, resp); } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?