Struts2 实现验证码功能详解

需积分: 3 14 下载量 186 浏览量 更新于2024-09-22 1 收藏 68KB DOC 举报
"struts2验证码实现方法" 在Struts2框架中,验证码的实现主要涉及到动态生成图片并将其发送到浏览器的过程。以下是如何在Struts2中创建和使用验证码的详细步骤: 首先,验证码的目的是为了防止自动化程序(如机器人)进行非法操作,通常用于表单提交验证用户身份。它通过生成一串随机数字或字母,然后要求用户输入相同的内容来确认他们不是机器。 1. HTML 页面设计: 在`register.jsp`页面中,我们看到一个`<form>`元素内包含一个文本输入框用于用户输入验证码和一个`<img>`标签显示验证码图片。JavaScript函数`changidateCode(obj)`被用来在每次点击图片时更改验证码。这里的`d`参数传递当前时间戳,确保每次请求的验证码是不同的,避免浏览器缓存导致验证码不更新。 ```jsp <script type="text/javascript"> function changidateCode(obj) { var timeNow = new Date().getTime(); obj.src = "creatidateAction.action?d=" + timeNow; } </script> <form> <table> <tr> <td align="right">验证码:</td> <td><s:textfield name="validate"></s:textfield></td> <td><img src="creatidateAction" align="left" onclick="changidateCode(this)"/></td> </tr> </table> </form> ``` 2. Struts2 Action 实现: `creatidateAction.java`是处理验证码生成的核心。这个Action继承自`ActionSupport`,并定义了一个`ByteArrayInputStream`来存储生成的图片数据。Action的主要任务是生成随机数字,将其画到图片上,并将图片以流的形式返回给浏览器。 ```java import java.io.*; import java.util.Map; import javax.imageio.ImageIO; import javax.imageio.stream.ImageOutputStream; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import java.awt.*; import java.awt.image.BufferedImage; public class creatidateAction extends ActionSupport { private ByteArrayInputStream inputStream; // 生成验证码的方法 public String execute() throws IOException { // 生成随机数字或字母的逻辑 // ... // 创建BufferedImage对象,设置图片尺寸和颜色 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D g = image.createGraphics(); // 绘制背景、线条等 // ... // 生成随机字符串并写入图片 g.setColor(Color.BLACK); g.drawString(randomString, x, y); // 将图片保存到ByteArrayOutputStream ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(image, "jpg", baos); inputStream = new ByteArrayInputStream(baos.toByteArray()); // 设置Action的返回类型为stream,以便返回图片数据 return ActionSupport.STREAM; } // 其他getter和setter方法 // ... } ``` 在这个Action中,我们需要实现生成随机字符串的逻辑,可以使用`Random`类生成随机数字,然后绘制到图片上。同时,我们还需要配置Struts2的配置文件,指定`creatidateAction`返回`stream`类型并指明如何处理这个流,例如设置`Content-Type`为`image/jpeg`。 3. Struts2配置: 在`struts.xml`配置文件中,需要为`creatidateAction`添加相应的配置,告诉Struts2如何处理返回的`stream`类型结果。 ```xml <package name="default" namespace="/" extends="struts-default"> <!-- ... --> <action name="creatidateAction" class="creatidateAction"> <result type="stream"> <param name="contentType">image/jpeg</param> <param name="inputName">inputStream</param> </result> </action> <!-- ... --> </package> ``` 总结来说,Struts2验证码的实现主要包括前端页面的交互、后端Action的生成和返回以及Struts2框架的配置。通过这样的方式,我们可以创建一个动态的、每次刷新都不同的验证码,从而提高网站的安全性。