Jsp制作验证码

  验证码

  验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。

   Jsp制作验证码

  运行环境:tomcat+eclipse+jdk

  基本思想:现在Servlet上画出验证码的图片,让其显示到页面上,再用js方法能刷新验证码,可以用ajax得到用户输入的值经过servlet跟验证码比对判断是否,并符合提示用户

  基本方法:  

      • BufferedImage: 
          • Image是一个抽象列,BufferedImage是Image的实现。Image和BufferedImage的主要作用就是将一副图片加载到内存中。Java将一副图片加载到内存中的方法是:Java代码  String imgPath = "d:/demo.jpg";  BufferedImage image = ImageIO.read(new FileInputStream(imgPath));  该方法可以获得图片的详细信息,例如:获得图片的宽度:image.getWidth(null);图片只有加载内存中才能对图片进行进一步的处理。
      • Graphics: 
        • Graphics类提供基本的几何图形绘制方法,主要有:画线段、画矩形、画圆、画带颜色的图形、画椭圆、画圆弧、画多边形等,具体操作其内容我推荐可以看看使用Java的Graphics类进行绘图的方法详解

  验证码的代码实现

  我这里做的验证码是显示中文的,可以在servlet中修改想要显示的是数字还是字母还是结合的,可以用数组存放这些,也可以转换ASCII码经行随机数字,看个人喜好

  先是做一个jsp中的验证码的地方

<div class="row cl">
        <div>
          <input  type="text" placeholder="验证码"  value="验证码:"  onblur="testCheck(this.value);">
          <img id="pic" src="CheckTestServlet"> <a id="kanbuq"  onClick="Checktest();">看不清,换一张</a> </div>
 </div>

  在做一个Servlet叫做CheckTestServlet.java

@WebServlet("/CheckTestServlet")
public class CheckTestServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                    //这个方法实现验证码的生成
                    response.setCharacterEncoding("utf-8");
                    //创建图片缓冲区设置其大小    BufferedImage(int width,  int height, int imageType)
                  BufferedImage bImage=new BufferedImage(100, 30, BufferedImage.TYPE_3BYTE_BGR);
                  //在缓冲区上创建画布
                  Graphics g=bImage.getGraphics();
                  //设置背景颜色
                  g.setColor(Color.orange);
                  //创建画布矩形,位置(0,0)点,大小100,30
                  g.fillRect(0, 0, 100, 30);
                  //创建随机对象
                  Random r=new Random();
                  int index;//存放随机数
                  //得到的文字东西存放处
                  StringBuffer sBuffer=new StringBuffer();
                  //循环产生四个字
                  for (int i = 0; i < 4; i++) {
                      //中文字的第一个十六进制码为4e00转十进制是19968,最后一个是9fa0十进制为40869,所以可以产生在此之间的随机数
                      index=r.nextInt(40869-19968+1)+19968;//产生随机数字
                      //设置随机颜色,
                      g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255)));
                      //设置文字的类型,大小
                      g.setFont(new Font("", Font.BOLD, 20));
                      /*画字,将随机数字转换成十六进制Integer.toHexString(index),16)再转换字符(char)(Integer.parseInt,
                      在设置每个文字的位置
                      */
                      g.drawString((char)(Integer.parseInt(Integer.toHexString(index),16))+"", i*22+4, 18);
                     //将其存放在StringBuffer中,以便后面读取作比较
                      sBuffer.append((char)(Integer.parseInt(Integer.toHexString(index),16)));
                }
                  //将得到的文字设置到session中
                  request.getSession().setAttribute("piccode", sBuffer.toString());
                  /*将这个验证码图片读写到页面中
                   * write(RenderedImage im, String formatName, OutputStream output)
                */
                  ImageIO.write(bImage, "jpg", response.getOutputStream());
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

  在做一个js刷新验证码的,用于看不清,或者别的刷新用处

    function Checktest(){
         var time=new Date().getTime();
        $("#pic").attr(‘src‘,"CheckTestServlet?d="+time)
    }

  再写一个Ajax去验证用户输入的是否正确返回提示,这是用jQuery做的,需要引js

function testCheck(num){
        $.ajax({
            type:"post",//提交方式
            url:"TestCheckServlet",//提交地址
            async:true,//是否异步请求
            dataType:"html",//返回类型
            data:{"num":num},//传过去的值
            success:function(data,textStatus){//成功执行的方法
                $("#checks").html(data)
            },
            error:function(){//失败执行的方法
                alert("error");
            }
        })
    } 

  有点麻烦的再去做一个Servlet去验证Ajax传过来的值是否匹配验证码

