现在大部分的登录或验证系统都拥有了字母或数字图片的验证码,自己也一时兴起,根据网上的demo自己也尝试了一下,很有意思!

下面则是这次实验的效果图:

java 随机生成英文数字 java生成随机字母_bc


1.登陆页jsp:

<html>
 <head> 

     <base href="/"> 

     <meta charset="UTF-8"> 

     <title>登陆页面</title> 

     <meta name="viewport" 

           content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/> 

     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 

     <link rel="stylesheet" href="css/login.css"> 

     <script language="javascript" src="js/jquery-1.9.0.min.js"></script> 

     <script language="javascript" src="js/login/login.js"></script> 

 </head> 
<body>
<div class="login_form">
                     <form name='myForm' action='' method='post' >
                             <input type="text" name="userName" id="userName" placeholder="请输入用户名">
                             <input type="password" name="password" id="password" placeholder="请输入密码">
                     </form>
                     <input class="check_input" type="text"  placeholder="请输入验证码">
                     <img id="imgVerify" src="" alt="点击更换验证码" width="112" height="36" οnclick="getVerify(this);">//首次获取验证码图片,也可在此将src设为访问路径/getVerify
                     <div class="login_form_warn_lable"></div>
                     <div class="login_form_warn">
                             <span class="warn_text">用户名或密码错误</span>
                     </div>
                     <div class="login_form_submit">
                             <button class="btn_submit" οnclick="login();">登   录</button>
                     </div>
                 </div></body>
</html>

2.登陆页面js:

$(document.body).ready(function () {
     //首次获取验证码
     $("#imgVerify").attr("src","/getVerify?"+Math.random());
 });

 //点击登录按钮
 function login(){
      //校验验证码
     checkSum();
 } //提交表单
 function submitForm(){
     document.myForm.action = "/login";
     document.myForm.submit();
 } //获取验证码
 function getVerify(obj){
     obj.src = "/getVerify?"+Math.random();
 }

 //校验验证码
 function checkSum(){
     var inputStr = $(".check_input").val();
     if(inputStr!=null && inputStr!=""){
         inputStr = inputStr.toUpperCase();//将输入的字母全部转换成大写
         $.ajax({
             url : "checkVerify",
             data: {inputStr:inputStr},
             success : function(datas) {
                 if(datas == "T"){
                     submitForm();//提交表单
                 }else{
                     $(".check_input").val("");
                     $(".warn_text").text("验证码输入错误!");
                     $(".login_form_warn").css("display","block");
                 }
             }
         });
     }else{
         $(".warn_text").text("请输入验证码");
         $(".login_form_warn").css("display","block");
     }
 }

3.(springMVC框架)java后台controller获取和校验验证码:

/**
      * 登录页面生成验证码
      */
     @RequestMapping(value = "getVerify")
     public void getVerify(HttpServletRequest request, HttpServletResponse response){
         response.setContentType("image/jpeg");//设置相应类型,告诉浏览器输出的内容为图片  
         response.setHeader("Pragma", "No-cache");//设置响应头信息,告诉浏览器不要缓存此内容  
         response.setHeader("Cache-Control", "no-cache"); 
         response.setDateHeader("Expire", 0); 
         RandomValidateCode randomValidateCode = new RandomValidateCode(); 
         try { 
             randomValidateCode.getRandcode(request, response);//输出验证码图片方法  
         } catch (Exception e) { 
             e.printStackTrace(); 
         } 
     } 

     /**
      * 登录页面校验验证码
      */
     @RequestMapping(value = "checkVerify")
     @ResponseBody
     public String checkVerify(String inputStr, HttpSession session){
         //从session中获取随机数
         String random = (String) session.getAttribute("RANDOMVALIDATECODEKEY");
         if(random.equals(inputStr)){
             return "TURE";//验证码正确
         }else{
             return "FALSE";//验证码错误
         }
     }


4.验证码图片生成工具类:

/**
  * 验证码生成类
  * <p>
  * @author admin
  *
  */
 public class RandomValidateCode {
     
     public static final String RANDOMCODEKEY= "RANDOMVALIDATECODEKEY";//放到session中的key     
     //private String randString = "0123456789";//随机产生只有数字的字符串 private String
     private String randString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生只有字母的字符串
     //private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生数字与字母组合的字符串  
     private int width = 95;// 图片宽  
     private int height = 25;// 图片高  
     private int lineSize = 40;// 干扰线数量  
     private int stringNum = 4;// 随机产生字符数量  
     
     private Random random = new Random(); 
  
     /*
      * 获得字体
      */ 
     private Font getFont() { 
         return new Font("Fixedsys", Font.CENTER_BASELINE, 18); 
     } 
  
     /*
      * 获得颜色
      */ 
     private Color getRandColor(int fc, int bc) { 
         if (fc > 255) 
             fc = 255; 
         if (bc > 255) 
             bc = 255; 
         int r = fc + random.nextInt(bc - fc - 16); 
         int g = fc + random.nextInt(bc - fc - 14); 
         int b = fc + random.nextInt(bc - fc - 18); 
         return new Color(r, g, b); 
     } 
  
     /**
      * 生成随机图片
      */ 
     public void getRandcode(HttpServletRequest request, 
             HttpServletResponse response) { 
         HttpSession session = request.getSession(); 
         // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类  
         BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
         Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作  
         g.fillRect(0, 0, width, height); 
         g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18)); 
         g.setColor(getRandColor(110, 133)); 
         // 绘制干扰线  
         for (int i = 0; i <= lineSize; i++) { 
             drowLine(g); 
         } 
         // 绘制随机字符  
         String randomString = ""; 
         for (int i = 1; i <= stringNum; i++) { 
             randomString = drowString(g, randomString, i); 
         } 
         //将生成的随机字符串保存到session中,而jsp界面通过session.getAttribute("RANDOMCODEKEY"),  
         //获得生成的验证码,然后跟用户输入的进行比较  
         session.removeAttribute(RANDOMCODEKEY);
         session.setAttribute(RANDOMCODEKEY, randomString);
         g.dispose(); 
         try { 
             // 将内存中的图片通过流动形式输出到客户端  
             ImageIO.write(image, "JPEG", response.getOutputStream()); 
         } catch (Exception e) { 
             e.printStackTrace(); 
         } 
  
     } 
  
     /*
      * 绘制字符串
      */ 
     private String drowString(Graphics g, String randomString, int i) { 
         g.setFont(getFont()); 
         g.setColor(new Color(random.nextInt(101), random.nextInt(111), random 
                 .nextInt(121))); 
         String rand = String.valueOf(getRandomString(random.nextInt(randString 
                 .length()))); 
         randomString += rand; 
         g.translate(random.nextInt(3), random.nextInt(3)); 
         g.drawString(rand, 13 * i, 16); 
         return randomString; 
     } 
  
     /*
      * 绘制干扰线
      */ 
     private void drowLine(Graphics g) { 
         int x = random.nextInt(width); 
         int y = random.nextInt(height); 
         int xl = random.nextInt(13); 
         int yl = random.nextInt(15); 
         g.drawLine(x, y, x + xl, y + yl); 
     } 
  
     /*
      * 获取随机的字符
      */ 
     public String getRandomString(int num) { 
         return String.valueOf(randString.charAt(num)); 
     } 
 }