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

Java后端产生验证码后台验证功能是Web开发过程中常见的安全性验证功能。下面将详细介绍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后端产生验证码后台验证功能的实现代码

基础教程推荐