<%@ page contentType="text/html; charset=gb2312"%> 论坛中验证码实现
网站公告:   ◆北天JAVA技术网热情为java爱好者服务,本网内容包括JAVA(JSP、servlet、EJB、webservice、j2ee、javabean、应用服务器、JavaScript),数据库(MYSQL、SQL Server、Sybase、Oracle、DB2、数据库综合知识),设计研究(设计模式、Struts、Spring、Hibernate、设计框架、设计综合知识),WEB2.0新技术(主要介绍AJAX),以及各种技术的入门、实例、例子等等,欢迎各位多来坐坐!◆  诚邀各位JAVA爱好者加盟!◆  本网站内容丰富,更新快,保证每周20篇以上!  
加入收藏
设为首页
联系站长
承接项目
  相关资源:网站首页 | 免费培训学院 | 技术论坛 | JAVA聊天室 | 作家专栏 | 开发工具 | 认证考试 | 会员俱乐部
  JAVA技术初学者园地 | jsp与servlet | javascript | Java源代码 | EJB | web service | 应用服务器 | JAVA综合知识
  设计研究设计模式 | 设计框架 | Struts | Spring | Hibernate | 开源项目 | 面向对象设计 | 设计综合知识
  数 据 库MYSQL | SQL Server | Sybase | Oracle | DB2 | Informix | Access | 数据库综合知识
  其他资源:AJAX新技术 | 网站开发 | ERP软件 | OA办公软件 | 商业智能BI | 开发综合知识 | 承接项目 | 项目试用

 
 
论坛中验证码实现
     发布者:Yakee 发布时间:2007-01-17
昨天说到网上有人写了一个注册机,来暴力注册www.programfan.com,我在论坛贴了这个贴programfan的注册机
没想到被原创作者发现,说他要开始注意我在www.bbs.bc-cn.net的id.我不知道可能说这话有点开玩笑,但是呢?但是我觉得这人RP可能有点傲,虽然我对他的才华很佩服(至今我也看不到那段代码,所以我在努力....)
所以在论坛注册的时候采用登入验证号码是非常有必要的,并且现在很多的论坛都是这么做的:http://www.hjbbs.com/index.asp
   http://www.hjbbs.com/index.asp(采用安全问题提问的方式)
所以我也想知道到底怎么样做成验证码的,分享一下:
要生成验证码,不外乎随即产生数字,或者字符,符号等,然后把它组合起来生成一个png格式(jpeg,gif...)
其中可能有一些干扰的直线等,最后由用户输入,根据输入的与自动生成的来对比,判断是否继续....

package com.fatcat.webchart;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.awt.image.*;
import java.awt.*;
import javax.imageio.*;

public class CodeMakerServlet extends HttpServlet
{
    private Font[] codeFont =
    {
        new Font("Algerian", Font.BOLD, 65),
        new Font("Vivaldi", Font.BOLD, 85),
        new Font("Broadway", Font.BOLD, 60),
        new Font("Forte", Font.BOLD, 75)
    };

    private Color[] color =
    {
       Color.BLACK, Color.RED, Color.DARK_GRAY, Color.BLUE
    };

    String codeNumbers = "";

    int width = 250, height = 70;

    
// 处理 HTTP get 请求

