web验证码的生成以及验证

简介: web验证码的生成以及验证

应用场景:在登录的网页常常要用到验证码,能有效的防止恶意的登陆注册,暴力的提交数据。


验证码是一张图片,java有专门绘制图的类Graphics。


验证码小demo下载地址:http://download.csdn.net/download/bushqiang/10260194


例子演示:

1.jsp页面用一个img标签来放验证码

<img src="verifyCodeImage" id="verifyCodeImage" οnclick="javascript:myRefersh();">

2.script提交换图请求,要导入jquery

<script>
  $(function() {
    myRefersh();
  });
  function myRefersh() {
    var date = new Date(); // 创建一个 Date 对象的 一个 实例  
    var time = date.getTime(); // 从 新创建的 Date 对象的实例中获得该时间对应毫秒值  
    $('#verifyCodeImage').attr('src', 'verifyCodeImage?time=' + time);
  }
</script>

verifyCodeImage的请求后面加上时间戳time是因为换验证码是局部的刷新,浏览器有记忆功能,会自己缓存已经请求过的页面,为了表示不同于之前的验证码,所以用时间来区别。

3.后台处理接收到请求后就画一个验证码,再传给前台。

  //生成验证码
  @RequestMapping("/verifyCodeImage")
  public ModelAndView regist(HttpServletRequest request,HttpServletResponse response) throws Exception{ 
    // 获得 当前请求 对应的 会话对象  
     HttpSession session = request.getSession();  
      final int width = 120; // 图片宽度  
      final int height = 40; // 图片高度  
      final String imgType = "jpeg"; // 指定图片格式 (不是指MIME类型)  
      final OutputStream output = response.getOutputStream(); // 获得可以向客户端返回图片的输出流  
     // 创建验证码图片并返回图片上的字符串  
      String codeimage = GraphicHelper.create(width, height, imgType, output);
     //存放验证码
      session.setAttribute("codeimage", codeimage);
      output.flush();
      output.close();
    return null;
  }

4.画验证码的类

public final class GraphicHelper {
  /**
   * 以字符串形式返回生成的验证码,同时输出一个图片
   * 
   * @param width
   *            图片的宽度
   * @param height
   *            图片的高度
   * @param imgType
   *            图片的类型
   * @param output
   *            图片的输出流(图片将输出到这个流中)
   * @return 返回所生成的验证码(字符串)
   */
  public static String create(final int width, final int height,
      final String imgType, OutputStream output) {
    StringBuffer sb = new StringBuffer();
    Random random = new Random();
    BufferedImage image = new BufferedImage(width, height,
        BufferedImage.TYPE_INT_RGB);
    Graphics graphic = image.getGraphics();
    graphic.setColor(Color.getColor("F8F8F8"));
    graphic.fillRect(0, 0, width, height);
    Color[] colors = new Color[] { Color.BLUE, Color.GRAY, Color.GREEN,
        Color.RED, Color.BLACK, Color.ORANGE, Color.magenta,Color.darkGray,Color.pink };
    // 在 "画板"上生成干扰线条 ( 40 是线条个数)
    for (int i = 0; i < 40; i++) {
      graphic.setColor(colors[random.nextInt(colors.length)]);
      final int x = random.nextInt(width);
      final int y = random.nextInt(height);
      final int w = random.nextInt(20); 
      final int h = random.nextInt(20);
      final int signA = random.nextBoolean() ? 1 : -1;
      final int signB = random.nextBoolean() ? 1 : -1;
      graphic.drawLine(x, y, x + w * signA, y + h * signB);
    }
    // 在 "画板"上绘制字母
    graphic.setFont(new Font("Comic Sans MS", Font.BOLD, 30));
    for (int i = 0; i < 4; i++) {
      final int temp = random.nextInt(26) + 97;
      String s = String.valueOf((char) temp);
      sb.append(s);
      graphic.setColor(colors[random.nextInt(colors.length)]);
      graphic.drawString(s, i * (width / 4), height - (height / 3));
    }
    graphic.dispose();
    try {
      ImageIO.write(image, imgType, output);
    } catch (IOException e) {
      e.printStackTrace();
    }
    return sb.toString();
  }
}

5.校验验证码是否正确

// 用户登录处理
  @RequestMapping("/userlogin")
  public ModelAndView checklogin(HttpSession session,
      HttpServletRequest request) throws Exception {
    ModelAndView modelAndView = new ModelAndView();
    //获取验证码
    String verifyCode = request.getParameter("verifyCode");
    String code = (String) session.getAttribute("codeimage");
    //验证码错误
    if(!code.equals(verifyCode.toLowerCase())){
      modelAndView.addObject("message", str + "验证码错误!");
      modelAndView.addObject("user", user);
      // 返回首页,并且提示错误
      modelAndView.setViewName("index");
      return modelAndView;
    }else{
                     //登陆成功就清除验证码的session
            session.removeAttribute("codeimage");//防止用户重复提交表单
                }
        }

