`

jsp中的验证码

    博客分类:
  • java
阅读更多
做web开发,很多时间需要大量生成难证码,写一个验证码是一件很容易的事,但是写得好不会是一件易事。

以下是我写的一个验证码生成方法,经改进行,性能比初时(我第一次写时)被时提升了40%以上,仅供参考。

Java代码
import java.awt.Color;  
import java.awt.Font;  
import java.awt.Graphics;  
import java.awt.image.BufferedImage;  
import java.util.Random;  
 
import javax.imageio.ImageIO;  
import javax.servlet.ServletOutputStream;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
 
/** 
* 该方法主要是生成验证码,并返4位回验证码 
*  
* @author Jacky * 
*/ 
public final class ImageCode {  
 
    /** 
     * 经常用到的作静态常量处理,这样会加快处理速度,减少变量第次都要生成的内存空间浪费,用final使程序不用录找该类是否被继承,减少加载时间 
     *  
     */ 
 
    private static final Random random = new Random();  
 
    // 预定义定义四种字体,并将随机得到  
    private static final Font[] CODEFONT = { new Font("宋体", Font.BOLD, 25), new Font("宋体", Font.BOLD, 25), new Font("宋体", Font.BOLD, 25),  
            new Font("宋体", Font.BOLD, 25) };  
 
    // 预定义定义字体颜色,并将随机得到色  
    private static final Color[] FONTCOLOR = { Color.ORANGE, Color.RED, Color.PINK, Color.BLUE, Color.GREEN };  
 
    // 预定义 图片的背景颜色,并将随机得到  
    private static final Color[] BGCOLOR = { Color.BLACK, Color.WHITE };  
 
    // 预定义干扰线的颜色  
    private static final Color LINECOLOR = new Color(242, 234, 22);  
 
    // 预定义生随机的字符,用数组取值比String类型取一个值快  
    private static final String[] CODE = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",  
            "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };  
 
    // 返回的验证码  
    private static StringBuffer CONDENUMBER = null;  
 
    // 预定义图片大小  
    private static final int WIDTH = 100, HEIGHT = 25;  
 
    /** 
     * 生成验证码输出,并输出 
     *  
     * @param request 
     * @param response 
     * @return codeNumber 
     */ 
    public final String image(HttpServletRequest request, HttpServletResponse response) {  
        CONDENUMBER = new StringBuffer();  
        BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);  
        Graphics g = image.getGraphics();  
        g.setColor(BGCOLOR[random.nextInt(2)]);  
        g.fillRect(0, 0, WIDTH, HEIGHT);  
        for (int i = 0; i < 4; i++) {  
            drawCode(g, i);  
        }  
        drawNoise(g,;  
        g.setColor(Color.gray);  
        g.drawRect(0, 0, WIDTH - 1, HEIGHT - 1);  
        g.dispose();  
        response.setHeader("Pragma", "No-cache");  
        response.setHeader("Cache-Control", "no-cache");  
        response.setDateHeader("Expires", 0);  
        response.setContentType("image/png");  
        ServletOutputStream sos = null;  
        try {  
            sos = response.getOutputStream();  
            ImageIO.write(image, "png", sos);  
            sos.flush();  
            sos.close();  
        } catch (Exception e) {  
            e.printStackTrace();  
            return null;  
        }  
        return CONDENUMBER.toString();  
    }  
 
    /** 
     * 画验证码 
     *  
     * @param request 
     * @param response 
     * @return void 
     */ 
    private final void drawCode(Graphics graphics, int i) {  
        String number = CODE[random.nextInt(36)];  
        graphics.setFont(CODEFONT[random.nextInt(4)]);  
        graphics.setColor(FONTCOLOR[random.nextInt(5)]);  
        graphics.drawString(number, 10 + i * 20, 20);  
        CONDENUMBER.append(number);  
    }  
 
    /** 
     * 画干扰线 
     *  
     * @param graphics 
     * @param void 
     */ 
    private final void drawNoise(Graphics graphics, int lineNumber) {  
        graphics.setColor(LINECOLOR);  
        int pointX1, pointY1, pointX2, pointY2;  
        for (int i = 0; i < lineNumber; i++) {  
            pointX1 = 1 + (int) (Math.random() * WIDTH);  
            pointY1 = 1 + (int) (Math.random() * HEIGHT);  
            pointX2 = 1 + (int) (Math.random() * WIDTH);  
            pointY2 = 1 + (int) (Math.random() * HEIGHT);  
            graphics.drawLine(pointX1, pointY1, pointX2, pointY2);  
        }  
    }  
 


import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* 该方法主要是生成验证码,并返4位回验证码
*
* @author Jacky *
*/
public final class ImageCode {

/**
* 经常用到的作静态常量处理,这样会加快处理速度,减少变量第次都要生成的内存空间浪费,用final使程序不用录找该类是否被继承,减少加载时间
*
*/

private static final Random random = new Random();

// 预定义定义四种字体,并将随机得到
private static final Font[] CODEFONT = { new Font("宋体", Font.BOLD, 25), new Font("宋体", Font.BOLD, 25), new Font("宋体", Font.BOLD, 25),
new Font("宋体", Font.BOLD, 25) };

// 预定义定义字体颜色,并将随机得到色
private static final Color[] FONTCOLOR = { Color.ORANGE, Color.RED, Color.PINK, Color.BLUE, Color.GREEN };

// 预定义 图片的背景颜色,并将随机得到
private static final Color[] BGCOLOR = { Color.BLACK, Color.WHITE };

// 预定义干扰线的颜色
private static final Color LINECOLOR = new Color(242, 234, 22);

// 预定义生随机的字符,用数组取值比String类型取一个值快
private static final String[] CODE = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
"N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };

// 返回的验证码
private static StringBuffer CONDENUMBER = null;

// 预定义图片大小
private static final int WIDTH = 100, HEIGHT = 25;

/**
* 生成验证码输出,并输出
*
* @param request
* @param response
* @return codeNumber
*/
public final String image(HttpServletRequest request, HttpServletResponse response) {
CONDENUMBER = new StringBuffer();
BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.setColor(BGCOLOR[random.nextInt(2)]);
g.fillRect(0, 0, WIDTH, HEIGHT);
for (int i = 0; i < 4; i++) {
drawCode(g, i);
}
drawNoise(g,;
g.setColor(Color.gray);
g.drawRect(0, 0, WIDTH - 1, HEIGHT - 1);
g.dispose();
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/png");
ServletOutputStream sos = null;
try {
sos = response.getOutputStream();
ImageIO.write(image, "png", sos);
sos.flush();
sos.close();
} catch (Exception e) {
e.printStackTrace();
return null;
}
return CONDENUMBER.toString();
}

/**
* 画验证码
*
* @param request
* @param response
* @return void
*/
private final void drawCode(Graphics graphics, int i) {
String number = CODE[random.nextInt(36)];
graphics.setFont(CODEFONT[random.nextInt(4)]);
graphics.setColor(FONTCOLOR[random.nextInt(5)]);
graphics.drawString(number, 10 + i * 20, 20);
CONDENUMBER.append(number);
}

/**
* 画干扰线
*
* @param graphics
* @param void
*/
private final void drawNoise(Graphics graphics, int lineNumber) {
graphics.setColor(LINECOLOR);
int pointX1, pointY1, pointX2, pointY2;
for (int i = 0; i < lineNumber; i++) {
pointX1 = 1 + (int) (Math.random() * WIDTH);
pointY1 = 1 + (int) (Math.random() * HEIGHT);
pointX2 = 1 + (int) (Math.random() * WIDTH);
pointY2 = 1 + (int) (Math.random() * HEIGHT);
graphics.drawLine(pointX1, pointY1, pointX2, pointY2);
}
}

}

一个调用的例子:

Java代码
public void image(HttpServletRequest request, HttpServletResponse response) {  
        ImageCode ic = new ImageCode();  
        String imageCode = ic.image(request, response);  
        request.getSession().removeAttribute("imageCode");  
                  //转为小写,从页面输入也转为小写,以达到不分大小写作用  
        request.getSession().setAttribute("imageCode", imageCode.toLowerCase());  
    } 

public void image(HttpServletRequest request, HttpServletResponse response) {
ImageCode ic = new ImageCode();
String imageCode = ic.image(request, response);
request.getSession().removeAttribute("imageCode");
                  //转为小写,从页面输入也转为小写,以达到不分大小写作用
request.getSession().setAttribute("imageCode", imageCode.toLowerCase());
}
分享到:
评论
2 楼 villain564 2009-11-17  
 
1 楼 villain564 2009-11-17  
drawNoise(g,8);

相关推荐

    一个jsp中文验证码

    jsp中文验证码,能实现中文字的验证码,非常不错。

    jsp验证码,jsp中文验证码,数字验证码,汉字验证码

    jsp验证码,jsp中文验证码,数字验证码,汉字验证码

    jsp 中文验证码-源码

    ### jsp中文验证码实现原理与源码解析 #### 一、引言 随着网络技术的发展,网站的安全性问题越来越受到重视。验证码作为一种简单而有效的安全措施,在用户登录、注册等环节广泛使用。本文将深入探讨一种基于JSP的...

    JSP 中文验证码 实现方法

    JSP 中文验证码 实现方法 JSP 中文验证码 实现方法

    jsp 中文验证码 源码

    对于"jsp 中文验证码 源码"这个主题,我们将深入探讨如何在JSP(JavaServer Pages)环境中生成具有中文字符的随机验证码。 首先,JSP是Java的一种视图技术,它允许开发人员将动态代码嵌入到HTML、XML或其他标记语言...

    JSP中文验证码(源码)

    ### JSP中文验证码实现原理与源码解析 #### 一、引言 在现代Web应用中,验证码是一种常见的用户交互安全机制,用于区分用户是人类还是自动化程序。本文将详细介绍一个基于Java Server Pages (JSP)技术实现的中文...

    Jsp中验证码的编写

    在JSP(Java Server Pages)环境中实现验证码生成与验证,是确保网站安全的重要环节之一。根据给定的文件信息,我们可以详细解析其中涉及的关键知识点。 ### JSP中的验证码编写 #### 验证码生成 验证码生成主要...

    jsp java 生成中文验证码

    在这个场景中,我们关注的是在JSP(Java Server Pages)和Java环境中生成中文验证码的技术。 首先,`jsp java 生成中文验证码`这个标题暗示我们要讨论如何在JSP应用中使用Java来创建包含中文字符的验证码。JSP是...

    jsp 中验证码的实现

    在本篇中,我们将详细探讨如何在Java Server Pages(JSP)环境中实现验证码功能。 验证码的主要目的是区分人类用户与机器,确保只有前者能进行特定的操作,比如注册、登录或提交表单。常见的验证码类型有图像验证码...

    jsp验证码——数字

    ### jsp验证码——数字 #### 知识点详解 ##### JSP 验证码实现原理与过程 在本文档中,我们关注一个基于JavaServer Pages (JSP) 的数字验证码生成示例。此示例主要涉及到JSP页面的配置、Java图形处理库的使用以及...

    jsp图形验证码源码

    在这个案例中,我们将用JSP来生成和处理图形验证码。 图形验证码的主要功能包括: 1. **生成随机字符**:在服务器端,我们需要生成一组随机的字母或数字作为验证码,通常长度为4到6位。这可以通过Java的`Random`类...

    jsp实现验证码JSP彩色验证码的实现

    经典JSP生成验证码经典JSP生成验证码经典JSP生成验证码经典JSP生成验证码经典JSP生成验证码经典JSP生成验证码经典JSP生成验证码

    JSP图形验证码项目

    在这个项目中,我们重点探讨如何使用JSP来创建用户登录界面,并结合图形验证码来防止恶意自动登录尝试,从而保护系统的安全性。 首先,JSP是Java平台上的动态网页技术,它允许开发人员在HTML或者XML文档中嵌入Java...

    【分享】JSP语音验证码接口demo

    在这个【分享】JSP语音验证码接口demo中,我们聚焦于如何利用JSP技术实现一个高效、可靠的语音验证码功能。 1. **JSP基础**: - **基本原理**:JSP是一种服务器端脚本语言,它将HTML、CSS和JavaScript等前端元素与...

    JSP网页中的验证码

    2. **JSP验证码实现步骤**: - **生成验证码**:在服务器端,可以使用Java的`Random`类生成随机字符串,然后存入session中。 - **展示验证码**:将生成的验证码通过JSP页面显示出来,如果是图片验证码,需要使用...

    JSP验证码大全之中文验证码(源码)

    ### JSP验证码大全之中文验证码实现详解 #### 一、引言 验证码作为一种常见的安全机制,在网站登录、表单提交等场景中起到了重要的作用。它能够有效防止恶意软件通过自动化手段进行攻击。本文将详细介绍如何在JSP...

    jsp验证码学习代码

    ### jsp验证码学习代码 #### 一、简介 在web应用程序的安全性方面,验证码是一种常见的保护机制,可以有效防止机器自动填写表单等自动化攻击行为。对于使用Java Server Pages(JSP)技术进行Web开发的技术人员来说...

    jsp中文验证码

    很实用的jsp中文验证,一看就会! 适合各类开发人员使用!

    JSP编程验证码登陆系统

    在这个"JSP编程验证码登录系统"中,我们将深入探讨如何使用JSP来创建一个安全的登录页面,其中包含验证码功能,以防止恶意的自动化尝试或机器人攻击。 验证码(CAPTCHA)是"Completely Automated Public Turing ...

    JSP实现的验证码, 验证码

    在JSP(JavaServer Pages)中实现验证码,主要是为了确保用户是真实的活生生的人,而不是机器,以此增加网站的安全性。这里我们将深入探讨JSP实现验证码的原理、步骤以及涉及到的相关知识点。 验证码的基本流程包括...

Global site tag (gtag.js) - Google Analytics