    public void doGet(HttpServletRequest request, HttpServletResponse response)
                      throws ServletException, IOException
    {
        
// 清空缓冲区

        response.reset();

        
// 注意这里的MIME类型

        response.setContentType("image/png");

        
// 设置页面不缓存

        response.setHeader("Pragma", "No-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);

        
// 创建一个 250X70 的图像

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

        
// 得到图形环境对象 g

        Graphics g = image.getGraphics();

        
// 填充背景

        g.setColor(Color.YELLOW);
        g.fillRect(0, 0, width, height);

        for (int i = 0; i < 4; i++)
        {
            drawCode(g, i);
        }

        drawNoise(g, 30);

        
// 绘制边框

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

        
// 将验证码内容保存进session中

        HttpSession session = request.getSession(true);
        session.setAttribute("codeNumbers", codeNumbers);
        
        
// 重设字符串

        codeNumbers = "";

        
// 利用ImageIO类的write方法对图像进行编码

        ServletOutputStream sos = response.getOutputStream();
        ImageIO.write(image, "PNG", sos);
        sos.close();
    }

    
// 绘制验证码

    public void drawCode(Graphics graphics, int i)
    {
        int number = (int)(Math.random() * 10);
        graphics.setFont(codeFont[i]);
        graphics.setColor(color[i]);
        graphics.drawString("" + number, 10 + i * 60, 60);

        codeNumbers += number;
    }

    
// 绘制干扰线

    public void drawNoise(Graphics graphics, int lineNumber)
    {
        graphics.setColor(Color.YELLOW);
        for (int i = 0; i < lineNumber; i++)
        {
            int pointX1 = 1 + (int)(Math.random() * width);
            int pointY1 = 1 + (int)(Math.random() * height);
            int pointX2 = 1 + (int)(Math.random() * width);
            int pointY2 = 1 + (int)(Math.random() * height);
            graphics.drawLine(pointX1, pointY1, pointX2, pointY2);
        }
    }
    
// 处理 HTTP post 请求, 和doGet一样

    public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
        doGet(request, response);
    }
}

以下是判断是否合法输入

package com.fatcat.webchart;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class ValidateServlet extends HttpServlet
{
    // 处理客户端提交数据的 "Post" 请求
    protected void doPost(HttpServletRequest request, HttpServletResponse
        response)throws ServletException, IOException
    {
        // 发送 XHTML 格式的页面给客户端
        response.setContentType("text/html;charset=gb2312");

        // 设置页面不缓存
        response.setHeader("Pragma", "No-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);

        // 获得用户输入的验证码
        String validateCode = request.getParameter("validateCode");

        // 获取保存在session中的验证码
        HttpSession session = request.getSession();
        String codeNumbers = (String)session.getAttribute("codeNumbers");

        String url = "/JSPWeb/validate1.html";

        if (codeNumbers == null)
        {
            response.sendRedirect(url);
            return ;
        }

        PrintWriter out = response.getWriter();

        // 开始生成 XHTML 文档
        out.println("<?xml version = \"1.0\"?>");

        out.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD " +
            "XHTML 1.0 Strict//EN\" \"http://www.w3.org" +
            "/TR/xhtml1/DTD/xhtml1-strict.dtd\">");

        out.println("<html xmlns = \"http://www.w3.org/1999/xhtml\">");

        // 生成文档的head部分
        out.println("<head>");
        out.println("<title>校验认证码的Servlet</title>");
        out.println("</head>");

        // 生成文档的body部分
        out.println("<body>");

        // 校验用户输入的验证码和session中的验证码是否相同
        if (codeNumbers.equals(validateCode))
        {
            out.println(
                "<h1><font color=\"green\">输入相同,校验成功</font></h1> ");
        }
        else
        {
            out.println("<h1><font color=\"red\">输入错误,校验失败</font> <br>");
           // out.println("<p>请重新<a href=\"" + url +
                //"\">输入验证码</a><h1></p>");
            String url2 = "/JSPWeb/validate.html";
            String flag= request.getParameter("digits");
            if(flag == null){
                out.println("<p>请重新<a href=\"" + url +
                        "\">输入验证码</a><h1></p>");
               
            }
            else{
                out.println("<p>请重新<a href=\"" + url2 +
                        "\">输入验证码</a><h1></p>");
            }
        }

        out.println("</body>");

        // 结束 XHTML 文档
        out.println("</html>");
        out.close(); // 关闭流
    }

    // 处理客户端提交数据的 "get" 请求, 和doPost一样
    protected void doGet(HttpServletRequest request, HttpServletResponse
        response)throws ServletException, IOException
    {
        doPost(request, response);
    }
}


<?xml version = "1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
   <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=gb2312">
   <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
   <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
   <META HTTP-EQUIV="Expires" CONTENT="0">

   <title>校验验证码</title>
</head>

