`

java生成登录验证码的方法

    博客分类:
  • java
阅读更多


引用
 验证码的作用:有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上是用验证码是现在很多网站通行的方式(比如招商银行的网上个人银行,腾讯的QQ社区),我们利用比较简易的方式实现了这个功能。虽然登陆麻烦一点,但是对网友的密码安全还来说这个功能还是很有必要,也很重要。但我们还是 提醒大家主要保护自己的密码 ,尽量使用混杂了数字、字母、符号在内的6位以上密码,不要使用诸如1234之类的简单密码或者与用户名相同、类似的密码,免得你的账号给人盗用给自己带来不必要的麻烦。
  (1).验证码一般是防止批量注册的,人眼看起来都费劲,何况是机器。二像百度贴吧未登录发贴要输入验证码大概是防止大规模匿名回帖的发生目前,不少网站为了防止用户利用机器人自动注册、登录、灌水,都采用了验证码技术。所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。
  (2).一般注册用户ID的地方以及各大论坛都要要输入验证码
  (3).常见的验证码
  1,四位数字,随机的一数字字符串,最原始的验证码,验证作用几乎为零。2,CSDN网站用户登录用的是GIF格式,目前常用的随机数字图片验证码。图片上的字符比较中规中矩,验证作用比上一个好。没有基本图形图像学知识的人,不可破!可惜读取它的程序,在CSDN使用它的第一天,好像就在论坛里发布了,真是可怜!
  2,汉字,QQ网站注册目前最新的验证码,都是汉字,随机生成,打起来更难了!
  3,QQ网站用户登录用的是PNG格式,图片用的随机数字+随机大写英文字母,整个构图有点张扬,每刷新一次,每个字符还会变位置呢!有时候出来的图片,人眼都识别不了,厉害啊…4,MS的hotmail申请时候的是BMP格式, 随机数字+随机大写英文字母+随机干扰像素+随机位置。
  4,韩文或日文,现在跑跑HF上MS注册都要打韩文的,这更增加了难度,要去修学下才行..
  5,Google的Gmail注册时候的是JPG格式,随机英文字母+随机颜色+随机位置+随机长度。
  6,其他各大论坛的是XBM格式,内容随机。


好了,知道了验证码的作用后,下面我们也来生成一个简单的登录验证码。

第一步,准备生成验证码图片的一个servlet.(CheckCoderTool.java)
Java代码
/* 
* Created on 2005-10-15 
* Author stephen 
* Email zhoujianqiang AT gamil DOT com 
* CopyRight(C)2005-2008 , All rights reserved. 
*/ 
package com.soft4j.utility;  
 
import java.awt.Color;  
import java.awt.Graphics2D;  
import java.awt.image.BufferedImage;  
import java.io.IOException;  
 
import javax.servlet.ServletException;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
 
import com.sun.image.codec.jpeg.JPEGCodec;  
import com.sun.image.codec.jpeg.JPEGEncodeParam;  
import com.sun.image.codec.jpeg.JPEGImageEncoder;  
 
/** 
*  
* @author stephen 
* @version 1.0.0 
*/ 
public class CheckCoderTool extends HttpServlet {  
 
    /** 
     * 生成登录验证码. 
     * 验证码的数据从客户的session中的属性c中获取.<br> 
     * 生成的验证码以JPEG图片方式输出. 
     */ 
    public void doGet(HttpServletRequest request, HttpServletResponse response)  
            throws ServletException, IOException {  
        response.setContentType("image/jpeg");  
        String c = (String) request.getSession().getAttribute("c");  
        if (c == null)c = "";  
        int width = c.length() * 8 + 10;  
        int height = 16;  
        int startX = 5;  
        int startY = 12;  
        BufferedImage bi = new BufferedImage(width, height,BufferedImage.TYPE_INT_BGR);  
        Graphics2D g = bi.createGraphics();  
        g.setColor(Color.GREEN);  
        g.setBackground(Color.black);  
        g.clearRect(0, 0, width, height);  
        g.drawString(c, startX, startY);  
        JPEGImageEncoder encoder = null;  
        JPEGEncodeParam param = null;  
 
        try {  
            encoder = JPEGCodec.createJPEGEncoder(response.getOutputStream());  
            param = encoder.getDefaultJPEGEncodeParam(bi);  
            param.setQuality(0.9f, false);  
            encoder.encode(bi);  
        } catch (Exception e) {  
            e.printStackTrace();  
        } finally {  
            bi = null;  
            g = null;  
            c = null;  
            encoder = null;  
            param = null;  
        }  
 
    }  


/*
* Created on 2005-10-15
* Author stephen
* Email zhoujianqiang AT gamil DOT com
* CopyRight(C)2005-2008 , All rights reserved.
*/
package com.soft4j.utility;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

/**
*
* @author stephen
* @version 1.0.0
*/
public class CheckCoderTool extends HttpServlet {

    /**
     * 生成登录验证码.
     * 验证码的数据从客户的session中的属性c中获取.<br>
     * 生成的验证码以JPEG图片方式输出.
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("image/jpeg");
        String c = (String) request.getSession().getAttribute("c");
        if (c == null)c = "";
        int width = c.length() * 8 + 10;
        int height = 16;
        int startX = 5;
        int startY = 12;
        BufferedImage bi = new BufferedImage(width, height,BufferedImage.TYPE_INT_BGR);
        Graphics2D g = bi.createGraphics();
        g.setColor(Color.GREEN);
        g.setBackground(Color.black);
        g.clearRect(0, 0, width, height);
        g.drawString(c, startX, startY);
        JPEGImageEncoder encoder = null;
        JPEGEncodeParam param = null;

        try {
            encoder = JPEGCodec.createJPEGEncoder(response.getOutputStream());
            param = encoder.getDefaultJPEGEncodeParam(bi);
            param.setQuality(0.9f, false);
            encoder.encode(bi);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            bi = null;
            g = null;
            c = null;
            encoder = null;
            param = null;
        }

    }
}



第二步,在web.xml中配置上面的servlet.
Html代码
...  
    <servlet> 
        <servlet-name>CheckCoderTool</servlet-name> 
        <servlet-class>com.soft4j.utility.CheckCoderTool</servlet-class> 
    </servlet> 
...  
    <servlet-mapping> 
        <servlet-name>CheckCoderTool</servlet-name> 
        <url-pattern>/CheckCoder</url-pattern> 
    </servlet-mapping> 
...  

...
<servlet>
<servlet-name>CheckCoderTool</servlet-name>
<servlet-class>com.soft4j.utility.CheckCoderTool</servlet-class>
</servlet>
...
<servlet-mapping>
<servlet-name>CheckCoderTool</servlet-name>
<url-pattern>/CheckCoder</url-pattern>
</servlet-mapping>
...



第三步,准备登录的jsp页面 (code.jsp)

其中有一段 /CheckCoder?t=<%=t%>,在调用生成图片验证码的servlet后面加了个时间戳参数,可以防止验证图片从缓存中取出,确保每次显示的都是当前最新生成的验证图片。

Html代码
<%@ page contentType="text/html;charset=UTF-8"%> 
<%@ page import="java.util.Date"%> 
<%@ page import="com.soft4j.utility.StringTool"%> 
<%  
    response.setHeader("Cache-Control","no-cache");  
    response.setHeader("Expires","Thu,01 Jan 1970 00:00:01 GMT");  
    String checkCode = StringTool.randomChars(4);//生成验证码 StringTool.randomChars(4)方法在下面的例子中能找到.  
    session.setAttribute("c",checkCode);//验证码存入session中  
    long t = (new Date()).getTime();//确保每次刷新都生成新的验证码图片  
%> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
<head> 
<title>登录管理</title> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
</head> 
<body bgcolor="#ffffff" topmargin="150px" leftmargin="20px" rightmargin="20px"> 
<form method="post" action="login.jsp"> 
<center><h2>登录管理</h2></center> 
<br> 
<table cellspacing="0" cellpadding="0" border="0" width="100%"><tr><td class="line"><img height="1" alt="" width="1"></td></tr> 
<tr><td align="center" bgcolor="#efffff"> 
<br><br> 
账号:<input type="text" name="login_id" value=""> 
密码:<input type="password" name="login_pwd" value=""> 
验证码:<input type="text" name="check_code" value="" size=5> <IMG src=<%=request.getContextPath()%>/CheckCoder?t=<%=t%> alt=请把看到的4位数字输入左边的验证码框内> 
<input type="submit" name="submit" class="buttonblue" value="  进入  "> 
<br><br><br> 
</td></tr> 
<tr><td class="line"><img height="1" alt="" width="1"></td></tr> 
</table> 
</form> 
</body> 
</html> 

<%@ page contentType="text/html;charset=UTF-8"%>
<%@ page import="java.util.Date"%>
<%@ page import="com.soft4j.utility.StringTool"%>
<%
response.setHeader("Cache-Control","no-cache");
response.setHeader("Expires","Thu,01 Jan 1970 00:00:01 GMT");
String checkCode = StringTool.randomChars(4);//生成验证码 StringTool.randomChars(4)方法在下面的例子中能找到.
session.setAttribute("c",checkCode);//验证码存入session中
long t = (new Date()).getTime();//确保每次刷新都生成新的验证码图片
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>登录管理</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body bgcolor="#ffffff" topmargin="150px" leftmargin="20px" rightmargin="20px">
<form method="post" action="login.jsp">
<center><h2>登录管理</h2></center>
<br>
<table cellspacing="0" cellpadding="0" border="0" width="100%"><tr><td class="line"><img height="1" alt="" width="1"></td></tr>
<tr><td align="center" bgcolor="#efffff">
<br><br>
账号:<input type="text" name="login_id" value="">
密码:<input type="password" name="login_pwd" value="">
验证码:<input type="text" name="check_code" value="" size=5> <IMG src=<%=request.getContextPath()%>/CheckCoder?t=<%=t%> alt=请把看到的4位数字输入左边的验证码框内>
<input type="submit" name="submit" class="buttonblue" value="  进入  ">
<br><br><br>
</td></tr>
<tr><td class="line"><img height="1" alt="" width="1"></td></tr>
</table>
</form>
</body>
</html>


下面是随机生成4位数字java方法:

Java代码
/** 
     * 生成随机字符串. <br> 
     * 随机字符串的内容包含[0-9]的字符. <br> 
     *  
     * @param randomLength 
     *            随机字符串的长度 
     * @return 随机字符串. 
     */ 
    public static String randomChars(int randomLength) {  
        char[] randoms = { '0','1', '2', '3',  
                '4', '5', '6', '7', '8', '9' };  
        Random random = new Random();  
        StringBuffer ret = new StringBuffer();  
        for (int i = 0; i < randomLength; i++) {  
            ret.append(randoms[random.nextInt(randoms.length)]);  
        }  
        random = null;  
        return ret.toString();  
    } 

/**
     * 生成随机字符串. <br>
     * 随机字符串的内容包含[0-9]的字符. <br>
     *
     * @param randomLength
     *            随机字符串的长度
     * @return 随机字符串.
     */
    public static String randomChars(int randomLength) {
        char[] randoms = { '0','1', '2', '3',
                '4', '5', '6', '7', '8', '9' };
        Random random = new Random();
        StringBuffer ret = new StringBuffer();
        for (int i = 0; i < randomLength; i++) {
            ret.append(randoms[random.nextInt(randoms.length)]);
        }
        random = null;
        return ret.toString();
    }


第四步,就是检验填写的验证码是否正确。
Html代码
<%@ page contentType="text/html;charset=UTF-8"%> 
<%  
    try{  
        String checkCode = request.getParameter("check_code");  
        if(checkCode==null || "".equals(checkCode)) throw new Exception("缺少验证码。");  
        String rightCheckCode = (String)session.getAttribute("c");  
        if(!checkCode.equals(rightCheckCode)) throw new Exception("验证码不正确。");  
        //继续验证用户名/密码  
        //...  
          
    }catch(Exception e){  
          
    }finally{  
        //  
    }  
%> 

<%@ page contentType="text/html;charset=UTF-8"%>
<%
try{
String checkCode = request.getParameter("check_code");
if(checkCode==null || "".equals(checkCode)) throw new Exception("缺少验证码。");
String rightCheckCode = (String)session.getAttribute("c");
if(!checkCode.equals(rightCheckCode)) throw new Exception("验证码不正确。");
//继续验证用户名/密码
//...

}catch(Exception e){
   
}finally{
//
}
%>
分享到:
评论
1 楼 enum 2011-09-22  
thank's so mauch.
font color too uncomfortable

相关推荐

Global site tag (gtag.js) - Google Analytics