话不多说直接上代码!
jsp中验证码源文件:
<a id="ptr" href="javascript:;"><img height="27px" alt="换一张" src="<%=request.getContextPath() %>/getVerifyCode" id="prtImg"/></a>
struts配置文件:
<!-- 验证码 -->
<action name="getVerifyCode" class="verifyCodeAction" method="getVerifyCode" >
<result type="stream">
<param name="contentType">image/jpeg</param>
<param name="inputName">inputStream</param>
</result>
</action>
java代码:
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
* 类描述:验证码生成
*
* @author ming.li
* @time 2011-4-21 上午11:30:45
*/
public class VerifyCodeAction extends ActionSupport {
/** 版本号 */
private static final long serialVersionUID = 5090480110300205197L;
/** 文件输入流 */
private ByteArrayInputStream inputStream;
/** 随机数 */
private static final Random random = new Random();
/** MD5加密 */
private static final MD5 md5 = new MD5();
/** 文本类型 */
private static final String CONTENT_TYPE = "image/jpeg";
/** 画布宽度 */
private static int imgWidth = 60;
/** 画布高度 */
private static int imgHeight = 20;
/** 验证码位数 */
private static int imgCount = 4;
/**
*
* 方法描述:获取验证码
*
* @author ming.li
* @time 2011-4-25 下午01:56:19
*
* @return
*/
public String getVerifyCode() {
try {
this.inputStream = generateImage();
} catch (IOException e) {
e.printStackTrace();
}
return SUCCESS;
}
/**
*
* 方法描述:输出验证码图片
*
* @author ming.li
* @time 2011-5-30 下午01:44:04
*
* @return
*/
public ByteArrayInputStream getInputStream() {
return inputStream;
}
/**
*
* 方法描述:输入验证码文件到流中
*
* @author ming.li
* @time 2011-4-25 下午01:56:29
*
* @return
* @throws IOException
*/
private ByteArrayInputStream generateImage() throws IOException {
HttpServletResponse response = ServletActionContext.getResponse();
HttpServletRequest request = ServletActionContext.getRequest();
response.setContentType(CONTENT_TYPE);
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
// PrintWriter out = response.getWriter();
int width = imgWidth, height = imgHeight;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 获取图形上下文
Graphics g = image.getGraphics();
// 设定背景色
g.setColor(getRandColor(200, 250));
g.setColor(new Color(255, 255, 255));
g.fillRect(0, 0, width, height);
// 设定字体
g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
// 画边框
g.setColor(getRandColor(200, 250));
g.drawRect(0, 0, width - 1, height - 1);
// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
g.setColor(getRandColor(160, 200));
for (int i = 0; i < 10; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(100);
int yl = random.nextInt(12);
g.drawLine(x, y, x + xl, y + yl);
}
// 取随机产生的认证码(4位数字)
StringBuffer randSB = new StringBuffer();
for (int i = 0; i < imgCount; i++) {
String rand = String.valueOf(random.nextInt(10));
randSB.append(rand);
// 将认证码显示到图象中
g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110))); // 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
g.drawString(rand, 13 * i + 6, 16);
}
// 将认证码存入SESSION
String randMD5 = md5.getMD5ofStr(randSB.toString());
request.getSession().setAttribute(Constants.VERFIY_CODE, randMD5);
// 图象生效
g.dispose();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ImageIO.write(image, "JPEG", bos);
byte[] buf = bos.toByteArray();
return new ByteArrayInputStream(buf);
}
/**
*
* 方法描述:给定范围获得随机颜色
*
* @author ming.li
* @time 2011-4-25 下午01:56:55
*
* @param fc
* @param bc
* @return
*/
private static Color getRandColor(int fc, int bc) {
// Random random = new Random();
if (fc > 255) {
fc = 255;
}
if (bc > 255) {
bc = 255;
}
int r = fc + random.nextInt(bc - fc);
int g = fc + random.nextInt(bc - fc);
int b = fc + random.nextInt(bc - fc);
return new Color(r, g, b);
}
}
分享到:
相关推荐
struts2图形验证码实现,两个实现类,和你一个action类
(参照别人的代码) 部署: 1、将整个源码引入到MyEclipse当中. 2、部署到Tomcat下面,启动服务器,直接 敲...2、当你登录时候,提交的输入框中的验证码和session中存放的验证码比较,如果一样,则通过,不一样,则失败
在Struts2框架下实现验证码功能,可以帮助提升用户体验和系统安全性。以下将详细讲解如何在Struts2中创建前端注册验证码。 首先,验证码的实现通常包括两个主要部分:后端生成验证码和前端展示及验证。 1. **后端...
在本文中,我们将深入探讨如何在Struts2框架中实现验证码功能,并结合JavaScript和session技术来增强用户体验。 首先,验证码的核心是生成一个随机的、难以自动识别的图像。这通常涉及到以下几个步骤: 1. **生成...
java动态验证码Struts2集成实现
"最新的struts2验证码.rar"很可能包含了有关如何在Struts2框架下实现验证码功能的示例代码或配置文件。 Struts2验证码的实现通常涉及到以下几个关键知识点: 1. **验证码生成**:验证码通常由随机生成的一串字符或...
Struts2 验证码实例;通过该实例可掌握验证码的实现原来
本教程将详细讲解如何利用Struts2框架来实现验证码功能。 首先,我们需要理解验证码的基本原理。验证码通常是一串随机生成的字符或数字,用户需要正确输入才能完成特定操作,如登录、注册等。它的主要目标是验证...
在Struts2框架中,实现验证码功能主要是为了增强网站的安全性,防止自动化脚本或恶意用户进行批量、无意义的注册或登录尝试。以下将详细解释如何在Struts2环境中设置验证码并展示其核心组件: 1. **HTML 页面**: ...
总结来说,基于Struts1.x的验证码实现是Web开发中的重要环节,它涉及到服务器端的生成、存储、验证,以及客户端的显示和用户交互。通过合理的验证码设计和实现,可以显著提高Web应用程序的安全性,保护用户的账户不...
Struts2作为一款流行的Java Web应用框架,支持多种方式来实现验证码功能。本文将详细介绍如何在Struts2项目中生成并显示验证码。 #### 二、核心概念 1. **验证码**:一种用于区分用户是人还是计算机程序的技术手段...
开发环境: eclipse Kepler JEE IDE + Tomcat v6.0 + Struts-2.3.15(最新版) 步骤: 1. 下载后解压,import to eclipse as a project. 2. 启动 Tomcat v6.0 3. 打开...
在Struts2中,验证码的实现通常涉及到以下几个关键知识点: 1. **Action类**:在Struts2中,Action类是处理用户请求的核心组件。你需要创建一个专门的Action类来处理验证码的生成和验证。这个类通常会包含两个方法...
通过以上步骤,我们就能在Struts2应用中实现一个完整的验证码功能。这不仅提高了网站的安全性,也为用户提供了更好的交互体验。在实际开发中,还需要根据项目需求进行相应的定制和优化,确保验证码系统既有效又易于...
通过struts2实现验证码登录,验证码可以点击更换 ,包含用户名密码校验
综上所述,Struts2验证码的实现利用了Java AWT库来生成内存中的图片,结合Struts2框架的流结果类型,实现了动态生成并返回验证码的功能。这种技术提高了网站安全性,防止了自动化脚本的恶意操作,同时通过JavaScript...
我们这里采用的是ajax+struts2来做的这个验证。 我们新建一个web工程。然后需要导入struts的相应包。之后我们需要写一个类来生成验证码。 博客地址:http://blog.csdn.net/sdksdk0/article/details/51755489
总之,"一个简单的Struts2验证码"涉及到的是在Struts2框架下实现验证码功能的全过程,涵盖了从生成验证码到用户验证的各个步骤。理解并掌握这个过程对于提升web应用的安全性和防止自动化攻击至关重要。
本资源"用Struts实现验证码.rar"提供了一个使用Struts框架实现验证码功能的示例,对于学习Struts和Web安全开发的初学者来说非常有价值。 验证码的核心目的是通过生成一种人类可以轻易识别但计算机难以自动解析的...