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中字符串的初始化

    为了详细讲解“详细图解Java中字符串的初始化”的完整攻略,我会按照以下步骤进行: 1. 什么是字符串? 在Java中,字符串是一个对象,用来表示一组字符序列(包括字母、数字、符号等)。Java字符串使用Unicode字符编码,并且是不可变的对象,也就是说,它的值无法被更改。 2. 字符串的初始化方式 Java中有多种方式可以初始化字符串。下面介绍最常用的四…

    Java 2023年5月26日
    00
  • Java异常(Exception)处理以及常见异常总结

    关于Java异常处理以及常见异常总结的攻略共分为以下几个部分: 异常概念 Java异常分类 异常处理 常见异常总结 示例说明 1. 异常概念 Java异常是在程序执行期间出现的错误或异常情况。异常在程序执行过程中会中断程序的正常执行,并且在出现问题的位置抛出异常信息。一个方法如果没有特殊处理异常的机制,当出现异常时会使程序崩溃。 2. Java异常分类 Ja…

    Java 2023年5月26日
    00
  • Java基础之Web服务器与Http详解

    Java基础之Web服务器与Http详解 本文主要讲解Web服务器以及Http协议的相关知识,包括Web服务器如何工作以及Http协议的原理。 Web服务器是什么? Web服务器是一种软件,用于处理客户端(通常是Web浏览器)请求并向客户端发送响应。Web服务器通常指运行HTTP服务器软件的计算机系统。Web服务器可以提供静态文件(如HTML、CSS、Jav…

    Java 2023年5月19日
    00
  • Java加载资源文件时的路径问题的解决办法

    当我们需要在Java程序中读取资源文件时,经常会遇到路径问题。一般来说,Java中有三种方式可以读取资源文件: 使用绝对路径 使用相对路径 使用类路径 这里我们以读取配置文件为例,详细讲解以上三种方式的区别及解决办法。 1. 使用绝对路径 使用绝对路径是最简单的方式,直接指定文件的完整路径即可。但是这种方式会带来一些问题,因为在不同的机器上,文件的路径可能会…

    Java 2023年5月20日
    00
  • Java内部类的使用教程详解

    Java内部类的使用教程详解 Java中的内部类是一个非常神奇的特性,它允许我们在一个Java类中定义另一个Java类。在这篇文章中,我们会详细讲解Java内部类的使用方法和注意事项。 内部类的类型 Java中的内部类分为四种类型:静态内部类、非静态内部类、局部内部类和匿名内部类。 静态内部类 静态内部类是定义在类中的普通静态类,可以像普通类一样使用。它可以…

    Java 2023年5月19日
    00
  • Java中空指针异常该如何避免详解

    为了避免Java中空指针异常(NullPointerException),我们可以采取下面的措施。 1.使用安全调用运算符(?.) 在Java 8中引入了安全调用运算符(?.), 它是一种简单的方式来避免NullPointerException异常。 例如,如果我们使用“dog?.bark()”调用“bark()”方法,那么当dog为null时,它仍将返回n…

    Java 2023年5月27日
    00
  • 基于Java的Spring框架来操作FreeMarker模板的示例

    基于Java的Spring框架来操作 FreeMarker 模板是一种灵活高效的模板引擎模式。下面是详细的攻略: 1. 安装配置FreeMarker依赖 首先需要在项目中添加 FreeMarker 的 maven 依赖: <dependency> <groupId>org.freemarker</groupId> <…

    Java 2023年6月15日
    00
  • 基于javaweb+jsp的游泳馆会员管理系统(附源码)

    以下是“基于javaweb+jsp的游泳馆会员管理系统(附源码)”的完整攻略: 系统介绍 该系统是基于javaweb+jsp开发的游泳馆会员管理系统,其主要功能包括会员信息管理、会员卡管理、卡种管理、教练管理、预约管理等。系统采用MVC架构,前端使用Bootstrap框架,数据库使用MySQL,通过JDBC连接数据库。 系统安装及部署 下载并安装Java J…

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