`

JAVAWEB项目如何实现验证码

 
阅读更多

转载:JAVAWEB项目如何实现验证码

验证码基础

一.什么是验证码及它的作用

   验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计算机的公共全自动程序,这个问题可以由计算机生成并评判,但是必须只有人类才能解答.可以防止恶意破解密码、刷票、论坛灌水、有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登录。

 

二.图文验证码的原理

   在servlet中随机生成一个指定位置的验证码,一般为四位,然后把该验证码保存到session中.在通过Java的绘图类以图片的形式输出该验证码。为了增加验证码的安全级别,可以输出图片的同时输出干扰线,最后在用户提交数据的时候,在服务器端将用户提交的验证码和Session保存的验证码进行比较。

 

三.验证码所需的技术

    i.因为验证码中的文字,数字,应为都是可变的,故要用到随机生成数技术。

       ii.如果验证码中包含汉字,则要用到汉字生成技术.

       iii.可以使用Ajax技术实现局部刷新

       iv.可以使用图片的缩放和旋转技术,

       vi.随机绘制干扰线(可以是折现,直线等)

       vii.如果考虑到验证码的安全性,可以使用MD5加密.

 

验证码模块实例

1.编写生成英文,数字,汉字随机生成的Servlet类.源代码如下:

[java] view plaincopy
 
  1. package com.servlet;  
  2.   
  3. import java.awt.*;  
  4. import java.awt.geom.*;  
  5. import java.awt.image.*;  
  6. import java.io.*;  
  7. import java.util.*;  
  8.   
  9. import javax.servlet.ServletException;  
  10. import javax.servlet.http.HttpServlet;  
  11. import javax.servlet.http.HttpServletRequest;  
  12. import javax.servlet.http.HttpServletResponse;  
  13. import javax.servlet.http.HttpSession;  
  14. import javax.imageio.ImageIO;  
  15.   
  16. public class PictureCheckCode extends HttpServlet {  
  17.   
  18.     private static final long serialVersionUID = 1L;  
  19.   
  20.     public PictureCheckCode() {  
  21.         super();  
  22.     }  
  23.   
  24.     public void destroy() {  
  25.         super.destroy();   
  26.     }  
  27.   
  28.     public void init() throws ServletException {  
  29.         super.init();  
  30.     }  
  31.     /*该方法主要作用是获得随机生成的颜色*/   
  32.     public Color getRandColor(int s,int e){  
  33.         Random random=new Random ();  
  34.         if(s>255) s=255;  
  35.         if(e>255) e=255;  
  36.         int r,g,b;  
  37.         r=s+random.nextInt(e-s);    //随机生成RGB颜色中的r值  
  38.         g=s+random.nextInt(e-s);    //随机生成RGB颜色中的g值  
  39.         b=s+random.nextInt(e-s);    //随机生成RGB颜色中的b值  
  40.         return new Color(r,g,b);  
  41.     }  
  42.   
  43.     @Override  
  44.     public void service(HttpServletRequest request, HttpServletResponse response)  
  45.             throws ServletException, IOException {  
  46.         //设置不缓存图片  
  47.         response.setHeader("Pragma""No-cache");  
  48.         response.setHeader("Cache-Control""No-cache");  
  49.         response.setDateHeader("Expires"0);  
  50.         //指定生成的响应图片,一定不能缺少这句话,否则错误.  
  51.         response.setContentType("image/jpeg");  
  52.         int width=86,height=22;     //指定生成验证码的宽度和高度  
  53.         BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //创建BufferedImage对象,其作用相当于一图片  
  54.         Graphics g=image.getGraphics();     //创建Graphics对象,其作用相当于画笔  
  55.         Graphics2D g2d=(Graphics2D)g;       //创建Grapchics2D对象  
  56.         Random random=new Random();  
  57.         Font mfont=new Font("楷体",Font.BOLD,16); //定义字体样式  
  58.         g.setColor(getRandColor(200,250));  
  59.         g.fillRect(00, width, height);    //绘制背景  
  60.         g.setFont(mfont);                   //设置字体  
  61.         g.setColor(getRandColor(180,200));  
  62.           
  63.         //绘制100条颜色和位置全部为随机产生的线条,该线条为2f  
  64.         for(int i=0;i<100;i++){  
  65.             int x=random.nextInt(width-1);  
  66.             int y=random.nextInt(height-1);  
  67.             int x1=random.nextInt(6)+1;  
  68.             int y1=random.nextInt(12)+1;  
  69.             BasicStroke bs=new BasicStroke(2f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); //定制线条样式  
  70.             Line2D line=new Line2D.Double(x,y,x+x1,y+y1);  
  71.             g2d.setStroke(bs);  
  72.             g2d.draw(line);     //绘制直线  
  73.         }  
  74.         //输出由英文,数字,和中文随机组成的验证文字,具体的组合方式根据生成随机数确定。  
  75.         String sRand="";  
  76.         String ctmp="";  
  77.         int itmp=0;  
  78.         //制定输出的验证码为四位  
  79.         for(int i=0;i<4;i++){  
  80.             switch(random.nextInt(3)){  
  81.                 case 1:     //生成A-Z的字母  
  82.                      itmp=random.nextInt(26)+65;  
  83.                      ctmp=String.valueOf((char)itmp);  
  84.                      break;  
  85.                 case 2:     //生成汉字  
  86.                      String[] rBase={"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};   
  87.                      //生成第一位区码  
  88.                      int r1=random.nextInt(3)+11;  
  89.                      String str_r1=rBase[r1];  
  90.                      //生成第二位区码  
  91.                      int r2;  
  92.                      if(r1==13){  
  93.                          r2=random.nextInt(7);     
  94.                      }else{  
  95.                          r2=random.nextInt(16);  
  96.                      }  
  97.                      String str_r2=rBase[r2];  
  98.                      //生成第一位位码  
  99.                      int r3=random.nextInt(6)+10;  
  100.                      String str_r3=rBase[r3];  
  101.                      //生成第二位位码  
  102.                      int r4;  
  103.                      if(r3==10){  
  104.                          r4=random.nextInt(15)+1;  
  105.                      }else if(r3==15){  
  106.                          r4=random.nextInt(15);  
  107.                      }else{  
  108.                          r4=random.nextInt(16);  
  109.                      }  
  110.                      String str_r4=rBase[r4];  
  111.                      //将生成的机内码转换为汉字  
  112.                      byte[] bytes=new byte[2];  
  113.                      //将生成的区码保存到字节数组的第一个元素中  
  114.                      String str_12=str_r1+str_r2;  
  115.                      int tempLow=Integer.parseInt(str_12, 16);  
  116.                      bytes[0]=(byte) tempLow;  
  117.                      //将生成的位码保存到字节数组的第二个元素中  
  118.                      String str_34=str_r3+str_r4;  
  119.                      int tempHigh=Integer.parseInt(str_34, 16);  
  120.                      bytes[1]=(byte)tempHigh;  
  121.                      ctmp=new String(bytes);  
  122.                      break;  
  123.                 default:  
  124.                      itmp=random.nextInt(10)+48;  
  125.                      ctmp=String.valueOf((char)itmp);  
  126.                      break;  
  127.             }  
  128.             sRand+=ctmp;  
  129.             Color color=new Color(20+random.nextInt(110),20+random.nextInt(110),random.nextInt(110));  
  130.             g.setColor(color);  
  131.             //将生成的随机数进行随机缩放并旋转制定角度 PS.建议不要对文字进行缩放与旋转,因为这样图片可能不正常显示  
  132.             /*将文字旋转制定角度*/  
  133.             Graphics2D g2d_word=(Graphics2D)g;  
  134.             AffineTransform trans=new AffineTransform();  
  135.             trans.rotate((45)*3.14/180,15*i+8,7);  
  136.             /*缩放文字*/  
  137.             float scaleSize=random.nextFloat()+0.8f;  
  138.             if(scaleSize>1f) scaleSize=1f;  
  139.             trans.scale(scaleSize, scaleSize);  
  140.             g2d_word.setTransform(trans);  
  141.             g.drawString(ctmp, 15*i+1814);  
  142.         }  
  143.         HttpSession session=request.getSession(true);  
  144.         session.setAttribute("randCheckCode", sRand);  
  145.         g.dispose();    //释放g所占用的系统资源  
  146.         ImageIO.write(image,"JPEG",response.getOutputStream()); //输出图片  
  147.     }  
  148. }  

 

 2.配置Servlet

    在web.xml中的配置如下:

[java] view plaincopy
 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5"   
  3.     xmlns="http://java.sun.com/xml/ns/javaee"   
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  7.   <servlet>  
  8.     <description>输出验证码</description>  
  9.     <display-name>This is the display name of my J2EE component</display-name>  
  10.     <servlet-name>PictureCheckCode</servlet-name>  
  11.     <servlet-class><SPAN style="COLOR: #ff0000">com.servlet.PictureCheckCode</SPAN></servlet-class>  
  12.   </servlet>  
  13.   
  14.   <servlet-mapping>  
  15.     <servlet-name>PictureCheckCode</servlet-name>  
  16.     <url-pattern>/<SPAN style="COLOR: #ff0000">PictureCheckCode</SPAN></url-pattern>  
  17.   </servlet-mapping>  
  18.   <welcome-file-list>  
  19.     <welcome-file>index.jsp</welcome-file>  
  20.   </welcome-file-list>  
  21. </web-app>  

3.测试验证码

      可以编写JSP页面来验证是否可以输出验证码图片,JSP代码如下:

    1.index.jsp:显示界面

[java] view plaincopy
 
  1. <%@ page language="java" import="java.util.*" pageEncoding="gbk"%>  
  2.   
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  4. <html>  
  5.     <head>  
  6.         <title>验证码</title>  
  7.         <script language="javascript">  
  8. function myReload() {  
  9.     document.getElementById("CreateCheckCode").src = document  
  10.             .getElementById("CreateCheckCode").src  
  11.             + "?nocache=" + new Date().getTime();  
  12. }  
  13. </script>  
  14.     </head>  
  15.   
  16.     <body>  
  17.         <form action="Check.jsp" method="post">  
  18.             <input name="checkCode" type="text" id="checkCode" title="验证码区分大小写"  
  19.                 size="8" ,maxlength="4" />  
  20.             <img src="PictureCheckCode" id="CreateCheckCode" align="middle">  
  21.             <a href="" onclick="myReload()"> 看不清,换一个</a>  
  22.             <input type="submit" value="提交" />  
  23.         </form>  
  24.     </body>  
  25. </html>  


 

2.Check.jsp :主要验证提交的数据是否和Session中保存的验证码是否相同

[java] view plaincopy
 
  1. <%@ page language="java" import="java.util.*" pageEncoding="gbk"%>  
  2. <html>  
  3.   <head>  
  4.     <title>验证码校验</title>  
  5.   </head>  
  6.     
  7.   <body>  
  8.     <%  
  9.         String checkcode=request.getParameter("checkCode");  
  10.         if(checkcode.equals("")||checkcode==null){  
  11.             out.print("<script>alert('请输入验证码');window.location.href('index.jsp')</script>");  
  12.         }else{  
  13.             if(!checkcode.equalsIgnoreCase((String)session.getAttribute("randCheckCode"))){  
  14.                 out.print("<script>alert('验证码不正确,请重新输入');history.back(-1);</script>");  
  15.             }else{  
  16.                 out.print("登录成功");  
  17.             }  
  18.         }  
  19.      %>  
  20.   </body>  
  21. </html>  


 

 4.工程项目结构,及运行截图 

 
分享到:
评论

相关推荐

    javaweb邮箱发送验证码功能实现

    在JavaWeb开发中,实现邮箱发送验证码功能是常见...总之,JavaWeb中实现邮箱发送验证码功能涉及到配置邮件服务、使用JavaMail API发送邮件以及可能的验证码管理逻辑。确保正确配置并理解这些步骤,就能顺利实现该功能。

    JavaWeb项目生成验证码

    JavaWeb项目生成随机验证码,使用IDEA开发,可以导入到Eclipse和MyEclipse中

    javaWeb 生成验证码程序

    在JavaWeb中,我们通常会使用图片验证码,因为它既易于实现,又能有效防止简单的自动化攻击。 2. **随机生成**:验证码的内容需要随机生成,以确保每次请求时都是不同的。Java中可以使用`Random`类或者`...

    JavaWeb中验证码的实现

    本篇将详细介绍如何在JSP和Servlet中实现验证码功能。 首先,验证码的生成通常涉及到以下几个步骤: 1. **生成随机字符串**:在`ValcodeServlet`的`doGet()`方法中,我们首先创建一个随机数生成器`Random`实例,...

    javaweb_验证码登陆源码

    综上所述,这个"javaweb_验证码登陆源码"项目涉及了Servlet技术的使用、会话管理、验证码生成与验证,以及Web应用程序的基本安全实践。通过理解和学习这些核心概念,开发者可以构建更安全、更健壮的JavaWeb应用程序...

    JAVAWEB验证码功能实现附源代码

    本示例提供的源代码是一个简单的JAVAWEB验证码功能实现,它不依赖任何外部jar包,也不涉及JavaScript,全部采用Java后端处理和JSP页面展示。 验证码的实现主要包括以下几个关键步骤: 1. **生成随机验证码**:在...

    javaWeb验证码

    在JavaWeb开发中,验证码(CAPTCHA)是一种用于...在实际项目中,可以使用开源库如`com.google.recaptcha`或` JCaptcha`来简化验证码的实现。通过学习和理解这些知识点,开发者可以有效地保护网站免受恶意自动化攻击。

    使用Java技术来开发Web应用程序的技术框架,使用该技术实现用户登录验证码功能,后台功能代码+前端JSP页面代码

    在Java Web项目中,实现验证码功能通常遵循以下步骤: 1. **前端发起请求**:用户点击“获取验证码”按钮时,前端通过Ajax等方式向服务器发送请求。 2. **生成验证码ID**:服务器接收到请求后,会生成一个唯一的...

    javaweb项目如何实现手机短信登录

    Javaweb项目实现手机短信登录 在当今的项目中,手机号登录的场景非常多,实现起来也不难。今天,我们将通过演示实现登录过程,需要的朋友可以参考下。 javaweb项目实现手机短信登录的思路 javaweb项目实现手机...

    javaWeb简单的中文验证码

    本教程将深入探讨如何在JavaWeb项目中实现一个简单的中文验证码功能。 首先,我们需要理解验证码的基本原理。验证码通常由服务器生成,它是一个随机的字符串,通过图像展示给用户,用户需要手动输入这个字符串以...

    javaWeb网上书城项目源码(设计以及实现论文).zip

    JavaWeb网上书城项目是一个基于JavaWeb技术的电子商务平台,旨在提供在线图书浏览、选购、支付等服务。这个项目不仅涵盖了基本的Web开发技术,还涉及到数据库管理、用户交互、安全性和性能优化等多个方面。以下将...

    java实现10以内的加减乘验证码

    标签“javaweb”表明这个项目与Java Web开发相关,而“数字验证码”则提示我们验证码是基于数学问题的。在实际应用中,这样的验证码可以用于注册、登录或其他需要防止恶意自动操作的场景。 在项目文件“math_...

    javaweb简单的一次性验证码

    本项目提供的“javaweb简单的一次性验证码”是一个基于Servlet实现的简单验证码系统,旨在帮助初学者理解验证码的工作原理及其在Web应用中的应用。 验证码的主要目的是防止恶意机器人或爬虫进行自动化注册、登录或...

    JavaWeb练手-实现登录注册(含验证码和表单验证)

    在本项目"JavaWeb练手-实现登录注册(含验证码和表单验证)"中,主要涉及了几个关键的JavaWeb开发技术,包括Servlet、HTML、JSP以及验证码和表单验证的实现。以下是这些知识点的详细说明: 1. **Servlet**:Servlet...

    JavaWeb项目常用到的jar包集合.zip

    JavaWeb项目是基于Java平台的Web应用程序,常常用于构建动态网站和企业级应用。为了确保项目的正常运行,开发者需要依赖一系列的外部库,这些库通常被打包成jar(Java Archive)文件。以下是对给定的JavaWeb项目常用...

    javaweb用户验证码登录session例子

    在Java Web开发中,用户登录验证是不可或缺的一部分,而在这个"javaweb用户验证码登录session例子"中,我们将深入探讨如何结合验证码、用户密码以及Session技术来实现安全的登录过程。Session是Web应用中用于跟踪...

    两种javaweb验证码产生方法

    验证码在Java Web开发...在实际项目中,为了提高验证码的安全性,可以结合使用多种验证码技术,例如滑动验证码、点击验证码、语音验证码等。此外,还可以使用第三方服务,如reCAPTCHA,以提供更高的安全性和用户体验。

    JavaWeb 实现验证码功能(demo)

    本篇文章将通过一个简单的DEMO来阐述如何在JavaWeb环境下实现验证码功能。 首先,验证码的主要作用是确保用户是真实的人,而非自动化程序。它通常由一组随机生成的字符组成,用户需要在限定时间内正确输入这些字符...

    java彩色验证码的生成

    在实际项目中,可以将验证码生成和验证封装成一个服务,便于在多个地方复用。标签中的“经典”意味着这种验证码生成方式是一种常用且成熟的技术,尽管现在有更先进的技术如滑动验证、点击验证等,但彩色字符验证码...

Global site tag (gtag.js) - Google Analytics