Java Web开发中验证码的实现(JSP验证码)

简介:

通常的登录注册系统都会要求输入验证码以区别用户行为和计算机程序行为来防止恶意注册、暴力破解密码等。

Jsp或者Java Web开发中通常用 Java 的 Graphics 绘制验证码图片然后用ImageIO输出为Jpg等格式的图片再通过Session来验证输入内容与验证码内容的一致性。

具体代码和步骤如下:

1.生成验证码的Servlet

 

 
  1. Java 代码复制内容到剪贴板  
  2.       
  3. import java.io.IOException;            
  4. import javax.servlet.ServletException;            
  5. import javax.servlet.http.HttpServlet;            
  6. import javax.servlet.http.HttpServletRequest;            
  7. import javax.servlet.http.HttpServletResponse;            
  8. import javax.servlet.http.HttpSession;            
  9. import java.util.*;            
  10. import java.awt.*;            
  11. import java.awt.image.*;            
  12.             
  13. import javax.imageio.*;            
  14. /**       
  15. *         
  16. * @author mzba       
  17. *       
  18. */          
  19. public class GetCaptcha extends HttpServlet {            
  20.     private static final long serialVersionUID = 1L;            
  21.             
  22.     /**         
  23.      * @see HttpServlet#HttpServlet()         
  24.      */            
  25.     public GetCaptcha() {            
  26.         super();            
  27.         // TODO Auto-generated constructor stub            
  28.     }            
  29.             
  30.     /**         
  31.      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse         
  32.      *      response)         
  33.      */            
  34.     protected void doGet(HttpServletRequest request,            
  35.             HttpServletResponse response) throws ServletException, IOException {            
  36.         response.setContentType("image/jpeg");            
  37.         response.setHeader("Pragma", "No-cache");            
  38.         response.setHeader("Cache-Control", "no-cache");            
  39.         response.setDateHeader("Expires", 0);            
  40.         HttpSession session = request.getSession();            
  41.         // 在内存中创建图象            
  42.         int width = 75height = 25;            
  43.         BufferedImage image = new BufferedImage(width, height,            
  44.                 BufferedImage.TYPE_INT_RGB);            
  45.         // 获取图形上下文            
  46.         Graphics g = image.getGraphics();            
  47.         // 生成随机类            
  48.         Random random = new Random();            
  49.         // 设定背景色            
  50.         g.setColor(getRandColor(200, 250));            
  51.         g.fillRect(0, 0, width, height);            
  52.         // 设定字体            
  53.         g.setFont(new Font("Times New Roman", Font.PLAIN, 24));            
  54.         // 画边框            
  55.         g.setColor(getRandColor(160, 200));            
  56.         g.drawRect(0, 0, width - 1, height - 1);            
  57.         // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到            
  58.         g.setColor(getRandColor(160, 200));            
  59.         for (int i = 0; i < 155; i++) {            
  60.             int x = random.nextInt(width);            
  61.             int y = random.nextInt(height);            
  62.             int xl = random.nextInt(12);            
  63.             int yl = random.nextInt(12);            
  64.             g.drawLine(x, y, x + xl, y + yl);            
  65.         }            
  66.         // 取随机产生的认证码(4位数字)            
  67.         String sRand = "";            
  68.         for (int i = 0; i < 4; i++) {            
  69.             String rand = String.valueOf(random.nextInt(10));            
  70.             sRand += rand;            
  71.             // 将认证码显示到图象中            
  72.             g.setColor(new Color(20 + random.nextInt(110), 20 + random            
  73.                     .nextInt(110), 20 + random.nextInt(110)));            
  74.             // 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成            
  75.             g.drawString(rand, 13 * i + 14, 20);            
  76.         }            
  77.             
  78.         // 将认证码存入SESSION            
  79.         session.setAttribute("vcode", sRand);            
  80.             
  81.         // 图象生效            
  82.         g.dispose();            
  83.         // 输出图象到页面            
  84.         ImageIO.write(image, "JPEG", response.getOutputStream());            
  85.     }            
  86.             
  87.     /**         
  88.      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse         
  89.      *      response)         
  90.      */            
  91.     protected void doPost(HttpServletRequest request,            
  92.             HttpServletResponse response) throws ServletException, IOException {            
  93.         // TODO Auto-generated method stub            
  94.     }            
  95.             
  96.     Color getRandColor(int fc, int bc) {// 给定范围获得随机颜色            
  97.         Random random = new Random();            
  98.         if (fc > 255)            
  99.             fc = 255;            
  100.         if (bc > 255)            
  101.             bc = 255;            
  102.         int r = fc + random.nextInt(bc - fc);            
  103.         int g = fc + random.nextInt(bc - fc);            
  104.         int b = fc + random.nextInt(bc - fc);            
  105.         return new Color(r, g, b);            
  106.     }            
  107.             
  108. }        