@WebServlet("/TestCheckServlet")
public class TestCheckServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setCharacterEncoding("utf-8");
        PrintWriter out=response.getWriter();
        //得到输入的验证码与随机的图片验证码作比较,判断是否相等,返回提示用户,
        if (request.getSession().getAttribute("piccode").toString().equals(request.getParameter("num"))) {
            out.println("验证码正确");
        }else {
            out.println("验证码错误");
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

就这样验证码已经基本搞定,其中还有许多需要修改的内容,花样,根据需求而来

   【版本声明】 转载请注释出处   

时间: 2024-10-25 00:57:59

Jsp制作验证码的相关文章

JSP制作简单登陆

JSP制作简单登陆界面 运行环境 eclipse+tomcat+MySQL 不知道的可以参考Jsp运行环境--Tomcat 项目列表 这里我先把jsp文件先放在Web-INF外面访问 需要建立的几个文件在图上.jsp 还要导入MySQL的jar包mysql-5.0.5.jar,导到WEB-INF中的lib文件夹就可以不需要Bulid Path 开始编写代码: 代码演示: index.jsp就好像一般网站的首页一样感觉,将header.jsp和footer.jsp引入其中 <%@ page lan

学习MVC之制作验证码

制作验证码的方法在@洞庭夕照 看到的,原文链接:http://www.cnblogs.com/mzwhj/archive/2012/10/22/2720089.html 现自己利用该方法制作一个简单的验证码,运行程序效果如下: 现正式开始: 1.新建项目:VerificationCodeTest 2.选择模板:基本 3.添加图片: 放置位置: 4.重点来了,新建文件夹Image,再新建一个类Text.cs using System; using System.Collections.Generi

使用jsp生成验证码

在开发中验证码是比较常用到有效防止这种问题对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试的方式. 此演示程序包括三个文件: 1.index.jsp:登录页面 2.image.jsp:生成验证码图片页面 3.result.jsp:结果页面 [页面代码] 1.index.jsp <html> <body> <form method=post action="result.jsp"> <input type=text name=inpu

jsp生成验证码

1 package servlet; 2 3 import java.awt.Color; 4 import java.awt.Font; 5 import java.awt.Graphics; 6 import java.awt.image.BufferedImage; 7 import java.io.IOException; 8 import java.util.Random; 9 10 import javax.imageio.ImageIO; 11 import javax.servl

PHP制作验证码

PHP制作验证码详细教程 效果: myvcode.class.php:封装创建验证码的类 1: <?php 2: /* 3: * file:myvcode.class.php 4: * 验证码类,类名Vcode 5: */ 6: class Vcode 7: { 8: private $width; /*验证码宽度*/ 9: private $height; /*验证码高度*/ 10: private $codeNum; /*验证码字符个数*/ 11: private $checkCode; /

制作验证码时 图片无法刷新

1在网页上制作上图中的验证码时,点击图片不能刷新依旧是原图,找了好久终于发现是js语句中的错误,如下: 如果不加后面的new Date().getTime(),每次请求/AuthCode/getAuthCode都是一样的所以图片不会变化,加上之后每次请求会变化,就会重新加载图片了1 function reload(){                    document.getElementById("bt").src="/AuthCode/getAuthCode?&qu

Jsp+servlet 验证码案例

昨晚在csdn看到一位前辈写一个ajax+servlet+jsp验证.顿时心血来潮,在阅读前辈的代码下我亲手体验一下,做了一个验证码生成工具类.以供大家做个參考. 1:加入VeriyCodeUtils类生成验证码图像 package com.servlet; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import jav

java制作验证码

建立一个web工程 编写servlet,生成图像 package com.imooc; import java.awt.Color; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; import javax.imageio.ImageIO; import javax.servlet.http.HttpServlet

简单制作验证码和绘制图片

今天仍然是完善一般处理程序小项目,但是昨天小小的项目已经终结,今天只是完善一下新的样式罢啦,嘿嘿,我们通常在网上浏览图片时间都会看到图片上面呈现有水印字体的样式,其实这些图片都是通过一些简单的小技术来修饰的:另外我们现在在网上随处可见注册页面,当我们想在一个网站上面注册新的用户时间,需要注册完信息以后填写随机生成的验证码,或者我们想要登录一个网站时间也需要验证码的填写,由此可见,验证码也是我们程序员需要必备的小技术哦,下面就来总结一下这两项小功能的实现. 一.图片上的水印字体 我们可以看到第一张