Ajax+Struts2实现验证码验证功能实例代码

实现验证码验证功能是网站开发中非常常见的一项功能,其主要目的在于防止恶意攻击和机器人批量操作。本篇将向读者介绍如何使用Ajax和Struts2框架来实现验证码验证功能,并提供完整的示例代码。

实现过程

1. 前端

我们首先在前端的页面中添加一个输入框用来接收验证码,使其能够与后端进行通信。需要注意的是,此处需要开启CORS跨域支持,因为我们后端与前端所在服务器不同。

<input type="text" id="verifyCode" placeholder="验证码" required>

为了实现Ajax请求并接收后端发来的验证码验证结果,我们需要使用jQuery库。同时,为了避免CSRF攻击,我们需要在请求头中添加CSRF Token。完整代码如下:

<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<script>
  // 获取CSRF Token
  const csrfToken = document.querySelector('input[name="csrfToken"]').value;
  // 监听验证码输入框的文本变化
  $("#verifyCode").on("input", function() {
    // 获取用户输入的验证码
    const code = $(this).val();
    // 发送Ajax请求
    $.ajax({
      url: "http://localhost:8080/checkVerifyCode.action",
      type: "POST",
      data: {
        code: code
      },
      beforeSend: function(xhr) {
        xhr.setRequestHeader('X-Csrf-Token', csrfToken);
      },
      success: function(data) {
        if (data === "false") {
          alert("验证码错误!");
        }
      }
    })
  });
</script>

我们可以看到,在Ajax的请求中,我们向后端POST请求了一个名为checkVerifyCode.action的URL,并传递了一个名为code的参数。此处的type参数表明我们向后端发送的是一条POST请求,前置选项beforeSend中添加了CSRF Token,这是一个保证安全性的必要步骤。

2. 后端

接下来,我们需要在后端Struts2的Action中编写代码逻辑来验证用户输入的验证码是否有效。在这一步中,我们可以使用Session作为存储验证码的介质。

首先,我们需要在Action的类中添加一个类型为String的验证码属性。

private String verifyCode;

然后,我们需要在Action的execute()方法中在Session中存储验证码。

public String execute() {
  // 将验证码存储在Session中
  ActionContext.getContext().getSession().put("verifyCode", verifyCode);
  return SUCCESS;
}

随后,在named为checkVerifyCode的方法中,我们需要从Session中获取存储的验证码并根据用户输入进行判断。

public String checkVerifyCode() {
   String code = (String) ActionContext.getContext().getSession().get("verifyCode");
   if (code != null && code.equalsIgnoreCase("用户输入")) {
       // 验证码正确
       return SUCCESS;
   } else {
       // 验证码错误
       return ERROR;
   }
}

以上就是完整的验证码验证实现过程。通过与前端的Ajax交互,我们成功地实现了验证码功能,并能够防止爬虫机器人的访问。

示例1

下面是一个完整的例子,演示了如何在Struts2中使用Ajax实现验证码验证。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Ajax + Struts2 实现验证码验证功能</title>
</head>
<body>
  <form method="post" action="login.action">
    <input type="text" name="username" placeholder="用户名" required>
    <input type="password" name="password" placeholder="密码" required>
    <input type="text" name="verifyCode" placeholder="验证码" required>
    <img src="verifyCode.action">
    <input type="hidden" name="csrfToken" value="<s:token/>">
    <button type="submit">登录</button>
  </form>
  <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
  <script>
    const csrfToken = document.querySelector('input[name="csrfToken"]').value;
    $("#verifyCode").on("input", function() {
      const code = $(this).val();
      $.ajax({
        url: "http://localhost:8080/checkVerifyCode.action",
        type: "POST",
        data: {
          code: code
        },
        beforeSend: function(xhr) {
          xhr.setRequestHeader('X-Csrf-Token', csrfToken);
        },
        success: function(data) {
          console.log(data);
          if (data === "false") {
            alert("验证码错误!");
          }
        }
      })
    });
  </script>
</body>
</html>
public class LoginAction extends ActionSupport implements ServletRequestAware {
  private HttpServletRequest request;
  private String username;
  private String password;
  private String verifyCode;

  public void setServletRequest(HttpServletRequest request) {
    this.request = request;
  }

  public String execute() {
    // 将验证码存储在Session中
    ActionContext.getContext().getSession().put("verifyCode", verifyCode);
    return SUCCESS;
  }

  public String checkVerifyCode() {
    String code = (String) ActionContext.getContext().getSession().get("verifyCode");
    if (code != null && code.equalsIgnoreCase(verifyCode)) {
      // 验证码正确
      return SUCCESS;
    } else {
      // 验证码错误
      return ERROR;
    }
  }

  public String login() {
    if (username.equals("admin") && password.equals("admin")) {
      return SUCCESS;
    } else {
      return ERROR;
    }
  }

  // 省略 getter 和 setter 方法
}

示例2

下面的例子展示了如何使用Ajax检查用户名是否已经被注册。这个功能非常常见,它能够有效防止恶意用户注册大量垃圾账户。

