实现生成动态验证码并验证,我们可以通过Struts2框架结合java的验证码生成工具包Jcaptcha实现。下面是具体的步骤和示例代码:
步骤1:添加Jcaptcha依赖
我们首先需要添加Jcaptcha的依赖,可以在pom.xml
中加入以下代码:
<dependency>
<groupId>com.github.stephenc.jcip</groupId>
<artifactId>jcaptcha</artifactId>
<version>2.0.0</version>
</dependency>
步骤2:生成验证码
为了生成验证码,我们需要在Action
类中编写以下代码:
import com.octo.captcha.service.CaptchaServiceException;
import com.octo.captcha.service.image.ImageCaptchaService;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import org.apache.struts2.ServletActionContext;
import org.springframework.beans.factory.annotation.Autowired;
…
private ImageCaptchaService imageCaptchaService; //注入ImageCaptchaService
public String generateCaptchaImage()throws Exception{
HttpServletResponse response = ServletActionContext.getResponse();
response.setDateHeader("Expires", 0);
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
response.addHeader("Cache-Control", "post-check=0, pre-check=0");
response.setHeader("Pragma", "no-cache");
response.setContentType("image/jpeg");
String captchaId = request.getSession().getId();
BufferedImage challenge = null;
//生成验证码图片和获取生成的字符串
try {
challenge = imageCaptchaService.getImageChallengeForID(captchaId, request.getLocale());
} catch (IllegalArgumentException e) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return null;
} catch (CaptchaServiceException e) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
return null;
}
ServletOutputStream out = response.getOutputStream();
//返回生成的验证码图片
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(challenge);
out.close();
return null;
}
该方法的用途是生成一个包含验证码的图片,并将其输出到客户端。其中,imageCaptchaService.getImageChallengeForID(captchaId, request.getLocale())
方法会生成一个包含验证码的图片,同时返回验证码的字符串。
步骤3:验证验证码
我们需要添加一个方法,在用户提交表单时验证验证码是否正确,该方法的代码如下:
public String validateCaptcha(){
// 从session中获取正确的验证码信息
String captcha = (String)ServletActionContext.getRequest().getSession().getAttribute(CaptchaServletUtil.CAPTCHA_SESSION_KEY);
if (!userVo.getVerifyCode().equals(captcha)) {
//如果验证码不正确,则返回错误信息
addActionError("验证码错误!");
return ERROR;
}
return SUCCESS;
}
这个方法将会获取用户在表单中填写的验证码,与之前生成的验证码进行比较,如果验证码不同则向页面输出错误信息。
示例1:在注册页面中添加验证码
我们可以将生成验证码的方法和注册页面结合起来,生成一个包含验证码的注册页面。该注册页面包含一个图片输入框和一个提交按钮。代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>注册页面</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<h1>注册页面</h1>
<s:form action="doRegister" method="POST">
<s:textfield name="username" label="用户名"/>
<s:password name="password" label="密码"/>
<s:password name="repassword" label="确认密码"/>
<s:textfield name="verifyCode" label="验证码" size="20"/>
<s:image name="captcha" border="0" align="absmiddle"/>
<s:hidden name="realCode" value="%{#session.verifyCode}"/>
<br/><br/>
<s:submit value="提交"/>
</s:form>
</body>
</html>
代码中,我们向表单中添加了一个输入框和一个图片元素,图片元素的内容来自于生成验证码的Action方法。同时,我们还向表单中添加了一个隐藏域,用于保存正确的验证码。
示例2:在登录页面中添加验证码
我们可以将第一个示例中的代码稍加修改,将其应用于登录页面。登录页面包含一个图片输入框和一个提交按钮,代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>登录页面</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<h1>登录页面</h1>
<s:form action="doLogin" method="POST">
<s:textfield name="username" label="用户名"/>
<s:password name="password" label="密码"/>
<s:textfield name="verifyCode" label="验证码" size="20"/>
<s:image name="captcha" border="0" align="absmiddle"/>
<s:hidden name="realCode" value="%{#session.verifyCode}"/>
<br/><br/>
<s:submit value="登录"/>
</s:form>
</body>
</html>
代码中,我们将登录页面中的输入框修改为了文本输入框,并向页面中添加了一个图片元素。图片元素的内容来自于生成验证码的Action方法。同时,我们还向表单中添加了一个隐藏域,用于保存正确的验证码。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Struts2实现生成动态验证码并验证实例代码 - Python技术站