热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

利用java实现一个web页面校验验证码功能

利用java实现一个web页面校验验证码功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人

利用java实现一个web页面校验验证码功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

验证码生成器:

import javax.imageio.ImageIO; 
import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.util.Date; 
import java.util.Random; 
 
/** 
 * 验证码生成器 
 * 
 * @author 
 */ 
public class ValidateCode { 
 // 图片的宽度。 
 private int width = 160; 
 // 图片的高度。 
 private int height = 40; 
 // 验证码字符个数 
 private int codeCount = 5; 
 // 验证码干扰线数 
 private int lineCount = 150; 
 // 验证码 
 private String code = null; 
 // 验证码图片Buffer 
 private BufferedImage buffImg = null; 
 
 // 验证码范围,去掉0(数字)和O(拼音)容易混淆的(小写的1和L也可以去掉,大写不用了) 
 private char[] codeSequence = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 
   'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 
   'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; 
 
 /** 
  * 默认构造函数,设置默认参数 
  */ 
 public ValidateCode() { 
  this.createCode(); 
 } 
 
 /** 
  * @param width 图片宽 
  * @param height 图片高 
  */ 
 public ValidateCode(int width, int height) { 
  this.width = width; 
  this.height = height; 
  this.createCode(); 
 } 
 
 /** 
  * @param width  图片宽 
  * @param height 图片高 
  * @param codeCount 字符个数 
  * @param lineCount 干扰线条数 
  */ 
 public ValidateCode(int width, int height, int codeCount, int lineCount) { 
  this.width = width; 
  this.height = height; 
  this.codeCount = codeCount; 
  this.lineCount = lineCount; 
  this.createCode(); 
 } 
 
 public void createCode() { 
  int x = 0, fOntHeight= 0, codeY = 0; 
  int red = 0, green = 0, blue = 0; 
 
  x = width / (codeCount + 2);//每个字符的宽度(左右各空出一个字符) 
  fOntHeight= height - 2;//字体的高度 
  codeY = height - 4; 
 
  // 图像buffer 
  buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
  Graphics2D g = buffImg.createGraphics(); 
  // 生成随机数 
  Random random = new Random(); 
  // 将图像填充为白色 
  g.setColor(Color.WHITE); 
  g.fillRect(0, 0, width, height); 
  // 创建字体,可以修改为其它的 
  Font fOnt= new Font("Fixedsys", Font.PLAIN, fontHeight); 
//  Font fOnt= new Font("Times New Roman", Font.ROMAN_BASELINE, fontHeight); 
  g.setFont(font); 
 
  for (int i = 0; i "+path); 
   vCode.write(path); 
  } catch (IOException e) { 
   e.printStackTrace(); 
  } 
 } 
} 

下面是页面JS调用验证码

// 刷新图片 
  function changeImg() { 
   var imgSrc = $("#imgObj"); 
   var url = imgSrc.attr("src"); 
   imgSrc.attr("src", changeUrl(url)); 
  } 
  //为了使每次生成图片不一致,即不让浏览器读缓存,所以需要加上时间戳 
  function changeUrl(url) { 
   var timestamp = (new Date()).valueOf(); 
   var index = url.indexOf("?"); 
   console.log(index); 
   if (index > 0) { 
    url = url.substring(0, url.indexOf("?")); 
   } 
   console.log(url); 
   if ((url.indexOf("&") > 0)) { 
    url = url + "×tamp=" + timestamp; 
    console.log(url); 
   } else { 
    url = url + "?timestamp=" + timestamp; 
    console.log(url); 
    } 
   return url; 
  } 

下面是controller层输出验证码

/** 
 * 响应验证码页面 
 * @return 
 */ 
@RequestMapping(value="/validateCode") 
public String validateCode(HttpServletRequest request,HttpServletResponse response) throws Exception{ 
 // 设置响应的类型格式为图片格式 
 response.setContentType("image/jpeg"); 
 //禁止图像缓存。 
 response.setHeader("Pragma", "no-cache"); 
 response.setHeader("Cache-Control", "no-cache"); 
 response.setDateHeader("Expires", 0); 
 
 HttpSession session = request.getSession(); 
 
 ValidateCode vCode = new ValidateCode(120,40,5,100); 
 session.setAttribute("code", vCode.getCode()); 
 vCode.write(response.getOutputStream()); 
 return null; 
} 

下面是controller层验证验证码输入是否正确

String code = request.getParameter("code"); 
HttpSession session = request.getSession(); 
String sessiOnCode= (String) session.getAttribute("code"); 
if (!StringUtils.equalsIgnoreCase(code, sessionCode)) { //忽略验证码大小写 
 throw new RuntimeException("验证码对应不上code=" + code + " sessiOnCode=" + sessionCode); 
} 


看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程笔记行业资讯频道,感谢您对编程笔记的支持。


推荐阅读
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • React项目中运用React技巧解决实际问题的总结
    本文总结了在React项目中如何运用React技巧解决一些实际问题,包括取消请求和页面卸载的关联,利用useEffect和AbortController等技术实现请求的取消。文章中的代码是简化后的例子,但思想是相通的。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 本文讨论了在ASP中创建RazorFunctions.cshtml文件时出现的问题,即ASP.global_asax不存在于命名空间ASP中。文章提供了解决该问题的代码示例,并详细解释了代码中涉及的关键概念,如HttpContext、Request和RouteData等。通过阅读本文,读者可以了解如何解决该问题并理解相关的ASP概念。 ... [详细]
  • 使用freemaker生成Java代码的步骤及示例代码
    本文介绍了使用freemaker这个jar包生成Java代码的步骤,通过提前编辑好的模板,可以避免写重复代码。首先需要在springboot的pom.xml文件中加入freemaker的依赖包。然后编写模板,定义要生成的Java类的属性和方法。最后编写生成代码的类,通过加载模板文件和数据模型,生成Java代码文件。本文提供了示例代码,并展示了文件目录结构。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 本文介绍了ASP.NET Core MVC的入门及基础使用教程,根据微软的文档学习,建议阅读英文文档以便更好理解,微软的工具化使用方便且开发速度快。通过vs2017新建项目,可以创建一个基础的ASP.NET网站,也可以实现动态网站开发。ASP.NET MVC框架及其工具简化了开发过程,包括建立业务的数据模型和控制器等步骤。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 流数据流和IO流的使用及应用
    本文介绍了流数据流和IO流的基本概念和用法,包括输入流、输出流、字节流、字符流、缓冲区等。同时还介绍了异常处理和常用的流类,如FileReader、FileWriter、FileInputStream、FileOutputStream、OutputStreamWriter、InputStreamReader、BufferedReader、BufferedWriter等。此外,还介绍了系统流和标准流的使用。 ... [详细]
author-avatar
Coco__GLL
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有