6.验证码效果图,上面的小demo是项目的一部分和下面的效果图有一点小差距,按照我上面代码修改就可以了

微信图片_20221209202518.png

相关文章
|
3月前
|
JavaScript NoSQL Redis
Vue中实现修改邮箱、手机号等流程的大致过程、验证码由后端的redis生成验证(版本1.0)
这篇文章记录了在Vue中实现修改手机号和邮箱的大致流程,包括使用过滤器部分隐藏展示的手机号和邮箱,以及通过点击触发路由跳转的便捷方式。文章还描述了旧号码和新号码验证的界面实现,其中验证码由后端生成并通过弹窗展示给用户,未来可以接入真正的手机验证码接口。此外,还提供了修改邮箱的页面效果截图,并强调了学习是一个永无止境的过程。
Vue中实现修改邮箱、手机号等流程的大致过程、验证码由后端的redis生成验证(版本1.0)
|
1月前
jcaptcha集群时验证码不能验证的问题
jcaptcha集群时验证码不能验证的问题
29 3
|
1月前
|
存储 前端开发 Java
验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
本文介绍了使用Kaptcha插件在SpringBoot项目中实现验证码的生成和验证,包括后端生成验证码、前端展示以及通过session进行验证码校验的完整前后端代码和配置过程。
117 0
验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
|
3月前
|
安全 前端开发 PHP
构建与验证表单:传统PHP与Laravel框架的比较分析——探索Web开发中表单处理的优化策略和最佳实践
【8月更文挑战第31天】在 Web 开发中,表单构建与数据验证至关重要。传统 PHP 方法需手动处理 HTML 表单和数据验证,而 Laravel 框架则提供了一种更现代、高效的解决方案。本文通过对比传统 PHP 和 Laravel 的方法,探讨表单构建与验证的最佳实践。Laravel 通过简洁的语法糖、内置的数据过滤和验证机制,显著提升了代码的安全性和可维护性,适用于大型项目或需要快速开发的场景。然而,在追求灵活性的小型项目中,直接使用 PHP 仍是不错的选择。了解两者的优劣,有助于开发者根据项目需求做出最佳决策。
39 0
|
6月前
|
JavaScript Java
java生成验证码并进行验证
java生成验证码并进行验证
|
3月前
|
网络协议 Serverless API
现代化 Web 应用构建问题之验证各个服务是否已成功部署如何解决
现代化 Web 应用构建问题之验证各个服务是否已成功部署如何解决
30 1
|
3月前
|
存储 NoSQL Java
使用redis进行手机验证码的验证、每天只能发送三次验证码 (redis安装在虚拟机linux系统中)
该博客文章展示了如何在Linux虚拟机上使用Redis和Jedis客户端实现手机验证码的验证功能,包括验证码的生成、存储、验证以及限制每天发送次数的逻辑,并提供了测试结果截图。
使用redis进行手机验证码的验证、每天只能发送三次验证码 (redis安装在虚拟机linux系统中)
|
3月前
|
开发者 Java 前端开发
Struts 2验证框架:如何让数据校验成为Web开发的隐形守护者?揭秘前后端一致性的秘诀
【8月更文挑战第31天】在现代Web开发中,数据验证对确保应用健壮性和良好用户体验至关重要。随着前后端分离架构的普及,保证数据校验一致性尤为关键。Struts 2 验证框架基于 JavaBean 验证 API(JSR 303/JSR 380),允许开发者通过注解或 XML 配置轻松定义验证规则,确保输入数据在执行业务逻辑前已通过验证。此外,Struts 2 支持与前端 JavaScript 验证相结合,确保前后端数据校验一致,提升用户体验。通过注解、XML 配置和资源文件,开发者可以轻松定义和调整验证规则,实现前后端一致的数据校验,提高应用健壮性。
50 0
|
3月前
|
安全 Java 云计算
JSF 应用究竟何去何从?云端部署能否成为其全新突破点?快来一探究竟!
【8月更文挑战第31天】本文介绍了将JavaServer Faces(JSF)应用部署到云平台的过程。首先,根据成本、功能、可靠性和安全性选择合适的云平台。接着,展示了构建简单JSF应用的示例代码。最后,以AWS Elastic Beanstalk为例,详细说明了部署流程。部署至云端可提升应用的可用性、扩展性和安全性。
48 0
|
3月前
|
JSON Java API
【Azure Developer】如何验证 Azure AD的JWT Token (JSON Web 令牌)?
【Azure Developer】如何验证 Azure AD的JWT Token (JSON Web 令牌)?

热门文章

最新文章

下一篇
无影云桌面