探讨Java验证码制作(上篇)_java

相信大家对验证码这玩意不会陌生,无论是申请账号还是某些情况下登录时都会要求输入验证码。经过统计,验证码一次验证就成功通过的概率是90%,并不高,那么很多人对于这种降低用户体验度的设计肯定会怀疑他的必要性,但黑格尔说过:凡是合乎理性的东西都是现实的;凡是现实的东西都是合乎理性的。接下来我们来了解一下验证码。

验证码是一种区别用户是计算机还是人的公共全自动程序,他被用于防止恶意破解密码、刷票、论坛灌水,防止黑客通过暴力破解方式不断地登录,应用于银行、社区、论坛、投票系统等等。

废话不多说我们来看看我已知的用Java实现验证码的四种方式。

方法一:

第一种方法是我最先想到的,也是实现逻辑最简单的,但效率、安全性极其不高。

具体操作就是:1、用photoshop制作出验证码图片,矩形图片上可有必要的英文字母、数字或中文(如上)

2、将图片显示在swing控件中或是jsp页面中

3、在代码中为每张图片匹配上相应的验证码字符串

4、在提交时获取组件或文本框中的字符串与每张图片的字符串用equals()方法进行比较

缺憾就是制作验证码图片的过程太费时,实现方法极low,极不推荐这样实现,下面的方法将越来越高效美观相对安全。

方法二:

这里讲Java Web,Servlet下的验证码实现,实现起来逻辑还是很清晰的。

省去较简单的实现代码,我们先从前台关键代码说起:

当我们点击"看不清"时,验证码图片会进行一个刷新,会调用一个js函数用于重新设置图片路径来更换图片,请看下面代码,代码中<%=request.getContextPath()%>是为了解决相对路径的问题,可返回站点的根路径,而/servlet/ImageServlet是一个整体,指向的就是ImageServlet这个servlet,为什么要在之前加个/servlet呢,因为我们在web.xml中做了配置映射,可理解为换了个更长的名称。接着看下面js函数,可能有些人会有疑问,为什么获取一个当前时间然后加在路径最后呢,其实这是为了解决浏览器缓存的问题,就是当触发了ImageServlet后虽然验证码图片换了但缓存还没变显示出来的验证码图片不变的问题,借助每时每刻时间不同可以让浏览器缓存失效。

<script type="text/javascript">
  function reloadCode(){
   var time = new Date().getTime();
   document.getElementById("imagecode").src="<%=request.getContextPath() %>/servlet/ImageServlet?d="+time;
  }
 </script>

下面是web.xml中的关键配置信息:

<script type="text/javascript">
 function reloadCode(){
  var time = new Date().getTime();
  document.getElementById("imagecode").src="<%=request.getContextPath() %>/servlet/ImageServlet?d="+time;
 }
 </script>

然后我们看关键的ImageServlet是怎么生成图片的:

<servlet>
  <servlet-name>ImageServlet</servlet-name>
  <servlet-class>com.muke.ImageServlet</servlet-class>
 </servlet>
 <servlet>
  <servlet-name>LoginServlet</servlet-name>
  <servlet-class>com.muke.LoginServlet</servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>ImageServlet</servlet-name>
  <url-pattern>/servlet/ImageServlet</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>LoginServlet</servlet-name>
  <url-pattern>/servlet/LoginServlet</url-pattern>
 </servlet-mapping> 

如果要更生动的描述这种验证码是怎么样来实现的,那么就一个字“画”,听上去和第一种方法类似,还是比较low,但是用代码来自动“画”出验证码效率绝对翻了无数倍。我们来看上述代码,首先实例化了一个BufferedImage对象bi,bi是用来画出那张验证码图片的,然后用bi得到一支画笔g,用g画出了实体的矩形背景,接着用简单的逻辑通过画笔g调用Java中常用的drawString()方法在矩形上画出验证码字符,同时将字符串依次加入StringBuffer可变字符串对象中,最后存入jsp内置对象session中以便提交验证码后的比对,为了显示出验证码,我们还需将生成验证码图片以某种图片格式写入ImageIO流。

下面LoginServlet中可以看出,获取刚刚ImageServlet存入session的字符串就可以进行与验证码提交框中字符串的比对了,可以把字符串都变为小写或大写做一个忽略大小写的处理。

 public class ImageServlet extends HttpServlet {
 public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{
  BufferedImage bi = new BufferedImage(,,BufferedImage.TYPE_INT_RGB);
  Graphics g = bi.getGraphics();
  Color c = new Color(,,);
  g.setColor(c);
  g.fillRect(, , , );
  char[] ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
  Random r = new Random();
  int len=ch.length,index;
  StringBuffer sb = new StringBuffer();
  for(int i=; i<; i++){
  index = r.nextInt(len);
  g.setColor(new Color(r.nextInt(),r.nextInt(),r.nextInt()));
  g.drawString(ch[index]+"", (i*)+, );
  sb.append(ch[index]);
  }
  request.getSession().setAttribute("piccode", sb.toString());
  ImageIO.write(bi, "JPG", response.getOutputStream());
 }
 }