<body>
   <form action = "/JSPWeb/validate" method = "post">
      <p>
      <br />
      <img src="/JSPWeb/codeMaker" /><br />
      <br />
      <br />
      请输入上图中的验证码:</p>
      <p>
        <input type="text" name="validateCode" />
        <br />
     </p>
      <p>
        <input name="submit" type = "submit" value = " 校验验证码 " />
      </p>
   </form>
  
</body>
</html>

 因为采用java servlet 实现:所以web.xml配置:

<servlet>
        <servlet-name>CodeMakerServlet</servlet-name>
        <description>生成验证码的Servlet</description>
        <servlet-class>com.fatcat.webchart.CodeMakerServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>CodeMakerServlet</servlet-name>
        <url-pattern>/codeMaker</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>ValidateServlet</servlet-name>
        <description>校验验证码的Servlet</description>
        <servlet-class>com.fatcat.webchart.ValidateServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>ValidateServlet</servlet-name>
        <url-pattern>/validate</url-pattern>
    </servlet-mapping>


生成的验证码如下图:


code was written by Jingkui Zhong(钟京馗) and Huan Tang(唐桓),thanks

(转载文章请保留出处:北天JAVA技术网(www.java114.com))
 
更多精彩文章:
国际电信联盟:无意接手互联网管理
Apache Nutch 0.8.1 发布
db4o 5.7 将增加B-trees 索引 加快检索速度
黑客攻破SQL服务器系统的十种方法
MySQL数据库中的安全解决方案
在MySQL数据库增加新用户权限简介
 
最近评论:
        
lesbian pussy full movies on windows media player
lesbian pussy full movies on windows media player lesbian pussy full movies on windows media player http://msdeja-f72.blogspot.com/ lesbian pussy full movies on windows media player [url=http://msdeja-f72.blogspot.com/ ]lesbian pussy full movies on windows media player[/url] free non subscription lezbian sex free non subscription lezbian sex http://xxxhot-522.blogspot.com/ free non subscription lezbian sex [url=http://xxxhot-522.blogspot.com/ ]free non subscription lezbian sex[/url] hairy denmark hairy denmark http://j-porn-c7p.blogspot.com/ hairy denmark [url=http://j-porn-c7p.blogspot.com/ ]hairy denmark[/url]
        
totally free sample viagra
totally free sample viagra totally free sample viagra http://xxx-tv-274.blogspot.com/ totally free sample viagra [url=http://xxx-tv-274.blogspot.com/ ]totally free sample viagra[/url] fullfree hard sex video fullfree hard sex video http://porntv-0n5.blogspot.com/ fullfree hard sex video [url=http://porntv-0n5.blogspot.com/ ]fullfree hard sex video[/url] download hardcor porns download hardcor porns http://ketrin-5lr.blogspot.com/ download hardcor porns [url=http://ketrin-5lr.blogspot.com/ ]download hardcor porns[/url]
        
bbw ameature
bbw ameature bbw ameature http://vidois-zoy.blogspot.com/ bbw ameature [url=http://vidois-zoy.blogspot.com/ ]bbw ameature[/url] free mobile vidios free mobile vidios http://vidios-lbb.blogspot.com/ free mobile vidios [url=http://vidios-lbb.blogspot.com/ ]free mobile vidios[/url] homemade clips amiture homemade clips amiture http://vuyour-rd4.blogspot.com/ homemade clips amiture [url=http://vuyour-rd4.blogspot.com/ ]homemade clips amiture[/url]
        
free sexclips download
free sexclips download free sexclips download http://mpegs-hlq.blogspot.com/ free sexclips download [url=http://mpegs-hlq.blogspot.com/ ]free sexclips download[/url] free full length lesbian sex movies with no sign up free full length lesbian sex movies with no sign up http://spank-4cj.blogspot.com/ free full length lesbian sex movies with no sign up [url=http://spank-4cj.blogspot.com/ ]free full length lesbian sex movies with no sign up[/url] porno sex free heterosexual porno sex free heterosexual http://forum-wer.blogspot.com/ porno sex free heterosexual [url=http://forum-wer.blogspot.com/ ]porno sex free heterosexual[/url]
        