2.web.xml中添加上面Servlet的映射信息


 

 
  1. XML/HTML 代码复制内容到剪贴板  
  2.       
  3. <servlet>            
  4.    <description>用于生成验证码</description>            
  5.    <display-name>生成验证码</display-name>            
  6.    <servlet-name>GetCaptcha</servlet-name>            
  7.    <servlet-class>servlets.GetCaptcha</servlet-class>            
  8. </servlet>            
  9.           
  10. <servlet-mapping>            
  11.   <servlet-name>GetCaptcha</servlet-name>            
  12.   <url-pattern>/getcaptcha.sl</url-pattern>            
  13. </servlet-mapping>    

3.在前台界面中调用此Servlet

 

 
  1. XML/HTML 代码复制内容到剪贴板  
  2.       
  3. <img src="getcaptcha.sl" alt="验证码" name="checkImg" id="checkImg" style="position:relative; top:5px; left:20px; " onClick="document.getElementById('checkImg').src='getcaptcha.sl?temp='+ (new Date().getTime().toString(36)); return false"/>        

 



     本文转自06peng 51CTO博客,原文链接:http://blog.51cto.com/06peng/962391,如需转载请自行联系原作者





相关实践学习
【玩转ComfyUI】基于函数计算一键部署AI生图平台ComfyUI
本次实验将带大家通过使用阿里云产品函数计算FC,快速使用ComfyUI实现更高质量的图像生成。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
相关文章
|
9月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
640 4
|
10月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
823 1
|
10月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
1239 0
|
9月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
安全 Java 领域建模
Java 17 探秘:不容错过的现代开发利器
Java 17 探秘:不容错过的现代开发利器
1251 0
|
11月前
|
JavaScript Java 微服务
现代化 Java Web 在线商城项目技术方案与实战开发流程及核心功能实现详解
本项目基于Spring Boot 3与Vue 3构建现代化在线商城系统,采用微服务架构,整合Spring Cloud、Redis、MySQL等技术,涵盖用户认证、商品管理、购物车功能,并支持Docker容器化部署与Kubernetes编排。提供完整CI/CD流程,助力高效开发与扩展。
1135 64
|
10月前
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
11月前
|
JavaScript 安全 前端开发
Java开发:最新技术驱动的病人挂号系统实操指南与全流程操作技巧汇总
本文介绍基于Spring Boot 3.x、Vue 3等最新技术构建现代化病人挂号系统,涵盖技术选型、核心功能实现与部署方案,助力开发者快速搭建高效、安全的医疗挂号平台。
476 3
|
11月前
|
安全 Java 数据库
Java 项目实战病人挂号系统网站设计开发步骤及核心功能实现指南
本文介绍了基于Java的病人挂号系统网站的技术方案与应用实例,涵盖SSM与Spring Boot框架选型、数据库设计、功能模块划分及安全机制实现。系统支持患者在线注册、登录、挂号与预约,管理员可进行医院信息与排班管理。通过实际案例展示系统开发流程与核心代码实现,为Java Web医疗项目开发提供参考。
484 2