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方法。同时,我们还向表单中添加了一个隐藏域,用于保存正确的验证码。

阅读剩余 64%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Struts2实现生成动态验证码并验证实例代码 - Python技术站

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

相关文章

  • 基于jsp+servlet实现的简单博客系统实例(附源码)

    这篇文章将会详细讲解如何通过使用JSP和Servlet来实现一个简单的博客系统。我们将会从搭建环境开始,到完成整个系统的构建。 环境搭建 工具准备 在开始之前,我们需要准备以下工具: Java SE Development Kit(JDK) Eclipse IDE for Java EE Developers Tomcat服务器 创建项目 打开Eclipse…

    Java 2023年6月15日
    00
  • Java永久代的作用是什么?

    Java永久代是JVM的一个内存区域,用于存储类信息、常量池、方法区等内容。常见的JVM有HotSpot和JRockit,HotSpot使用永久代,而JRockit使用了分离的字符串池和共享的类元数据区。 具体来说,Java永久代主要有以下几个作用: 存储类信息 Java中的所有类都需要被加载到内存中才能被使用。当一个类被加载时,JVM会在永久代中为该类分配…

    Java 2023年5月11日
    00
  • Java线程间共享实现方法详解

    Java线程间共享实现方法详解 什么是线程间共享 在Java中,线程是运行在同一个进程中的多个子任务。这些子任务可以共享代码、数据和资源。线程间共享就是指多个线程访问同一个数据和资源的过程。 在多线程编程中,线程间共享常用于实现任务之间的通信和协作,例如,生产者消费者模式、读写锁等场景。 线程间共享实现方法 Java提供了多种实现线程间共享的方式,常用的包括…

    Java 2023年5月19日
    00
  • Spring配置类源码分析详解

    我来为你详细讲解一下”Spring配置类源码分析详解”的完整攻略。 一、前言 在Spring框架中,我们一般会使用XML配置文件或者注解来配置Bean,但是自从Spring4.0开始,我们也可以使用纯Java类来配置Bean了,这就是所谓的Java Config。Java Config的优点很明显,就是配置简单、类型安全、可重构等等。在本文中,我们将探讨如何…

    Java 2023年5月19日
    00
  • Java中的HashSet是什么?

    Java中的HashSet是什么? Java中的HashSet是一种基于哈希表实现的无序集合,可以存储不重复的元素。它实现了Set接口,继承自AbstractSet类。HashSet中的元素不按照特定的方式排序,而是根据元素的哈希码来存储和检索元素。 HashSet内部实现了一个HashMap,将元素作为key,value则对应一个常量Object对象。通过…

    Java 2023年4月27日
    00
  • javascript基于原型链的继承及call和apply函数用法分析

    JavaScript基于原型链的继承 什么是继承 在面向对象编程中,继承是一种允许新对象获取现有对象的属性和方法的机制。它允许我们创建继承现有对象的新对象,从而减少代码重复,增加代码可重用性。 JavaScript中基于原型链的继承 在JavaScript中,没有像其他语言一样的类和接口的概念,继承通过原型链来实现。每个对象都有一个原型对象,原型对象又有自己…

    Java 2023年5月26日
    00
  • 常见的Java安全管理框架有哪些?

    常见的Java安全管理框架有以下几种: Apache Shiro: Apache Shiro是一个强大而灵活的开源安全框架,提供了身份验证(Authentication)、授权(Authorization)、加密(Cryptography)和会话管理等功能。Shiro的设计目的是简化Java应用程序的安全管理,同时还能够轻松地整合到Spring等框架中。 使…

    Java 2023年5月11日
    00
  • java 将字符串追加到文件已有内容后面的操作

    将字符串追加到文件已有内容后面是一个常见的操作,实现这个操作涉及到Java中的文件操作、字符编码、IO流等多个概念和技术。 以下是一份完整的攻略,介绍如何实现在Java中将字符串追加到文件已有内容后面。 第一步:打开文件并读取其内容 使用File类和FileReader类可以打开一个文件并读取其内容。需要注意,FileReader类是以字符为单位读取文件内容…

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