Java后端产生验证码后台验证功能的实现代码

Java后端产生验证码后台验证功能是Web开发过程中常见的安全性验证功能。下面将详细介绍Java后端产生验证码后台验证功能的实现代码完整攻略。

1. 生成验证码

Java后端生成验证码可以使用第三方库,比如Google的kaptcha,关于这部分的实现方式扩展到本篇文章以外,这里不做详述,主要讲解验证码的验证。

2. 后台验证码验证功能

2.1 后台实现验证码生成并保存到session中

在生成验证码的同时,我们生成一个随机字符串,并且将验证码字符串和这个随机字符串一起存入Session中,代码如下:

@RequestMapping("/vcode")  
public void vcode(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException      
{     
    String code = null;  
    BufferedImage image = null;  

    // 用Kaptcha生成验证码
    HttpSession session = request.getSession();  
    //生成验证码字符串并保存到会话中  
    code = new DefaultKaptcha().createText();  
    session.setAttribute("verificationCode", code);  
    //生成图片  
    image = new DefaultKaptcha().createImage(code);    

    //将图片输出给客户端
    ServletOutputStream out = response.getOutputStream();  
    ImageIO.write(image, "jpg", out);  
}

2.2 校验验证码

在进行验证码校验时,我们将用户在表单中填写的验证码和我们保存在Session中的验证码进行比对,如果不一致则表示校验失败。代码如下:

@RequestMapping("/login")  
public String login(HttpServletRequest request, HttpServletResponse response)  
{     
    //从页面获取验证码
    String code = request.getParameter("verificationCode");  
    HttpSession session = request.getSession();  

    //从会话中获取正确的验证码
    String verificationCode = (String) session.getAttribute("verificationCode");  

    if (code.equals(verificationCode)) //验证码正确
    {  
        //登陆成功
        return "success";
    }  
    else  
    {  
        //验证码错误
        request.setAttribute("msg", "验证码错误");  
        return "login";
    }  
}

3. 示例说明

下面提供两个示例。

示例1:在controller中加入生成验证码和校验验证码的方法,然后在前端页面展示一个验证码输入框和一个图片验证码,用户在输入框中输入验证码,然后提交表单,我们在后台进行验证码校验,对应的代码如下:

//生成验证码并将验证码写入response中
@RequestMapping("/vcode")  
public void vcode(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException      
{     
    String code = null;  
    BufferedImage image = null;  

    // 用Kaptcha生成验证码
    HttpSession session = request.getSession();  
    //生成验证码字符串并保存到会话中  
    code = new DefaultKaptcha().createText();  
    session.setAttribute("verificationCode", code);  
    //生成图片  
    image = new DefaultKaptcha().createImage(code);    

    //将图片输出给客户端
    ServletOutputStream out = response.getOutputStream();  
    ImageIO.write(image, "jpg", out);  
}

//处理用户登录请求
@RequestMapping("/login")  
public String login(HttpServletRequest request, HttpServletResponse response)  
{     
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    String code = request.getParameter("code");
    HttpSession session = request.getSession();
    String verificationCode = (String) session.getAttribute("verificationCode");
    String errMsg = "";
    if(verificationCode==null) {
        errMsg = "验证码不存在";
    }
    else if(username==null || password==null) {
        errMsg = "请填写用户名和密码";
    }
    else if(username.equals("admin") && password.equals("123456")) {
        if(code!=null && code.equals(verificationCode)) {
            session.removeAttribute("verificationCode");
            return "redirect:/home";
        }
        else {
            errMsg = "验证码错误";
        }
    }
    else {
        errMsg = "用户名或密码错误";
    }
    request.setAttribute("errMsg", errMsg);
    return "login";
}

示例2:在controller中加入生成验证码和校验验证码的方法,在前端使用AJAX提交表单,我们在ValidateCodeController中处理表单校验请求,对应的代码如下:

//生成验证码并将验证码写入response中
@RequestMapping("/vcode")  
public void vcode(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException      
{     
    String code = null;  
    BufferedImage image = null;  

    // 用Kaptcha生成验证码
    HttpSession session = request.getSession();  
    //生成验证码字符串并保存到会话中  
    code = new DefaultKaptcha().createText();  
    session.setAttribute("verificationCode", code);  
    //生成图片  
    image = new DefaultKaptcha().createImage(code);    

    //将图片输出给客户端
    ServletOutputStream out = response.getOutputStream();  
    ImageIO.write(image, "jpg", out);  
}

//处理用户登录请求
@RequestMapping("/login")  
public String login(HttpServletRequest request, HttpServletResponse response)  
{     
    return "login";
}

//校验验证码
@RequestMapping("/validateCode")  
@ResponseBody
public Map<String, Object> validateCode(HttpServletRequest request, HttpServletResponse response)  
{
    Map<String, Object> map = new HashMap<String, Object>();
    String code = request.getParameter("code").trim().toUpperCase();
    String valCodeFromSession = (String)request.getSession().getAttribute("ValidateCode"); 

    if(StringUtils.isBlank(valCodeFromSession)
            || StringUtils.isBlank(code)
            || !valCodeFromSession.equalsIgnoreCase(code)) {          

        map.put("code","ok");
        map.put("msg","验证码错误");  
    }else{
        map.put("code","fail");
        map.put("msg","验证码正确");  
    }        
    return map;
}

在前端页面中,我们使用jQuery实现验证码的异步校验,对应的代码如下:

<form id="loginForm" name="loginForm">
  <div>
    <label>用户名:</label>
    <input type="text" name="username"/>
  </div>
  <div>
    <label>密码:</label>
    <input type="password" name="password" />
  </div>
  <div>
    <label>验证码:</label>
    <input type="text" name="code" />
    <img src="/vcode" id="vcodeImg" /><a href="#" onclick="changeCode()">看不清?换一张</a>
    <span id="msg"></span>
  </div>
  <div>
    <button type="button" id="submitBtn">登录</button>
  </div>
</form>

<script type="text/javascript">
  function changeCode() {
    $("#vcodeImg").attr("src","/vcode?t=" + new Date().getTime());
  }

  $(function() {
    $("#submitBtn").click(function() {
      $.ajax({
        type: "GET",
        url: "/validateCode",
        data: { code: $("input[name='code']").val() },
        success: function(data){
          if(data.code == "ok") {
            $("#msg").text(data.msg);
            return false;
          }else {
            $("#msg").text("");
            $("#loginForm").submit();
          }
        },
        dataType: "json"
      });
    });
  });
</script>

以上就是Java后端产生验证码后台验证功能的实现代码完整攻略,希望对你有帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java后端产生验证码后台验证功能的实现代码 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • 浅谈Java模板引擎性能对比

    浅谈Java模板引擎性能对比 简介 本文主要讨论Java模板引擎的性能对比,介绍常见的Java模板引擎及其性能特点,并通过两个示例来说明不同模板引擎的使用方式与性能表现。 常见Java模板引擎 常见的Java模板引擎有JSP、FreeMarker、Thymeleaf、Velocity等,这些引擎的性能特点各不相同。 JSP:JSP作为Java Web技术的重…

    Java 2023年6月16日
    00
  • JAVA LinkedList和ArrayList的使用及性能分析

    JAVA LinkedList和ArrayList的使用及性能分析 1.介绍 在JAVA中,LinkedList和ArrayList都是常见的集合类。两种集合类都可以实现List接口,用于存储一组有序的数据。但是,它们在内部实现、性能以及使用场景上存在很大的差异。 LinkedList使用链表来实现,每一个节点都存储了当前元素的值和下一个节点的地址。由于链表…

    Java 2023年5月26日
    00
  • 详细解读Java编程中面向字符的输入流

    以下是“详细解读Java编程中面向字符的输入流”的完整攻略: 什么是面向字符的输入流 在 Java 编程中,输入流主要分为字节流和字符流两种。其中,字节流是以字节为单位读写数据的;而字符流则是以字符为单位读写数据的。面向字符的输入流即为字符流,主要指的是用于读取文本文件内容的一类输入流。 如何使用面向字符的输入流 要使用 Java 中的面向字符的输入流,需要…

    Java 2023年5月26日
    00
  • HashMap和HashTable底层原理以及常见面试题

    HashMap和HashTable底层原理以及常见面试题 1. HashMap和HashTable的区别 HashMap和HashTable都是Java中的重要容器类,它们的目的是为了存放和访问键值对。虽然它们的功能是相似的,但是它们在底层的实现和使用上有很大的不同。 1.1 HashMap HashMap的底层是基于哈希表实现的,其键值对存储在Entry数…

    Java 2023年5月26日
    00
  • Java多线程文件分片下载实现的示例代码

    Java多线程文件分片下载可以极大地提升文件下载速度。以下是一个 Java 多线程文件分片下载的示例代码及其详细实现攻略。 1. 需求分析 我们需要实现一个能够从远程服务器下载大文件的 Java 应用,目标是最大限度地提升下载速度。使用多线程进行文件分片下载,可以让每个线程分别下载小部分文件,提高下载速度。 2. 技术方案 Java 有完善的多线程机制,因此…

    Java 2023年5月26日
    00
  • java中的静态代码块、构造代码块、构造方法详解

    Java中的静态代码块、构造代码块、构造方法详解 在Java中,我们可以通过概念上三种不同类型的代码块来实现特定的代码块执行顺序和实现方式:静态代码块、构造代码块、构造方法。下面将针对这三种代码块进行详细讲解。 静态代码块 静态代码块是在类加载的时候自动执行的代码块,且只会执行一次。我们可以通过static {…}的方式定义静态代码块。静态代码块的主要作…

    Java 2023年5月23日
    00
  • springboot多环境配置方案(不用5分钟)

    下面是详细讲解“springboot多环境配置方案(不用5分钟)”的完整攻略: 1. 原理 Spring Boot 支持通过不同的配置文件来管理不同的环境。它提供了一个标准的命名规则:application-{profile}.properties/yml,比如 application-dev.yml,application-test.yml,applica…

    Java 2023年5月15日
    00
  • js创建jsonArray传输至后台及后台全面解析

    请看下面的攻略: 客户端(js)创建jsonArray并传输至服务端 创建jsonArray 1.定义一个空的jsonArray: var jsonArray = []; 2.向jsonArray中添加数据: var jsonArray = []; for (var i = 0; i < 3; i++) { var jsonObj = { name: …

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