在前端,我们需要开启CORS跨域支持,以便向后端服务器发送请求。

$.ajax({
  url: "http://localhost:8080/checkUsername.action",
  type: "POST",
  data: {
    username: username
  },
  beforeSend: function(xhr) {
    xhr.setRequestHeader('X-Csrf-Token', csrfToken);
  },
  success: function(data) {
    if (data === "true") {
      alert("用户名已被使用!");
    }
  }
})

在后端,我们需要查询数据库中是否存在与该用户名相同的记录。

public String checkUsername() {
  try {
    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "root");
    String sql = "SELECT * FROM users WHERE username = ?";
    PreparedStatement pstmt = conn.prepareStatement(sql);
    pstmt.setString(1, username);
    ResultSet rs = pstmt.executeQuery();
    if (rs.next()) {
      // 用户名已被注册
      return SUCCESS;
    } else {
      // 用户名可用
      return ERROR;
    }
  } catch (SQLException e) {
    e.printStackTrace();
    return ERROR;
  }
}

以上就是完整的实现过程。通过使用Ajax向后端发送请求,我们能够实时检查用户名是否可用,同时避免了页面的刷新和跳转,优化了用户体验。

总结

本文介绍了如何使用Ajax和Struts2框架来实现验证码验证功能。通过前后端的配合和逻辑的实现,我们在网站开发中能够更好地防止恶意攻击和批量操作,保证了网站前端的安全性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Ajax+Struts2实现验证码验证功能实例代码 - Python技术站

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

相关文章

  • java实现简单的验证码功能

    以下是Java实现简单验证码功能的攻略: 步骤一:生成验证码 导入相关类库。需要导入Java中的BufferedImage、Graphics、Color和Random。 import java.awt.Color; import java.awt.Graphics; import java.awt.image.BufferedImage; import ja…

    Java 2023年5月19日
    00
  • 一起聊聊Java中13种锁的实现方式

    一起聊聊Java中13种锁的实现方式 背景介绍 在Java中使用锁是实现多线程同步的一种常用方式,也是保证程序并发安全的必要手段。本文将对Java中13种锁的实现方式进行详细讲解。 13种锁实现方式 1. synchronized关键字 synchronized关键字是Java中最基本、最常用的锁实现方式。它通过获取对象的锁来控制对对象的访问,进而实现多线程…

    Java 2023年5月19日
    00
  • 如何使用JavaMail发送邮件

    使用JavaMail发送邮件需要以下步骤: 步骤一:添加JavaMail依赖 在项目中添加JavaMail的依赖包,例如使用Maven可以添加以下依赖: <dependency> <groupId>javax.mail</groupId> <artifactId>javax.mail-api</artif…

    Java 2023年6月15日
    00
  • 四个Java必须知道的负载均衡算法分享

    下面我将详细介绍《四个Java必须知道的负载均衡算法分享》这篇攻略。 标题 介绍 这篇攻略主要介绍了Java程序员在实际开发中需要掌握的四种负载均衡算法,并从算法原理、应用场景、优缺点等多方面进行了详细的分析。 四种负载均衡算法 轮询算法 轮询算法是指按照请求的顺序,依次将请求分配到每个服务器,由于是平均分配请求,所以该算法的负载均衡效果较为稳定。 随机算法…

    Java 2023年5月19日
    00
  • SpringMVC开发restful API之用户查询代码详解

    下面我将详细讲解“SpringMVC开发restful API之用户查询代码详解”的完整攻略: 简介 本攻略旨在讲解如何使用SpringMVC框架开发restful API进行用户查询操作。通过本攻略,读者将能够掌握SpringMVC框架开发restful API的基本流程,并了解如何进行用户查询操作。本攻略适合Java开发者学习使用。 准备工作 在开始本攻…

    Java 2023年5月26日
    00
  • Java中BigInteger用法小结

    下面我将详细讲解“Java中BigInteger用法小结”的完整攻略。 1. 什么是BigInteger BigInteger是Java中一个用于处理大整数运算的类。它可以处理任意大的整数,而不会受到计算机内存的限制,因此在处理大数时非常方便实用。 2. BigInteger类的常用方法 下面是BigInteger类的一些常用方法: 2.1 创建BigInt…

    Java 2023年5月26日
    00
  • jsp中session过期设置及web.xml配置学习

    下面是关于“jsp中session过期设置及web.xml配置学习”的完整攻略: 1. session过期设置 1.1 什么是session过期? 在jsp开发中,session在很多场合都扮演了非常重要的角色,他可以用来存储用户的登录状态、用户浏览过的历史页面、用户购物车等等。但是,session也会因为一些原因来使其“死亡”,也就是所谓的过期失效。 1.…

    Java 2023年6月15日
    00
  • java读取excel文件的两种方法

    下面是详细讲解“Java读取Excel文件的两种方法”的完整攻略: 一、准备工作 在开始读取Excel文件之前,我们需要引入相关的依赖包。这里我们使用Apache POI来读取Excel文件,具体引入方式如下: <dependency> <groupId>org.apache.poi</groupId> <artif…

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