当前位置: 代码迷 >> Web前端 >> 您能通过这个验证码的验证么
  详细解决方案

您能通过这个验证码的验证么

热度:257   发布时间:2012-09-16 17:33:16.0
你能通过这个验证码的验证么?


    你能通过这个网站验证码的验证么?    

    读者先可以进入这个网站,看看这个网站的验证码你是否能够通过此网站验证码的验证.它的要求很简单,用鼠标在下面绘出和上面的图片一样的图片.但是真正的做起来.....

计算机生成了可选文字: paintwhatyouseebyusingthemousebelowthenSubmit.补:.'.:.;已口口k日口:曰口:‘目石.口『',白L1subm.tJ个backtotop

 

那么什么是验证码呢?

     验证码(CAPTCHA)是“CompletelyAutomated Public Turing test to tell Computers and HumansApart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机和人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试.

     上面例子只是作为一个引子和示例,知道还有这种验证码就好,如果有兴趣的话可以进行尝试,挑战一下自己.验证码主要的目的是防止恶意破解密码、刷票、论坛灌水、刷页,区分人和机器.不过上面的小例子估计很少有人能够通过..

     上面例子所示的是一种验证码的形式,当然还有其他类型: 普通图片验证码,动画验证码,声音验证码,短信验证码,视频验证码等等..

     接下来我们了解一下验证码的相关原理,验证码就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰,例如随机画数条直线,画一些点(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。

通过以上的内容我们简单的了解并回顾了一下验证码相关的概念,接下来我将用一个实例来展示如何在一个项目中运用简单的验证码功能.

    验证码的java实例

首先建立一个servlet,主要功能是绘制出随机数字和简单的干扰图形.


package com.bjpowernode.drp.util.servlet;



import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.image.BufferedImage;

import java.io.IOException;

import java.util.Random;



import javax.imageio.ImageIO;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;



public class AuthImageServlet extends HttpServlet 

{ 

    

        private static final String CONTENT_TYPE = "text/html; charset=gb2312"; 

        //设置字母的大小,大小 

        private Font mFont = new Font("Times New Roman", Font.PLAIN, 17); 

        public void init() throws ServletException 

        { 

                super.init(); 

        } 

		   //获取随机颜色
  
        Color getRandColor(int fc,int bc) 

        { 

                Random random = new Random(); 

                if(fc>255) fc=255; 

                if(bc>255) bc=255; 

                int r=fc+random.nextInt(bc-fc); 

                int g=fc+random.nextInt(bc-fc); 

                int b=fc+random.nextInt(bc-fc); 

                return new Color(r,g,b); 

        } 

    

        public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 

        { 

                response.setHeader("Pragma","No-cache"); 

                response.setHeader("Cache-Control","no-cache"); 

                response.setDateHeader("Expires", 0); 

                //表明生成的响应是图片 

                response.setContentType("image/jpeg"); 

                      

                int width=100, height=18; 

                BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 

                      

                Graphics g = image.getGraphics(); 

                Random random = new Random(); 

                g.setColor(getRandColor(200,250)); 

                g.fillRect(1, 1, width-1, height-1); 

                g.setColor(new Color(102,102,102)); 

                g.drawRect(0, 0, width-1, height-1); 

                g.setFont(mFont); 

    

                g.setColor(getRandColor(160,200)); 

    

                //画随机线 

                for (int i=0;i<155;i++) 

                { 

                        int x = random.nextInt(width - 1); 

                        int y = random.nextInt(height - 1); 

                        int xl = random.nextInt(6) + 1; 

                        int yl = random.nextInt(12) + 1; 

                        g.drawLine(x,y,x + xl,y + yl); 

                } 

    

                //从另一方向画随机线 

                for (int i = 0;i < 70;i++) 

                { 

                        int x = random.nextInt(width - 1); 

                        int y = random.nextInt(height - 1); 

                        int xl = random.nextInt(12) + 1; 

                        int yl = random.nextInt(6) + 1; 

                        g.drawLine(x,y,x - xl,y - yl); 

                } 

    

                //生成随机数,并将随机数字转换为字母 

                String sRand=""; 

                for (int i=0;i<6;i++) 

                { 

                        int itmp = random.nextInt(26) + 65; 

                        char ctmp = (char)itmp; 

                        sRand += String.valueOf(ctmp); 

                        g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110))); 

                        g.drawString(String.valueOf(ctmp),15*i+10,16); 

                } 

    
                                  //获取session,并将相关随机数字存放在session中,用于验证.
                HttpSession session = request.getSession(true); 

                session.setAttribute("rand",sRand); 

                g.dispose(); 

                ImageIO.write(image, "JPEG", response.getOutputStream()); 

        } 

        public void destroy() 

        { 

        } 



将AuthImageServlet配置到Web.xml中 


<!-- 验证码Servlet----AuthImageServlet -->
			
	<servlet>
		<servlet-name>AuthImageServlet</servlet-name>
		<servlet-class>com.bjpowernode.drp.util.servlet.AuthImageServlet</servlet-class>
	</servlet>
			
	<servlet-mapping>
		<servlet-name>AuthImageServlet</servlet-name>
		<url-pattern>/servlet/AuthImageServlet</url-pattern>
	</servlet-mapping>

在登录页面中设置验证码图片的路径其他标签在此省略. 


<img src="${pageContext.request.contextPath }/servlet/AuthImageServlet">


在登录页面中加入相关的java验证代码,如下:


	<%
	    ....与登录相关的代码
	    //获取验证码
	    String authImage=request.getParameter("authImage");
	    		
	    //判断验证码是否和session中的验证码一致
	   if(authImage.trim().equalsIgnoreCase((String)session.getAttribute("rand"))){
	       //登录系统相关代码
	    }else{
	    	out.println("验证码不正确!");
	
	    }
				
	%>


最后显示结果:

         

     当然,如果读者对验证码感兴趣并想扩充自己的视野,想见识一下各式各样的验证码,可以在网上搜集一下.我这里就不再列举了.这里所展示的是最基本的验证码,了解一下它的原理和流程以及对项目的回顾.



2楼smszhuang16849分钟前
牛呀,这样的验证还真是第一次听说
1楼dongzi872小时前
网站安全很重要啊,顶起来
  相关解决方案