验证码

  验证码(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. GPIO复位功能说明

    根据STM32L0x3参考手册RM0367,每个General-Purpose IO口,有以下寄存器: 1.4个32位的控制寄存器,分别为GPIOx_MODER,GPIOx_OTYPER,GPIOx_ ...

  2. Mac上编译并运行Android5.0源码

    下载.配置环境.build和运行参考的都是Android Source提供的文档,包括:Initializing a Build Environment,Downloading the Source和 ...

  3. 通过Xshell连接CentOS虚拟机

    1.通过"setup"配置网络ip(CentOS7不支持setup配置) 2.通过"service network restart"来重启网络服务 3.&quo ...

  4. C#实现的apache htpasswd加密

    一.VisualSvn Server 这个软件大家都知道,具体使用时创建用户名密码和组时,每次都要登陆到VisualSvn Server所在的机器上,次次如此... 由于一些原因要把这个用户管理的功能 ...

  5. 【朝花夕拾】朝花夕拾-Robot Framework实战演练之开篇

    (原创文章,转载请注明出处.) 开博了,简单感慨两句. 前些年一直在做质量体系建设及团队管理的事,忽略了对测试技术热度的保持,这两年有幸重回开发测试第一线,颇感欣喜. 近期随着公司新业务的开展,需要快 ...

  6. Nginx+Tomcat+Redis实现持久会话

    使用开源web应用solo blog进行项目演示.前端使用Nginx作为负载均衡器,后端Tomcat连接Redis实现session存储.Redis的特点就是可以将session持久化.样才能真正实现 ...

  7. 老男孩最新Python全栈开发视频教程(92天全)重点内容梳理笔记 看完就是全栈开发工程师

    为什么要写这个系列博客呢? 说来讽刺,91年生人的我,同龄人大多有一份事业,或者有一个家庭了.而我,念了次985大学,年少轻狂,在大学期间迷信创业,觉得大学里的许多课程如同吃翔一样学了几乎一辈子都用不 ...

  8. Kaggle Challenge简要介绍

    https://en.wikipedia.org/wiki/Kaggle 以下内容,直接摘自维基百科,主要起到一个记录的作用,提醒自己有时间关注关注这个竞赛. Kaggle is a platform ...

  9. Bin、App_Data等文件夹详述(转自http://blog.csdn.net/zzjiadw/article/details/6801506)

    ASP.NET应用程序和ASP.Net网站所共有的文件: App_Browsers 包含 ASP.NET 用于标识个别浏览器并确定其功能的浏览器定义 (.browser) 文件.有关更多信息,请参见浏 ...

  10. makefile中伪目标的理解

    1. 我们知道Makefile中的语法是这样: target ... : prerequisites ... command - - 2. 假如编译两个文件可以这么写: a.o:a.c  gcc -c ...