xxx pron live shots
xxx pron live shots xxx pron live shots http://audrey-k00.blogspot.com/ xxx pron live shots [url=http://audrey-k00.blogspot.com/ ]xxx pron live shots[/url] free bizzare sex clips free bizzare sex clips http://medium-pim.blogspot.com/ free bizzare sex clips [url=http://medium-pim.blogspot.com/ ]free bizzare sex clips[/url] absolutely free no membership hardcore porn absolutely free no membership hardcore porn http://granny-3yx.blogspot.com/ absolutely free no membership hardcore porn [url=http://granny-3yx.blogspot.com/ ]absolutely free no membership hardcore porn[/url]
        
tamil wife porn
tamil wife porn tamil wife porn http://mindy-lsv.blogspot.com/ tamil wife porn [url=http://mindy-lsv.blogspot.com/ ]tamil wife porn[/url] free xxx minutes free xxx minutes http://porns-3o7.blogspot.com/ free xxx minutes [url=http://porns-3o7.blogspot.com/ ]free xxx minutes[/url] insest porn japan insest porn japan http://adalt-4pz.blogspot.com/ insest porn japan [url=http://adalt-4pz.blogspot.com/ ]insest porn japan[/url]
        
absolutley free psp porn
absolutley free psp porn absolutley free psp porn http://amime-psf.blogspot.com/ absolutley free psp porn [url=http://amime-psf.blogspot.com/ ]absolutley free psp porn[/url] free porno previws free porno previws http://greek-odh.blogspot.com/ free porno previws [url=http://greek-odh.blogspot.com/ ]free porno previws[/url] sapphic porn video sapphic porn video http://vido--tms.blogspot.com/ sapphic porn video [url=http://vido--tms.blogspot.com/ ]sapphic porn video[/url]
        
bodybuilder women Hardcore Sex Movie
bodybuilder women Hardcore Sex Movie bodybuilder women Hardcore Sex Movie http://boobs-sce.blogspot.com/ bodybuilder women Hardcore Sex Movie [url=http://boobs-sce.blogspot.com/ ]bodybuilder women Hardcore Sex Movie[/url] free schoolgirl vids free schoolgirl vids http://titty-7hf.blogspot.com/ free schoolgirl vids [url=http://titty-7hf.blogspot.com/ ]free schoolgirl vids[/url] sex fresh fuck video free sex fresh fuck video free http://women-6tv.blogspot.com/ sex fresh fuck video free [url=http://women-6tv.blogspot.com/ ]sex fresh fuck video free[/url]
        
flash movie porn archive
flash movie porn archive flash movie porn archive http://moves-7af.blogspot.com/ flash movie porn archive [url=http://moves-7af.blogspot.com/ ]flash movie porn archive[/url] free naked woman clips long hair free naked woman clips long hair http://clips-tuv.blogspot.com/ free naked woman clips long hair [url=http://clips-tuv.blogspot.com/ ]free naked woman clips long hair[/url] hentai stream free no sign up hentai stream free no sign up http://3gp-x-o5a.blogspot.com/ hentai stream free no sign up [url=http://3gp-x-o5a.blogspot.com/ ]hentai stream free no sign up[/url]
        
xxx porn trailors to watch
xxx porn trailors to watch xxx porn trailors to watch http://movis-t26.blogspot.com/ xxx porn trailors to watch [url=http://movis-t26.blogspot.com/ ]xxx porn trailors to watch[/url] watch indian porn videos watch indian porn videos http://video-un1.blogspot.com/ watch indian porn videos [url=http://video-un1.blogspot.com/ ]watch indian porn videos[/url] british amature private home videos free british amature private home videos free http://free--6t4.blogspot.com/ british amature private home videos free [url=http://free--6t4.blogspot.com/ ]british amature private home videos free[/url]
        
标 题:   
内 容:   
 
                                  
 
免责声明:该文章由网友发表,如果对您造成侵权,请联系站长

首页 - 承接项目 - 网站地图 - 联系我们 -
版权所有北天JAVA技术工作室 ICP证号:粤ICP备06079815号