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后端产生验证码后台验证功能的实现代码
				
        
 
            
        - java知识点7——面向过程和面向对象、面向对象的内存分析、构造方法 2023-09-01
 - java – jdbc的registerOutParameter中sqlType的含义是什么? 2023-11-01
 - springboot Long 精度丢失问题解决 2023-02-19
 - Javaweb动态开发最重要的Servlet详解 2023-03-31
 - Java使用HttpClient详细示例 2023-08-10
 - java – Web应用程序的更新中心和数据库更改管理 2023-11-01
 - [java] 在linux+chrome/firefox上使用java applet 2023-08-31
 - Spring Task定时任务的实现详解 2023-04-07
 - Spring Boot + EasyExcel实现数据导入导出 2023-03-22
 - java – 使用jdbc将数据插入数据库 2023-11-04
 
						
						
						
						
						
				
				
				
				