java生成验证码

jsp层:利用img标签的src请求后台,得到验证码图片,每次点击换一张的时候,就可以从后天重新获得新的验证码图片

        $("#changeImg").on("click",function(){
             var imgSrc = $("#imgObj");
             var src = imgSrc.attr("src");
             //alert(src);          
            imgSrc.attr("src",chgUrl(src));
          });

    //给URL加一个时间戳
         function chgUrl(url) {
            var timestamp = (new Date()).valueOf();
            url = url.substring(0, 46);
            if ((url.indexOf("&") >= 0)) {
                url = url + "?tamp=" + timestamp;
            } else {
                url = url + "?timestamp=" + timestamp;
            }
            return url;
       }
       //判断用户输入验证码是否正确      
       $("#inputCode").on("focusout",function(){
                $.ajax({
                  url:"${basePath}pb_valiDateCode.action",
                 type:"post",
                 success:function(data){
                     if(data.msg="success"){
                         //alert("data.code"+data.code);
                         var value = $("#inputCode").val();
                         //alert("value"+value);
                         if(value != data.code){
                            $("#fontId").empty();                        
                            $("#fontId").html("你输入的验证码不正确!");
                            $("#fontId").css("color", "red");
                               }else{
                                $("#fontId").empty();
                               }
                           }                  
                     },
                 error:function(){
                     alert("网络故障");
                          }
                  }        
              );    
       });    
    });

验证码:
 <input id="inputCode" name="code" type="text" height="10px" width="10px" />
 <img id="imgObj" alt="验证码" src="${basePath }pb_getCode.action" />
 <a id="changeImg" href="#">换一张</a>
 <font id="fontId"></font>

后台Action层方法:

  /**
   * 向前台输出验证码
   * @return
   */
 public String getCode(){
        HttpServletRequest request = ServletActionContext.getRequest();
        HttpServletResponse response = ServletActionContext.getResponse();     
        petitionBusinessService.getCode(request,response);      
        return null;    
   }

   /**
     * 异步校验用户输入的验证码是否正确,返回json
     */
    public String valiDateCode(){
        HttpServletRequest request = ServletActionContext.getRequest();
        HttpSession session = request.getSession();
        String code = (String) session.getAttribute("code");
        dataMap= new HashMap<String, Object>();
        dataMap.put("msg", "success");
        dataMap.put("code", code);
        return "dataMapData";
      }
后台Sevice层方法

    public void getCode(HttpServletRequest request, HttpServletResponse response) {
        int width = 90;// 定义图片的width
        int height = 20;// 定义图片的height
        int codeCount = 4;// 定义图片上显示验证码的个数
        int xx = 15;
        int fontHeight = 18;
        int codeY = 16;
        char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
                'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
                'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6',
                '7', '8', '9' };
        // 定义图像buffer
        BufferedImage buffImg = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);
        Graphics gd = buffImg.getGraphics();
        // 创建一个随机数生成器类
        Random random = new Random();
        // 将图像填充为白色
        gd.setColor(Color.WHITE);
        gd.fillRect(0, 0, width, height);
        // 创建字体,字体的大小应该根据图片的高度来定。
        Font font = new Font("Fixedsys", Font.BOLD, fontHeight);
        // 设置字体。
        gd.setFont(font);
        // 画边框。
        gd.setColor(Color.BLACK);
        gd.drawRect(0, 0, width - 1, height - 1);
        // 随机产生40条干扰线,使图象中的认证码不易被其它程序探测到。
        gd.setColor(Color.BLACK);
        for (int i = 0; i < 40; i++) {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            int xl = random.nextInt(12);
            int yl = random.nextInt(12);
            gd.drawLine(x, y, x + xl, y + yl);
        }
        // randomCode用于保存随机产生的验证码,以便用户登录后进行验证。
        StringBuffer randomCode = new StringBuffer();
        int red = 0, green = 0, blue = 0;
        // 随机产生codeCount数字的验证码。
        for (int i = 0; i < codeCount; i++) {
            // 得到随机产生的验证码数字。
            String code = String.valueOf(codeSequence[random.nextInt(36)]);
            // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。
            red = random.nextInt(255);
            green = random.nextInt(255);
            blue = random.nextInt(255);
            // 用随机产生的颜色将验证码绘制到图像中。
            gd.setColor(new Color(red, green, blue));
            gd.drawString(code, (i + 1) * xx, codeY);
            // 将产生的四个随机数组合在一起。
            randomCode.append(code);
        }
        // 将四位数字的验证码保存到Session中。
        HttpSession session = request.getSession();
        // 打印生成的验证码
        System.out.print(randomCode);
        session.setAttribute("code", randomCode.toString());
        // 禁止图像缓存。
        response.setHeader("Pragma", "no-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
        response.setContentType("image/jpeg");
        // 将图像输出到Servlet输出流中。
        ServletOutputStream sos;
        try {
            sos = response.getOutputStream();
            ImageIO.write(buffImg, "jpeg", sos);
            sos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    } 

posted @ 2016-03-21 14:42  坏~牧羊人  阅读(209)  评论(0编辑  收藏  举报