package org.apache.struts.action;
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.util.Random;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class RandomPictureAction extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = -6950908478971552308L;
private ByteArrayInputStream inputStream;
public String execute() throws Exception {
// 在内存中创建图象
int width = 85, height = 20;
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// 获取图形上下文
Graphics g = image.getGraphics();
// 生成随机类
Random random = new Random();
// 设定背景色
g.setColor(getRandColor(200, 250));
g.fillRect(0, 0, width, height);
// 设定字体
g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
g.setColor(getRandColor(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);
}
// 取随机产生的认证码(6位数字)
String sRand = "";
for (int i = 0; i < 6; i++) {
String rand = String.valueOf(random.nextInt(10));
sRand += 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
ActionContext.getContext().getSession().put("rand", sRand);
// 图象生效
g.dispose();
ByteArrayOutputStream output = new ByteArrayOutputStream();
ImageOutputStream imageOut = ImageIO.createImageOutputStream(output);
ImageIO.write(image, "JPEG", imageOut);
imageOut.close();
ByteArrayInputStream input = new ByteArrayInputStream(output
.toByteArray());
this.setInputStream(input);
return SUCCESS;
}
/*
* 给定范围获得随机颜色
*/
private 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);
}
public void setInputStream(ByteArrayInputStream inputStream) {
this.inputStream = inputStream;
}
public ByteArrayInputStream getInputStream() {
return inputStream;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="randpicture" extends="struts-default">
<action name="rand" class="org.apache.struts.action.RandomPictureAction">
<result type="stream">
<param name="contentType">image/jpeg</param>
<param name="inputName">inputStream</param>
</result>
</action>
</package>
</struts>
<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<s:head />
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Random Picture</title>
</head>
<body>
<script type="text/javascript">
function changeValidateCode(obj) {
var currentTime= new Date().getTime();
obj.src = "rand.action?d=" + currentTime;
}
</script>
<img src="rand.action" onclick="changeValidateCode(this)" />
</body>
</html>
分享到:
相关推荐
Struts2是一个强大的MVC(Model-...总结起来,Struts2实现验证码功能涉及到Java类的编写、session管理、Struts2配置、JSP页面设计以及用户交互逻辑的处理。掌握这些步骤,可以帮助开发者构建安全且用户友好的Web应用。
Struts2是一个强大的MVC(Model-View-Controller)框架,广泛...实际开发中,登录功能会涉及到更复杂的验证和安全考虑,如密码加密、验证码、记住我功能等,但这个基础实例足以帮助初学者理解Struts2的基本工作流程。
在这个"struts2+spring3验证码登录实例"中,验证码功能是一个重要的安全措施,它可以防止恶意的自动登录尝试或机器人攻击。验证码通常由一串随机生成的字符或数字组成,用户需要在输入框中正确输入才能完成登录。...
在这个“Struts2登录验证实例”中,我们将探讨如何利用Struts2实现用户登录功能,包括用户输入验证、会话管理以及错误处理等关键环节。 首先,我们需要在项目中引入Struts2的核心库。这通常通过在`pom.xml`(如果...
在本实例中,“adajx_struts2登陆框”着重展示了如何利用Struts2框架与AJAX技术结合,创建一个动态、交互式的登录界面。 首先,我们需要理解Struts2的核心概念。Struts2框架通过Action类处理用户请求,并返回相应的...
Struts验证码插件JCaptcha4Struts2是一个用于Java Web应用程序的安全组件,旨在防止自动机器人或恶意用户通过表单提交不合法数据。该插件基于Java的开源项目JCaptcha(Just Another CAPTCHA)构建,提供了可视化挑战...
通过这个实例,开发者可以深入理解Struts2框架的Action、结果类型、拦截器以及如何与前端页面交互。同时,这也是一个实际运用Java图形处理和Session管理的示例,对于提升Web安全性的理解非常有帮助。在实际项目中,...
这个"struts2登录实例"旨在展示如何利用Struts2实现一个基本的用户登录功能。下面我们将深入探讨Struts2的核心概念以及如何构建一个简单的登录系统。 1. **Struts2框架基础** - **Action类**:在Struts2中,Action...
这个实例不仅涵盖了Struts2的基础使用,也涉及到了Web开发中常见的用户管理模块,是学习和理解Struts2框架的绝佳实践。在实际开发中,还可以根据项目需求扩展更多的功能,如权限控制、验证码、邮箱验证等。
在Struts2配置文件(struts.xml)中,我们需要为生成验证码的Action添加一个对应的URL映射,以及一个显示验证码的JSP页面。JSP页面可能包含一个img标签,其src属性指向生成验证码的Action URL。当用户点击刷新按钮...
### Ajax+Struts2实现验证码验证功能实例代码知识点解析 #### 概述 验证码(CAPTCHA,Completely Automated Public Turing test to tell Computers and Humans Apart)是区分人类用户和计算机程序(机器人)的自动...
在这个特定的示例中,我们看到如何使用Struts2来实现一个简单的6位数字验证码程序。验证码的主要目的是验证用户是否是人类,防止自动化机器人进行恶意操作,如注册、登录等。 首先,`login.jsp`页面包含一个...
本项目涉及的知识点主要集中在"jsp中用户登录代码(struts2)",这包括Struts2框架的使用、数据库连接、SQL查询以及JSP页面的设计。 首先,**Struts2框架**是基于Apache的开源框架,它的核心是Action类,用于接收和...
3. **显示验证码**:在客户端,Struts的视图层(通常是JSP)负责展示验证码图片。通常使用`<img>`标签,并设置其`src`属性指向服务器端生成验证码的URL。 4. **用户输入验证**:用户在看到验证码后,需要输入到表单...
7. **源码分析**: 博客可能还深入解析了相关代码,包括Struts2配置文件(struts.xml)、Action类、验证码生成类以及视图层的JSP或FreeMarker模板等,以帮助读者理解每个部分的作用和交互。 通过以上步骤,开发者...
这个"struts2+srping+hibernate 登录实例"应该是一个演示如何整合这三个框架来实现用户登录功能的项目。 **Struts2** 是一个基于MVC设计模式的Action驱动的Web应用框架,它负责处理HTTP请求,并通过Action转发到...
《基于Struts的图书管理系统——JSP信息办公实例解析》 在信息技术日益发达的今天,JSP(JavaServer Pages)作为Web开发中的重要技术之一,被广泛应用于各种信息系统的设计与开发,尤其是信息办公领域。本实例——...
2. **Struts框架**: Struts是一个开源的MVC(Model-View-Controller)框架,用于构建可维护性和可扩展性高的Web应用程序。在用户登录场景中,Struts可以帮助我们处理HTTP请求,管理业务逻辑,并将数据展示在视图层...
总结来说,这个“简单的个人博客系统”是一个基于Struts2框架的Web应用实例,它展示了如何利用Java Web技术来实现一个功能完善的博客平台。开发者可以通过研究该项目,学习Struts2的用法以及如何构建一个完整的MVC...