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,如需转载请自行联系原作者





相关实践学习
【AI破次元壁合照】少年白马醉春风,函数计算一键部署AI绘画平台
本次实验基于阿里云函数计算产品能力开发AI绘画平台,可让您实现“破次元壁”与角色合照,为角色换背景效果,用AI绘图技术绘出属于自己的少年江湖。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
相关文章
|
5月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
496 4
|
6月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
639 1
|
6月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
750 0
|
9月前
|
缓存 JavaScript 前端开发
鸿蒙5开发宝藏案例分享---Web开发优化案例分享
本文深入解读鸿蒙官方文档中的 `ArkWeb` 性能优化技巧,从预启动进程到预渲染,涵盖预下载、预连接、预取POST等八大优化策略。通过代码示例详解如何提升Web页面加载速度,助你打造流畅的HarmonyOS应用体验。内容实用,按需选用,让H5页面快到飞起!
|
9月前
|
JavaScript 前端开发 API
鸿蒙5开发宝藏案例分享---Web加载时延优化解析
本文深入解析了鸿蒙开发中Web加载完成时延的优化技巧,结合官方案例与实际代码,助你提升性能。核心内容包括:使用DevEco Profiler和DevTools定位瓶颈、四大优化方向(资源合并、接口预取、图片懒加载、任务拆解)及高频手段总结。同时提供性能优化黄金准则,如首屏资源控制在300KB内、关键接口响应≤200ms等,帮助开发者实现丝般流畅体验。
|
前端开发 JavaScript Shell
鸿蒙5开发宝藏案例分享---Web页面内点击响应时延分析
本文为鸿蒙开发者整理了Web性能优化的实战案例解析,结合官方文档深度扩展。内容涵盖点击响应时延核心指标(≤100ms)、性能分析工具链(如DevTools时间线、ArkUI Trace抓取)以及高频优化场景,包括递归函数优化、网络请求阻塞解决方案和setTimeout滥用问题等。同时提供进阶技巧,如首帧加速、透明动画陷阱规避及Web组件初始化加速,并通过优化前后Trace对比展示成果。最后总结了快速定位问题的方法与开发建议,助力开发者提升Web应用性能。
|
9月前
|
JSON 开发框架 自然语言处理
【HarmonyOS Next之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(三)
本文主要介绍了应用开发中的三大核心内容:生命周期管理、资源限定与访问以及多语言支持。在生命周期部分,详细说明了应用和页面的生命周期函数及其触发时机,帮助开发者更好地掌控应用状态变化。资源限定与访问章节,则聚焦于资源限定词的定义、命名规则及匹配逻辑,并阐述了如何通过 `$r` 引用 JS 模块内的资源。最后,多语言支持部分讲解了如何通过 JSON 文件定义多语言资源,使用 `$t` 和 `$tc` 方法实现简单格式化与单复数格式化,为全球化应用提供便利。
328 104
|
9月前
|
JavaScript 前端开发 API
【HarmonyOS Next之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(二)
本文介绍了HarmonyOS应用开发中的HML、CSS和JS语法。HML作为标记语言,支持数据绑定、事件处理、列表渲染等功能;CSS用于样式定义,涵盖尺寸单位、样式导入、选择器及伪类等特性;JS实现业务逻辑,包括ES6语法支持、对象属性、数据方法及事件处理。通过具体代码示例,详细解析了页面构建与交互的实现方式,为开发者提供全面的技术指导。
338 104
|
9月前
|
开发框架 编解码 JavaScript
【HarmonyOS Next之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(一)
该文档详细介绍了一个兼容JS的类Web开发范式的方舟开发框架,涵盖概述、文件组织、js标签配置及app.js等内容。框架采用HML、CSS、JavaScript三段式开发方式,支持单向数据绑定,适合中小型应用开发。文件组织部分说明了目录结构、访问规则和媒体文件格式;js标签配置包括实例名称、页面路由和窗口样式信息;app.js则描述了应用生命周期与对象管理。整体内容旨在帮助开发者快速构建基于方舟框架的应用程序。
354 102
|
7月前
|
前端开发 Java 数据库
Java 项目实战从入门到精通 :Java Web 在线商城项目开发指南
本文介绍了一个基于Java Web的在线商城项目,涵盖技术方案与应用实例。项目采用Spring、Spring MVC和MyBatis框架,结合MySQL数据库,实现商品展示、购物车、用户注册登录等核心功能。通过Spring Boot快速搭建项目结构,使用JPA进行数据持久化,并通过Thymeleaf模板展示页面。项目结构清晰,适合Java Web初学者学习与拓展。
515 1