Struts2实现生成动态验证码并验证实例代码

实现生成动态验证码并验证,我们可以通过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技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Java之Jackson使用案例详解

    Java之Jackson使用案例详解 Jackson是Java中最流行的JSON序列化和反序列化库之一,它提供了轻量级快速、灵活的JSON处理方式。本文将详细讲解在Java中如何使用Jackson进行JSON序列化和反序列化。内容如下: 简介 在Java中使用Jackson进行JSON处理时,可以使用以下依赖: <!– Jackson核心模块 –&…

    Java 2023年5月26日
    00
  • java7 新I/O知识点详解

    Java7 新 I/O 知识点详解 介绍 Java7 引入了一些新的 I/O(输入输出)特性,主要是为了优化文件 I/O 操作,使之更加高效和灵活。其中主要包括以下几个方面: 支持异步 I/O 操作的 NIO API 支持读取和写入字符串的 NIO API 自动资源管理(ARM)特性,即 try-with-resources 操作 文件系统的改进 下面将分别…

    Java 2023年5月24日
    00
  • Java实现读取Jar文件属性的方法详解

    Java 实现读取 Jar 文件属性的方法,需要使用 JarFile 类和 Manifest 类来实现。 第一步:导入 JarFile 类和 Manifest 类 import java.util.jar.JarFile; import java.util.jar.Manifest; 第二步:实现读取 Jar 文件属性的方法 首先需要获取 Jar 文件的路径…

    Java 2023年5月20日
    00
  • 简单介绍十几款常用的画架构图流程图的软件

    简单介绍十几款常用的画架构图流程图的软件 draw.io draw.io是开源免费的在线画图工具,还提供桌面版本。 特性: 实时协作; 支持在线离线版本; 存储支持多种方式:Google Drive, OneDrive, GitHub, GitLab, Dropbox等; 许多丰富的图标库。 ProccessOn ProccessOn是一款优秀的国产在线协作…

    Java 2023年4月19日
    00
  • 小伙熬夜用Java重现经典超级马里奥代码实例

    下面我来详细讲解“小伙熬夜用Java重现经典超级马里奥代码实例”的完整攻略。 1. 准备工作 首先,我们需要准备一些工具和环境。 1.1 编程语言本次重现经典超级马里奥代码的编程语言为Java,所以我们需要先安装JDK并配置好环境变量。 1.2 IDEIDE是开发Java程序必不可少的,选择一款自己喜欢的IDE,比如Eclipse或者IntelliJ IDE…

    Java 2023年5月23日
    00
  • java解析任意层数json字符串的方法

    关于“java解析任意层数json字符串的方法”的攻略,我会从以下几个方面进行讲解: JSON介绍 JSON解析器的选择 JSON解析实例 多层嵌套JSON解析实例 1. JSON介绍 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写。它基于JavaScript语法的子集,但在使用时可以被许多不同语言…

    Java 2023年5月26日
    00
  • java用两个例子充分阐述多态的可拓展性介绍

    给您介绍一下如何使用Java的多态来实现可拓展性。 什么是多态 在Java中,多态是指一个对象的实际类型可能是其父类、接口或抽象类,这种特性可以让相同类型的对象执行相同的方法,但可能会有不同的实现方式。因此,多态可以让代码更加灵活,也更容易维护。 多态的可拓展性介绍 多态在Java中实现可拓展性的方法是,当新增一个子类时,只需要重写跟父类相同的方法即可,然后…

    Java 2023年5月20日
    00
  • Spring存储与读取Bean对象方法

    下面是关于”Spring存储与读取Bean对象方法”的完整攻略。 1. 前置知识 在学习本文之前,建议先掌握以下知识: Java基础 Spring基础 Spring IOC 2. 存储Bean对象到Spring容器 在Spring框架中,可以通过ApplicationContext接口来加载Bean对象,也可以将Bean对象保存到容器中。具体实现方式有两种:…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部