- 浏览: 434293 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
weishuang:
全部无法访问
ArcGIS 资源 -
04023129:
请问一下怎么配置meetme有硬件要求么?
Asterks(软交换)里配置两部简单的SIP软电话 -
jayli426:
请教:
181 正被转接
202 被接受:用于转介
有 ...
所有已知的SIP处理应答状态码 -
ligg5034:
<ww:if test="sftd.equal ...
webwork<ww:if>标签的使用 -
wanggod:
请问我
return (Hello)super.getPort ...
java6 WebServices客户端
做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());
}
以下是我写的一个验证码生成方法,经改进行,性能比初时(我第一次写时)被时提升了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());
}
发表评论
-
java 正则表达
2009-05-13 10:32 1086public class Regex { ... -
Subversion+eclipse 构建版本控制环境
2009-05-13 10:31 1265构建版本控制环境 一 ... -
java6 WebServices发布在Tomcat服务器中
2009-05-13 10:30 2468新建一个web项目webservice ... -
java6 WebServices客户端
2009-05-13 10:27 3253在J ava6 WebServices 服务端 这篇文章中和大 ... -
java6 WebServices服务端
2009-05-13 10:25 1594java6 发布后,吸引人就是一个新特性WebService, ... -
JavaSE6.0 Web Service学习笔记
2008-07-29 15:07 1235Web Service概述 Web Service的定义 W3 ... -
DSC加密算法
2008-07-14 20:49 2813import java.security.Key; impor ... -
RSA加密算法
2008-07-14 20:46 1475import java.security.KeyPair;im ... -
java实现JDBC连接数据库的驱动与URL
2008-06-21 21:11 2323连接ACCESS String sDBDriver = &qu ... -
java记事本
2008-06-21 21:08 1664采用了第 3 方感官皮肤( xp )。总结该程序代码无非就是一 ... -
用java做的一个还原与备份
2008-06-21 21:04 1458ackage org.yu.dbback; import j ... -
(一)java里的MD5加密算法
2008-06-21 21:03 1146package MD5; import java.lang.r ...
相关推荐
jsp中文验证码,能实现中文字的验证码,非常不错。
jsp验证码,jsp中文验证码,数字验证码,汉字验证码
### jsp中文验证码实现原理与源码解析 #### 一、引言 随着网络技术的发展,网站的安全性问题越来越受到重视。验证码作为一种简单而有效的安全措施,在用户登录、注册等环节广泛使用。本文将深入探讨一种基于JSP的...
JSP 中文验证码 实现方法 JSP 中文验证码 实现方法
对于"jsp 中文验证码 源码"这个主题,我们将深入探讨如何在JSP(JavaServer Pages)环境中生成具有中文字符的随机验证码。 首先,JSP是Java的一种视图技术,它允许开发人员将动态代码嵌入到HTML、XML或其他标记语言...
### JSP中文验证码实现原理与源码解析 #### 一、引言 在现代Web应用中,验证码是一种常见的用户交互安全机制,用于区分用户是人类还是自动化程序。本文将详细介绍一个基于Java Server Pages (JSP)技术实现的中文...
在JSP(Java Server Pages)环境中实现验证码生成与验证,是确保网站安全的重要环节之一。根据给定的文件信息,我们可以详细解析其中涉及的关键知识点。 ### JSP中的验证码编写 #### 验证码生成 验证码生成主要...
在这个场景中,我们关注的是在JSP(Java Server Pages)和Java环境中生成中文验证码的技术。 首先,`jsp java 生成中文验证码`这个标题暗示我们要讨论如何在JSP应用中使用Java来创建包含中文字符的验证码。JSP是...
在本篇中,我们将详细探讨如何在Java Server Pages(JSP)环境中实现验证码功能。 验证码的主要目的是区分人类用户与机器,确保只有前者能进行特定的操作,比如注册、登录或提交表单。常见的验证码类型有图像验证码...
### jsp验证码——数字 #### 知识点详解 ##### JSP 验证码实现原理与过程 在本文档中,我们关注一个基于JavaServer Pages (JSP) 的数字验证码生成示例。此示例主要涉及到JSP页面的配置、Java图形处理库的使用以及...
在这个案例中,我们将用JSP来生成和处理图形验证码。 图形验证码的主要功能包括: 1. **生成随机字符**:在服务器端,我们需要生成一组随机的字母或数字作为验证码,通常长度为4到6位。这可以通过Java的`Random`类...
经典JSP生成验证码经典JSP生成验证码经典JSP生成验证码经典JSP生成验证码经典JSP生成验证码经典JSP生成验证码经典JSP生成验证码
在这个项目中,我们重点探讨如何使用JSP来创建用户登录界面,并结合图形验证码来防止恶意自动登录尝试,从而保护系统的安全性。 首先,JSP是Java平台上的动态网页技术,它允许开发人员在HTML或者XML文档中嵌入Java...
在这个【分享】JSP语音验证码接口demo中,我们聚焦于如何利用JSP技术实现一个高效、可靠的语音验证码功能。 1. **JSP基础**: - **基本原理**:JSP是一种服务器端脚本语言,它将HTML、CSS和JavaScript等前端元素与...
2. **JSP验证码实现步骤**: - **生成验证码**:在服务器端,可以使用Java的`Random`类生成随机字符串,然后存入session中。 - **展示验证码**:将生成的验证码通过JSP页面显示出来,如果是图片验证码,需要使用...
### JSP验证码大全之中文验证码实现详解 #### 一、引言 验证码作为一种常见的安全机制,在网站登录、表单提交等场景中起到了重要的作用。它能够有效防止恶意软件通过自动化手段进行攻击。本文将详细介绍如何在JSP...
### jsp验证码学习代码 #### 一、简介 在web应用程序的安全性方面,验证码是一种常见的保护机制,可以有效防止机器自动填写表单等自动化攻击行为。对于使用Java Server Pages(JSP)技术进行Web开发的技术人员来说...
很实用的jsp中文验证,一看就会! 适合各类开发人员使用!
在这个"JSP编程验证码登录系统"中,我们将深入探讨如何使用JSP来创建一个安全的登录页面,其中包含验证码功能,以防止恶意的自动化尝试或机器人攻击。 验证码(CAPTCHA)是"Completely Automated Public Turing ...
在JSP(JavaServer Pages)中实现验证码,主要是为了确保用户是真实的活生生的人,而不是机器,以此增加网站的安全性。这里我们将深入探讨JSP实现验证码的原理、步骤以及涉及到的相关知识点。 验证码的基本流程包括...