`

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

相关推荐

    java生成图片验证码

    这个类可能包含生成验证码字符串的方法,以及将字符串转化为图像的方法。其中可能包括对字体、颜色、背景、干扰线等的设置,以增加验证码的复杂性和安全性。 2. ImageServlet.java:这是一个Servlet类,它处理HTTP...

    java生成随机验证码

    java生成随机验证码, 这是一个demo, eclipse项目,导入eclipse即可

    java登录验证码生成代码

    一个登录验证生成验证码用struts 后台生成验证码在jsp页面输出生成图片

    java 生成图片验证码

    在IT领域,验证码(CAPTCHA)是一...在提供的压缩包文件“图片验证码生成”中,可能包含了实现上述功能的源代码示例,你可以通过学习和理解这些代码,加深对Java生成图片验证码的理解,并根据实际需求进行调整和优化。

    java生成图片的验证码工具类及其使用

    java生成验证码的工具类,这个现在有依赖可以直接引入调用,但这个工具类没有引入依赖,大家也容易看懂代码,理解其含义。也可直接去工具类中调整生成验证码的宽度、高度、颜色、背景颜色、生成的随机数数量、干扰线...

    Java生成图片验证码工具类源码

    该工具类使用随机字符生成验证码,并支持自定义验证码长度和字体样式。生成的验证码图片背景透明,线条清晰,可轻松辨认。本源码包含了工具类源码及调用示例,可供开发者参考使用,集成到您的项目中。

    java 生成彩色验证码

    java 生成彩色验证码的程序,改程序可以极大的帮助你,是你可以自动生成彩色的验证码

    Java生成算数运算中文图片验证码

    源代码可能包括生成验证码的类、处理用户输入的控制器以及相关的配置文件。资源文件可能包含了用于绘制验证码的自定义字体,以显示中文字符。说明文档则详细解释了项目的用途、如何运行和使用示例,帮助开发者快速...

    java生成验证码源码包括彩色验证码

    java生成验证码源码包括彩色验证码 包括jsp生成验证码和彩色验证码

    java生成的随机验证码

    验证码是网络应用中常见的一种安全机制,用于防止自动...总的来说,Java生成随机验证码的过程涵盖了随机数生成、字符串处理、图像处理等多个编程领域。通过合理的设计和实现,可以创建出既安全又用户友好的验证码系统。

    Java随机生成验证码图片

    Java随机生成验证码图片,适用于web登录验证等。个人觉得很不错~

    java 生成动态gif 验证码

    - **Servlet**:在Servlet中调用工具类的方法,生成验证码并将其保存到服务器的一个临时目录,同时将验证码内容保存在Session中,以供后续验证使用。 - **响应客户端**:Servlet返回生成的GIF图像到客户端,通常...

    java生成验证码的参考资料(中英文验证码)

    总的来说,Java生成验证码是一个结合了数学随机性、图像处理和安全性考量的过程。通过学习和使用`kaptcha`或其他验证码生成库,开发者能够快速地在自己的项目中实现这一功能。同时,理解和实现验证码的生成也能加深...

    java生成图形验证码 带详细注释 拷贝即用 兼容linux系统 含字体

    有没有发现最后生成了一串长的base64编码 把这一串编码放到img标签在前面加上"data:image/gif;base64,"是能直接使用的 ;base64,(你的base64编码)"/&gt; 验证码最佳宽高计算公式:字体大小和图片高度相等,图片宽度=...

    java随机生成验证码

    验证码(CAPTCHA)是一种用于验证用户是否为人类的自动化测试技术。...以上就是使用Java生成验证码的基本流程和关键知识点。通过调整各种参数和细节,可以根据实际需求定制出更复杂、更难被机器识别的验证码系统。

    java生成验证码demo

    这个"java生成验证码demo"提供了生成自定义验证码图片的方法,包括设置图片尺寸、验证码长度,以及添加各种视觉混淆元素,以增加机器识别的难度。 首先,我们要理解验证码的基本原理。它通常由一组随机生成的字母或...

    JAVA动态生成验证码的JAVA实现的代码

    在JAVA编程语言中,我们可以实现动态生成验证码的机制,以提供安全的用户验证体验。下面将详细介绍如何在JAVA中实现验证码的生成。 首先,验证码通常由一组随机字符(包括字母、数字)组成,它们被扭曲、旋转或添加...

    java生成验图片验证码

    6. **保存和输出**:生成验证码图像后,需要将其保存为JPEG或PNG等格式,以便在Web应用中显示。`ImageIO.write()`方法可以将`BufferedImage`对象写入到输出流中。 7. **服务器端验证**:当用户输入验证码后,服务器...

    Java生成图片验证码

    Java生成图片验证码的过程涉及图像处理、随机数生成以及字符串编码等多个知识点。 首先,验证码的核心是生成一个随机的字符串,通常包含字母和数字。在Java中,可以使用`Random`类配合字符数组来生成这种字符串。...

Global site tag (gtag.js) - Google Analytics