• 技术文章 >Java >java教程

    Java生成验证码的代码实例详细介绍

    黄舟黄舟2017-03-06 10:28:08原创1212
    本文介绍了Java生成验证码的流程与方法。具有很好的参考价值,下面跟着小编一起来看下吧

    Java 生成验证码的流程是:

    收到请求->生成验证码所用的随机数->使用随机数写出图片->将随机数记录到Session中->输出验证码

    Java 验证验证码的流程是:

    收到请求->获取用户传过来的验证码数字->验证是否正确->输出验证结果

    下面通过一个例子来展示验证码的生成流程,该例子使用基本Java Spring框架的Rest接口,可以使用任何平台来获取验证码:

    服务器处理验证码的例子:

    1.接收验证码请求:

    /**
     * 接收验证码请求
     */
    @RequestMapping(value="captchacode")
    public void CaptchaCode(){
      try {
        CaptchaCodeModel captchaCodeModel=new CaptchaCode().getCode();
        //将验证码放到Session中
        HttpServletRequest httpServletRequest=super.getRequest();
        httpServletRequest.getSession().setAttribute("captchacodekey", captchaCodeModel.getCaptchaCode());
        //将图片写到客户端 
        HttpServletResponse httpServletResponse=super.getResponse();
        //禁止缓存
        httpServletResponse.setHeader("Pragma", "no-cache");
        httpServletResponse.setHeader("Cache-Control", "no-cache");
        httpServletResponse.setDateHeader("Expires", 0);
        ServletOutputStream servletOutputStream=httpServletResponse.getOutputStream();
        //输出图片
        ImageIO.write(captchaCodeModel.getCaptchaImage(), "jpeg", servletOutputStream);
        servletOutputStream.close();
      } catch (Exception e) {
        logger.info("验证码生成失败:"+e.getMessage());
      }
    }

    2.生成验证码并生成图片:

    public class CaptchaCode {
    private int width = 90;// 定义图片的width
    private int height = 20;// 定义图片的height
    private int codeCount = 4;// 定义图片上显示验证码的个数
    private int xx = 15;
    private int fontHeight = 18;
    private 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' };

    public CaptchaCodeModel getCode() throws IOException {
      // 定义图像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);
      }
      CaptchaCodeModel captchaCodeModel=new CaptchaCodeModel();
      captchaCodeModel.setCaptchaCode(randomCode.toString());
      captchaCodeModel.setCaptchaImage(buffImg);
      return captchaCodeModel;
    }
    public class CaptchaCodeModel{
      //验证码的String形式
      private String captchaCode;
      //验证码的图片形式
      private BufferedImage captchaImage;
      public String getCaptchaCode() {
        return captchaCode;
      }
      public void setCaptchaCode(String captchaCode) {
        this.captchaCode = captchaCode;
      }
      public BufferedImage getCaptchaImage() {
        return captchaImage;
      }
      public void setCaptchaImage(BufferedImage captchaImage) {
        this.captchaImage = captchaImage;
      }
    }

    3.接收用户传过来的验证码并验证:

    /**
    * 验证验证码
    */
    @RequestMapping(value = "valicatpcha")
    public void register_R() {
    PageData pageData = super.getPageData();
      // 获取验证码
      String captchaCode = pageData.getString("captchacode");
      HttpServletRequest httpServletRequest = super.getRequest();
      Object codeObject = httpServletRequest.getSession().getAttribute(“captchacodekey”);
      // 验证码错误
      if (codeObject == null
          || Tools.isEmptyString(captchaCode)
          || !String.valueOf(codeObject).toUpperCase()
              .equals(captchaCode.toUpperCase())) {
        setResult(
            MessageManager.getInstance().getMessage("invalidcaptcha"),
            ResultType.Error);
        return;
      }
    }

    页面请求验证码并验证的例子:

    -请求验证码:<img src='captchacode' style='height:32px;width:148px;'

    -验证验证码:

    function validcaptchacode(captchaCode) {
    $.ajax({
    type : "POST",
    url : "valicatpcha",
    data : {
    captchacode : captchaCode,
    tm : new Date().getTime()
    },
    dataType : "json",
    cache : false,
    success : function(data) {
    alert(data);
    },
    error : function(data) {
    alert(data); }
    });
    }

    以上就是Java生成验证码的代码实例详细介绍的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!



    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:Java 验证码
    上一篇:在Java中通过websocket实现消息推送的实现代码详解 下一篇:spring中定时任务taskScheduler的代码示例详细介绍
    20期PHP线上班

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• 一起聊聊Java中数组的定义和使用• JAVA接口与抽象类详细解析• Java实现多线程的四种方式• Java基础之volatile详解• Java中super关键字的用法详解
    1/1

    PHP中文网