- 浏览: 650321 次
- 性别:
- 来自: 合肥
文章分类
最新评论
-
nehaoww:
754588141@qq.com,源码可以给一份吗
Struts/JSP可上传、预览服务器端文件(图片、文件、Flash、多媒体)文件组件 -
zzd_md:
把XmlTreeLoader.js 这个文件的路径改一下就好了 ...
ExtJs 实现的后台管理框架 -
llixinrui_strive:
EXT之form.load(转) -
liangzhang0929:
部门管理和用户管理的url怎么显示#,没法打开dept_lis ...
Extjs3.x Struts2 -Json-plugin学习实例 -首页框架代码 05 -
datouren:
您好想问你一下 为什么只显示根节点 其它节点不显示 目前是在一 ...
ExtJs加载本地txt格式的数据
验证码代码取之网络,但是网络上代码都不完整,因此修改后发上来大家分享。
先看看效果:
一、生成图形验证码的Action
package com.wjt276.co.web.actions; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import com.wjt276.co.managers.ValidateImageManager; @SuppressWarnings("serial") public class ValidateImgAction extends BaseAction { /** * 用于保存已经生成的图形验证码输入流对象,以便在前台显示图形 */ private ByteArrayInputStream inputStream; /** * 图形验证码创建接口 */ private ValidateImageManager validateImageManager; /** * 图形验证码图形的宽度 */ private int width; /** * 图形验证码图形的高度 */ private int height; /** * 图形验证码图形上字体大小 */ private int fontSize; /** * 生成验证码的位数 */ private int codeLength; /** * 图形验证码的图形类型 */ private String contentType; public String execute() throws Exception{ //保存已经生成好的验证码 Key.validateCode = createInputStream(ValidateImageManager.Disturb_Type_Complex); return SUCCESS; } /** * 在Action层创建图形验证码,并将创建好的图形字节流保存到inputStream对象中,并返回验证码 * @param disturbType 绘制干扰线的类型;<br/> * 0:不绘制干扰线;<br/> * 1:绘制单一色调的干扰线;<br/> * 2:绘制复杂的干扰线 * @return 返回已经生成好的验证码字符 * @throws IOException */ protected String createInputStream(int disturbType) throws IOException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); String validateCode = null; validateCode = validateImageManager.createValidateCode(disturbType, this.getFontSize(), bos, this.getWidth(), this.getHeight(), getText("System.validateCode",ValidateImageManager.Default_ValidateCode), this.getCodeLength()); inputStream = new ByteArrayInputStream(bos.toByteArray()); bos.close(); return validateCode; } //------------以下为getXXX/setXXX方法------------------------- public ByteArrayInputStream getInputStream() { return inputStream; } public void setInputStream(ByteArrayInputStream inputStream) { this.inputStream = inputStream; } public ValidateImageManager getValidateImageManager() { return validateImageManager; } public void setValidateImageManager(ValidateImageManager validateImageManager) { this.validateImageManager = validateImageManager; } public String getContentType() { if(null == this.contentType || "".equals(this.contentType.trim())){ return Key.DEFAULT_VALIDATEIMG_CONTENT_TYPE; } return contentType; } public void setContentType(String contentType) { this.contentType = contentType; } public int getWidth() { if(this.width < Key.DEFAULT_VALIDATEIMG_WIDTH){ return Key.DEFAULT_VALIDATEIMG_WIDTH; } return width; } public void setWidth(int width) { this.width = width; } public int getHeight() { if(this.height < Key.DEFAULT_VALIDATEIMG_HEIGHT){ return Key.DEFAULT_VALIDATEIMG_HEIGHT; } return height; } public void setHeight(int height) { this.height = height; } public int getFontSize() { if(this.fontSize < Key.DEFAULT_VALIDATEIMG_FONT_SIZE){ return Key.DEFAULT_VALIDATEIMG_FONT_SIZE; } return fontSize; } public void setFontSize(int fontSize) { this.fontSize = fontSize; } public int getCodeLength() { if(this.codeLength < Key.DEFAULT_VALIDATEIMG_CODE_LENGTH){ return Key.DEFAULT_VALIDATEIMG_CODE_LENGTH; } return codeLength; } public void setCodeLength(int codeLength) { this.codeLength = codeLength; } }
二、生成图形验证码的接口ValidateImageManager
package com.wjt276.co.managers;
import java.io.ByteArrayOutputStream;
public interface ValidateImageManager {
/**
* 默认验证字符串
*/
public static final String Default_ValidateCode = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
/**
* 默认绘制干扰线的类型(不绘制干扰线)
*/
public static final int Disturb_Type_Default = 0;
/**
* 绘制单一色调的干扰线
*/
public static final int Disturb_Type_Simple = 1;
/**
* 绘制复杂的干扰线
*/
public static final int Disturb_Type_Complex = 2;
/**
* 生成验证图片并返回验证码
*
* @param disturbType 绘制干扰线的类型;<br/>
* 0:不绘制干扰线;<br/>
* 1:绘制单一色调的干扰线;<br/>
* 2:绘制复杂的干扰线
* @param fontSize 图形上验证码字体的大小
* @param bos 字节流,用于返回生成的图形验证码字节流,并显示于前台
* @param width 图形的宽度
* @param height 图形的高度
* @param validateCode 默认的验证码编码
* @param codeLength 验证码字符长度
* @return 返回生成好的验证码字符
*/
public abstract String createValidateCode(int disturbType, int fontSize,
ByteArrayOutputStream bos, int width, int height,
String validateCode, int codeLength);
}
一、生成图形验证码的实现ValidateImageManagerImpl
package com.wjt276.co.managers.impl;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;
import com.wjt276.co.managers.ValidateImageManager;
public class ValidateImageManagerImpl extends AbstractManager implements
ValidateImageManager {
/**
* 生成验证图片并返回验证码
*
* @param disturbType 绘制干扰线的类型;<br/>
* 0:不绘制干扰线;<br/>1:绘制单一色调的干扰线;<br/>2:绘制复杂的干扰线
* @param fontSize 图形上验证码字体的大小
* @param bos 字节流,用于返回生成的图形验证码字节流,并显示于前台
* @param width 图形的宽度
* @param height 图形的高度
* @param validateCode 默认的验证码编码
* @param codeLength 验证码字符长度
* @return 返回生成好的验证码字符
*/
public String createValidateCode(int disturbType,
int fontSize,
ByteArrayOutputStream bos,
int width,
int height,
String validateCode,
int codeLength) {
BufferedImage bImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = bImg.getGraphics();
Random random = new Random();
if (null == validateCode || validateCode.isEmpty()) {
validateCode = Default_ValidateCode;
}
if (fontSize >= height) {
fontSize = height - 1;
}
drawOutline(g, width, height);
switch (disturbType) {
case Disturb_Type_Simple:
drawSimpleDisturb(g, random, width, height);
break;
case Disturb_Type_Complex:
drawDisturb(g, random, width, height);
break;
default:
break;
}
String code = drawCode(g, random, validateCode, codeLength, width,
height, fontSize);
g.dispose();
try {
ImageOutputStream imOut = ImageIO.createImageOutputStream(bos);
ImageIO.write(bImg, "JPEG", imOut);
imOut.close();
} catch (IOException e) {
e.printStackTrace();
}
return code;
}
/**
* 绘制边框
*
* @param g
* @param width
* @param height
*/
private static void drawOutline(Graphics g, int width, int height) {
g.setColor(Color.white);
g.fillRect(0, 0, width, height);
g.setColor(Color.BLACK);
g.drawRect(0, 0, width - 1, height - 1);
}
/**
* 绘制比较复杂的干扰线
*
* @param g
* @param random
* @param width
* @param height
*/
private static void drawDisturb(Graphics g, Random random, int width,
int height) {
int x, y, x1, y1;
for (int i = 0; i < width; i++) {
x = random.nextInt(width);
y = random.nextInt(height);
x1 = random.nextInt(12);
y1 = random.nextInt(12);
g.setColor(getRandomColor(random, 120, 255));
g.drawLine(x, y, x + x1, y + y1);
g.fillArc(x, y, x1, y1, random.nextInt(360), random.nextInt(360));
}
}
/**
* 绘制简单的干扰线
*
* @param g
* @param random
* @param width
* @param height
*/
private static void drawSimpleDisturb(Graphics g, Random random, int width,
int height) {
g.setColor(getRandomColor(random, 160, 200));
for (int i = 0; i < 155; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x, y, x + xl, y + yl);
}
}
/**
* 取得随机颜色
*
* @param random
* @param pMin
* @param pMax
* @return
*/
private static Color getRandomColor(Random random, int pMin, int pMax) {
pMax = (Math.abs(pMax) > 255 ? 255 : Math.abs(pMax));
pMin = (Math.abs(pMin) > 255 ? 255 : Math.abs(pMin));
int r = pMin + random.nextInt(Math.abs(pMax - pMin));
int g = pMin + random.nextInt(Math.abs(pMax - pMin));
int b = pMin + random.nextInt(Math.abs(pMax - pMin));
return new Color(r, g, b);
}
/**
* 绘制验证码
*
* @param g
* @param random
* @param validateCode
* @param codeLength
* @param width
* @param height
* @param fontSize
* @return
*/
private static String drawCode(Graphics g, Random random,
String validateCode, int codeLength, int width, int height,
int fontSize) {
int validateCodeLength = validateCode.length();
Font font1 = new Font("Verdana", Font.BOLD, fontSize);
Font font2 = new Font("serif", Font.BOLD, fontSize);
StringBuffer sb = new StringBuffer();
int x, y;
for (int i = 0; i < codeLength; i++) {
x = (width / codeLength - 1) * i
+ random.nextInt(width / (codeLength * 2));
y = random.nextInt(height - fontSize) + fontSize;
sb.append(getRandomChar(validateCode, validateCodeLength, random));
g.setColor(getRandomColor(random, 70, 150));
if (sb.substring(i).getBytes().length > 1)
g.setFont(font2);
else
g.setFont(font1);
g.drawString(sb.substring(i), x, y);
}
return sb.toString();
}
/**
* 取得随机字符
*
* @param validateCode
* @param validateCodeLength
* @param random
* @return
*/
private static char getRandomChar(String validateCode,
int validateCodeLength, Random random) {
return validateCode.charAt(random.nextInt(validateCodeLength));
}
}
发表评论
-
java中switch case用法
2010-11-08 11:40 3867关于java中switch使用的一些说明 switc ... -
计算两个日期之间的天数
2010-08-10 16:14 1949//计算两个日期之间的天数 public static ... -
Struts2 生成图形验证码及进行验证码验证-修改后代码(二)
2010-07-28 09:48 2667三、BaseAction代码 package com. ... -
Java位操作
2010-06-12 10:39 1119二进制负数以它正值的补码形式表达 补码:反码+1等于补码 ... -
Thread.Sleep(0)
2010-04-13 14:03 4287Thread.Sleep(0) 表示挂起0毫秒,你可能觉得没作 ... -
System.currentTimeMillis()
2010-04-13 14:00 6134首先System.currentTimeMillis()产生一 ... -
Random
2010-04-13 13:58 1659一、Random 1、创建Random ... -
排序口诀
2010-04-13 11:47 1321马老师的口诀: 冒择路(入)兮(希尔)快归堆 冒泡 选择 ... -
将JAVA编译为EXE的几种方法
2009-12-23 12:26 1088将Java应用程序本地编译为EXE的几种方法(建议使用JOVE ... -
一个Java程序员应该掌握的10项技能
2009-11-01 12:10 10851、语法:必须比较熟悉,在写代码的时候IDE的编辑器对某一行报 ... -
Jdbc连接各种数据库代码方法大全
2009-11-01 12:08 12661、Oracle8/8i/9i数据库(thin模式) Cla ... -
Java四舍五入保留两位小数
2009-11-01 12:05 10107public static void main(String[ ... -
Java 将字符串转换为日期
2009-08-24 07:04 1756try { String strForm ... -
for each循环
2009-08-24 06:58 1680for each循环 是jdk5.0新增加的一个循环结构, ... -
java 根据IP获取客户端Mac地址
2009-08-18 22:48 6944需要对用户的 ip 和 mac 地址进行验证,这里用到获取客户 ...
相关推荐
在这个特定的场景中,我们讨论的是如何在Struts2中创建一个能够生成中文验证码的Action。 验证码的主要目的是防止自动机器人或恶意攻击,通过向用户提供一组随机字符(通常是数字和/或字母)来验证他们是否是真实的...
Struts2提供了一些内置的支持来帮助开发者生成和验证验证码,以增强网站的安全性。 验证码的种类多样,包括图像验证码、音频验证码、数学问题验证码等。在Struts2中,我们可以使用插件或自定义拦截器来实现这些功能...
验证码是一种常见的网络安全机制,用于防止自动化程序(如机器人或爬虫)进行非法操作,比如注册、登录、提交表单等。在本案例中,“成功的验证码案例-----struts验证码demo”是一个基于Struts框架实现的简单易懂的...
在Struts2的Action中,取出Session中的验证码与用户输入的进行比较,如果匹配则通过验证,否则返回错误信息。 ```java String userCaptcha = actionRequest.getParameter("captcha"); String sessionCaptcha = ...
验证码的核心目的是通过生成随机的图形或字符让用户输入来验证其是否为真实用户。通常包括以下几个步骤: 1. **生成随机字符串**:作为验证码的基础。 2. **渲染成图像**:将字符串转化为图像形式展示给用户。 3. **...
总的来说,通过Eclipse、Struts和Hibernate的结合,我们可以构建出一个完整的、安全的用户登录系统,并辅以图形验证码增强安全性。这个视频教程将会详细演示以上所有步骤,帮助开发者快速掌握这些核心技术的应用。
总结来说,Struts2实现图片验证码主要涉及生成随机字符串、绘制图片、配置Action、定义结果类型以及处理用户验证。这个过程需要结合Java图形编程、HTTP响应处理和会话管理等多个方面的知识。通过实践,你可以更好地...
Struts2验证码是一种用于验证用户身份的安全机制,它在Web应用程序中广泛使用,防止恶意自动化的机器人或爬虫进行操作,比如防止批量注册、刷票等。本示例提供了使用Struts2框架实现验证码功能的完整代码,全部采用...
"通过Struts2返回验证码文件"这一主题主要涉及如何利用Struts2来生成并返回一个动态的、用于验证用户输入的图形验证码。以下是对这个知识点的详细阐述: 首先,验证码是一种安全机制,它要求用户输入在图像上显示的...
在Struts2的配置中,需要定义一个Action来处理验证码的生成和验证。这可能涉及以下配置: ```xml <param name="contentType">image/jpeg <param name="inputName">captchaImage <param name="buffered">true ...
在Struts2中实现验证码功能,可以自定义一个Servlet来生成并处理验证码图像。 首先,让我们深入了解一下在上述代码中创建验证码的步骤: 1. **定义字体和图像尺寸**: 类`AuthImg`定义了一个内部常量`mFont`,它...
提交表单后,服务器端的action类(可能是一个Servlet或Struts Action)会接收到请求,从会话中取出预存的验证码字符串,与用户输入的验证码进行比对,判断是否匹配,从而完成验证。 验证码的验证流程通常如下: 1. ...
在这个项目中,开发者使用Eclipse、Struts和Hibernate来创建一个图形验证码功能,以增强用户登录的安全性。 首先,`LoginAction.java`是Struts框架中的Action类,它是业务逻辑处理的核心。这个文件通常会包含处理...
验证码图片生成器是一种用于网络安全验证的技术,主要用于防止自动化的机器人或恶意软件进行非法操作,如批量注册、恶意登录等。这个Java源码实现的验证码生成器具有易用性且适应性强,可以根据需求调整验证码的类型...
4. **Session存储**:为了在用户提交验证码后进行验证,我们需要将生成的验证码存储在用户的Session中。Session是服务器端的一种数据存储机制,用于在用户会话期间保持数据,防止跨请求的数据篡改。 5. **表单提交*...
在Spring中,我们可以配置一个Bean来代表验证码服务,然后在Struts2 Action中注入这个服务,以便获取和验证验证码。在Hibernate中,虽然通常不需要直接与验证码交互,但如果有存储用户验证历史需求,我们可以利用...
验证码(CAPTCHA)在IT行业中是用于验证用户身份的一个安全机制,主要目的是防止恶意自动程序(如机器人)进行非法操作,比如批量注册、恶意登录等。在Java开发中,实现验证码功能是常见的需求,尤其在登录系统中。...
4. **验证码验证**: - 用户输入验证码后提交表单。 - 在后端获取`HttpSession`中的验证码并与用户输入进行比较。 #### 四、代码分析 - **验证图片生成**: ```java package cn.com.lough.struts.action; ...
用户提交表单时,Struts2会调用预先配置的验证码验证拦截器,比较session中的验证码值与用户输入,若不匹配则抛出异常或返回错误信息。 ### 其他相关知识点 1. **.jar包**: 提供的.jar包可能包含了验证码生成所...
- **知识点**: 介绍了如何创建自定义标签来实现图形验证码功能。 - **核心内容**: - 自定义标签需要通过实现Tag接口来创建。 - 可以通过配置文件将自定义标签集成到项目中。 通过以上内容的学习,我们可以深入...