下面是实现图例:

以上所述是小编给大家介绍的Java验证码制作的相关知识,希望对大家有所帮助!后续给大家介绍java验证码制作(下),感兴趣的朋友敬请关注网站!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java验证码
java验证码制作
java制作验证码、java 验证码、java 验证码生成、java短信验证码实现、java 验证码识别,以便于您获取更多的相关知识。

时间: 2024-11-03 04:46:52

探讨Java验证码制作(上篇)_java的相关文章

探讨Java验证码制作(下篇)_java

接着上篇java验证码制作(上篇)给大家介绍有关java验证码的相关知识! 方法三: 用开源组件Jcaptcha实现,与Spring组合使用可产生多种形式的验证码,JCaptcha 即为Java版本的 CAPTCHA 项目,其是一个开源项目,支持生成图形和声音版的验证码,在生成声音版的验证码时,需要使用到 FreeTTS.而CAPTCHA 全称 Completely Automated Public Turing Test to Tell Computers and Humans Apart,最

精致小巧的java相册制作方法_java

本文实例为大家分享了java相册制作方法,供大家参考,具体内容如下   注: 1)html上的图片是静态指定的.当更新了新的图片时必须手工更新.所以使用Servlet读取本地images中的所有图片,动态显示给用户. 2)如果存在中文名的图片,由于get方式无法直接传递中文,会导致出错. 主页面–index.jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8&qu

java验证码生成具体代码_java

本文实例为大家分享了java验证码生成的示例代码,供大家参考,具体内容如下 package com.gonvan.component.captcha; import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Random; import javax.imag

java生成图片验证码实例代码_java

关于java图片验证码的文章最近更新了不少,帮助大家掌握java验证码的生成技术,下文为大家分享了java生成图片验证码最简单的方法,供大家参考. 现在各行业在定制系统时都会考虑到机器注册,现在最有效的方式就是输入验证.现在的验证方式有很多种: 一.问题验证,其实也是图片验证,在图片上生成问题,然后输入框输入答案. 二.图片验证,输入图片上展示的文字信息. 三.短信验证,比较繁杂,用户也不怎么喜欢. 四.还有就是百度最新的验证方式.图片上生成文字,然后出现一个文字点击框,选择你在验证图片上看到的

Java实现图片验证码具体代码_java

本文实例为大家分享了Java图片验证码代码,供大家参考,具体内容如下 网页显示效果: index.jsp 使用两种方式强制图片更新: 1.设置图片输出时不缓存. 2.用js改变请求的地址. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <html> <head> <title>第一个web项目的主页</

java验证码生成的基本流程_java

1.验证码的生成,我们能够看到是用Graphics对象画出来的.对象我们必须要获得Graphics对象 1-1.Graphics对象的获取,要通过BufferedImage获得 <span style="font-size:18px;">int width=100;//确定框框的大小 int height=40; BufferedImage bfi =new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

Java在制作jar包时引用第三方jar包的方法_java

我用的是Eclipse打包,但在CMD窗口执行的时候报"ActiveMQ.jar中没有主清单属性"错误. 在网上搜了下,这个与MANIFEST.MF文件有关,该文件没有定义MAIN方法所在类的路径,利用好压打开jar包,果然如此.里面只有一行 Manifest-Version: 1.0 需添加Main-Class.在本例中,添加如下: Main-Class: com.luoluo.TestUse.activemq.ActiveMQStateMain 上面,有几点需要注意: 1. Mai

探讨Java与Ruby语言迁移时的安全性

在这篇文章中,我们将要探讨Java与Ruby语言迁移时风险预测方面的问题. 通常来说,"使用Ruby具有风险"是一种普遍的看法,这存在一定的原因.因为使用新的语言天生是有风险的.随着Ruby on Rails逐步进入到主流的开发领域中,这样的风险将会随时间逐渐降低,因为有逐步增长的开发者群.组件(或称作gems和plug-ins)相关的书籍.以及业务合作伙伴与你沟通交流.但同时你也可以听到主流的观点指出"使用Java是安全的".对于这种的观点,我持有强烈的反对意见.

java中制作折线图 柱状图 饼状图

问题描述 java中制作折线图 柱状图 饼状图 java中 jfreechart 如何从数据库中读取数据,显示的时候作为一个动态的曲线图展示出来,这个要如何实现?谁有好的建议提一下,或者给个demo看看