验证码

  验证码(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);
} }

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

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

Jsp制作验证码的更多相关文章

  1. (一)学习MVC之制作验证码

    制作验证码的方法在@洞庭夕照 看到的,原文链接:http://www.cnblogs.com/mzwhj/archive/2012/10/22/2720089.html 现自己利用该方法制作一个简单的 ...

  2. 使用jsp生成验证码

    在开发中验证码是比较常用到有效防止这种问题对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试的方式. 此演示程序包括三个文件: 1.index.jsp:登录页面 2.image.jsp:生成 ...

  3. JSP制作简单登陆

    JSP制作简单登陆界面 运行环境 eclipse+tomcat+MySQL 不知道的可以参考Jsp运行环境--Tomcat 项目列表 这里我先把jsp文件先放在Web-INF外面访问 需要建立的几个文 ...

  4. php 制作验证码不显示的问题

    php制作验证码的代码,这里就不多说了,网上有很多的,这里说一些可能遇到的问题. 1. 首先是检查自己的php.ini文件,是否支持gd库. 2.保证代码没有出问题. 3.检查字体文件路径是否正确. ...

  5. 利用Java EE里jsp制作登录界面

    jsp连接数据库.百度经验. 1.在新建的Project中右键新建Floder 2.创建名为lib的包 3.创建完毕之后的工程目录 4.接下来解压你下载的mysql的jar包,拷贝其中的.jar文件 ...

  6. java制作验证码

    建立一个web工程

  7. jsp页面验证码(完整实例)

    项目结构如下,MyEclipse中新建一个Web Project,取名servlet 1.src下new一个servlet类 package com.servlet; import java.awt. ...

  8. java制作验证码(java验证码小程序)

    手动制作java的验证码 Web应用验证码的组成: (1)输入框 (2)显示验证码的图片 验证码的制作流程: 生成验证码的容器使用 j2ee的servlet 生成图片需要的类: (1) Buffere ...

  9. 使用python制作验证码

    方法一 简单型:使用random模块制作一个随机字母与数字的验证码 import random def make_code(n): res='' for i in range(n): num=str( ...

随机推荐

  1. Android 中图片压缩分析(上)

    作者: shawnzhao,QQ音乐技术团队一员 一.前言 在 Android 中进行图片压缩是非常常见的开发场景,主要的压缩方法有两种:其一是质量压缩,其二是下采样压缩. 前者是在不改变图片尺寸的情 ...

  2. Mybatis框架的搭建和基本使用方法

    1.1MyBatis的下载 最新yBatis可以在github官网上下载: https://github.com/mybatis/mybatis-3 1.2 Mybatis Jar包 1.3MyBat ...

  3. 走进Spark生态圈:环境的安装与配置

    什么是Spark? Apache Spark 是一种大规模数据处理的快速通用引擎,使用基于内存的处理方式,较与MapReduce而言,解决了其shuffle多次IO操作带来的效率低问题,从而达到快速的 ...

  4. C#读取数据库返回泛型集合(DataSetToList)

    一般我们用使用ADO.NET查询数据库返回泛型集合使用SqlDataReader逐行读取数据存入对象 代码 }

  5. [转载] JaCoCo:分析单元测试覆盖率的利器

    转载自http://www.ibm.com/developerworks/cn/java/j-lo-jacoco/和http://www.cnblogs.com/chenfengmugu/p/4937 ...

  6. [转载] zookeeper 分布式锁服务

    转载自http://www.cnblogs.com/shanyou/archive/2012/09/22/2697818.html 分布式锁服务在大家的项目中或许用的不多,因为大家都把排他放在数据库那 ...

  7. yaml在python中的应用简单整理

    #简单介绍============================================================== YAML使用寄主语言的数据类型,这在多种语言中流传的时候可能会引 ...

  8. django作业练习

    ---权限管理系统 要求: 1,登陆: a,装饰器判断用户是否已经登陆 b,用户密码使用md5发送 2,注册 a,检测用户是否已经存在,onblur+ajax光标跳出输入框时(使用ajax) 3,注销 ...

  9. [DP]P2890 [USACO07OPEN]便宜的回文Cheapest Palindrome

    题目翻译(借鉴自@ 神犇的蒟蒻) [问题描述] 追踪每头奶牛的去向是一件棘手的任务,为此农夫约翰安装了一套自动系统.他在每头牛身 上安装了一个电子身份标签,当奶牛通过扫描器的时候,系统可以读取奶牛的身 ...

  10. 使用ztree展示树形菜单结构

    官网:http://www.treejs.cn/v3/main.php#_zTreeInfo 一.功能简介 在权限系统中,实现给角色指定菜单权限的功能.主要包括以下几点: 读取全部菜单项,并以树形结构 ...