JavaWeb 使用Session实现一次性验证码功能

 更新时间:2019年08月28日 14:05:02   作者:chenhongyong  
这篇文章主要介绍了JavaWeb 使用Session实现一次性验证码功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

表单

<form action="loginServlet" method="post">
 请输入验证码:<input type="text" name="code" />
 <img src="getCodeServlet" /><br />
 <button type="submit">提交</button>
</form>

载入页面时,会自动请求getCodeServlet,获取图片(验证码)。

getCodeServlet,产生验证码

@WebServlet("/getCodeServlet")
public class GetCodeServlet extends HttpServlet {
  //验证码的宽、高
  private static int WIDTH=80;
  private static int HEIGHT=25;
  //绘制背景
  private void drawBg(Graphics g){
    //rgb
    g.setColor(new Color(128, 128, 128));
    //绘制矩形。x,y,wigth,height
    g.fillRect(0,0,WIDTH,HEIGHT);
    //随机绘制100个干扰点
    Random random=new Random();
    for (int i=0;i<100;i++){
      //产生(0,1)上的小数,*WIDTH|HEIGHT,再取整也行
      int x=random.nextInt(WIDTH);
      int y=random.nextInt(HEIGHT);
      g.drawOval(x,y,1,1);
      //干扰点的颜色也可以随机,随机产生red,green,blue即可
      //g.setColor(new Color(red,green,blue));
    }
  }
  //绘制验证码
  private void drawCode(Graphics g,char[] code){
    g.setColor(Color.BLACK);
    //字体、样式(多个时竖线分隔)、字号
    g.setFont(new Font("serif",Font.ITALIC|Font.BOLD,18));
    //在不同位置绘制验证码字符,参数:要绘制的String、横、纵坐标。+""是为了char转String。
    g.drawString(code[0]+"",1,17);
    g.drawString(code[1]+"",16,15);
    g.drawString(code[2]+"",31,18);
    g.drawString(code[3]+"",46,16);
  }
  //随机产生4位验证码
  private char[] getCode(){
    String chars="0123456789QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm";
    char[] code=new char[4];
    Random random=new Random();
    for (int i=0;i<4;i++){
      //[0,62)
      int index= random.nextInt(62);
      code[i]=chars.charAt(index);
    }
    return code;
  }
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
    HttpSession session = request.getSession();
    ServletOutputStream sos = response.getOutputStream();
    response.setContentType("image/jpeg");
    //设置浏览器不缓存此图片
    response.setHeader("Pragma","No-cache");
    response.setHeader("Cache-Control","no-cache");
    response.setDateHeader("Expires",0);
    //创建内存图片
    BufferedImage bufferedImage = new BufferedImage(WIDTH, HEIGHT, TYPE_INT_RGB);
    Graphics g= bufferedImage.getGraphics();
    char[] code=getCode();
    //将验证码放到session域中。session对象要在提交响应之前获得
    session.setAttribute("code",new String(code));
    drawBg(g);
    drawCode(g,code);
    g.dispose();
    //将图片输出到浏览器
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageIO.write(bufferedImage,"JPEG",baos);
    baos.writeTo(sos);
    baos.close();
    sos.close();
  }
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
    doPost(request,response);
  }
}

loginServlet,处理表单

@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html;charset=utf-8");
    HttpSession session = request.getSession();
    String trueCode= (String) session.getAttribute("code");
    String code=request.getParameter("code");

    if (code.equals(trueCode)){
      response.getWriter().write("验证码正确");
    }
    else {
      response.getWriter().write("验证码错误");
    }
  }

  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doPost(request,response);
  }
}

上面的处理方式要区分验证码的大小写。

不区分大小写:

//先转换为全大写|全小写,再判断
    trueCode=trueCode.toLowerCase();
    code=code.toLowerCase();
    //trueCode=trueCode.toUpperCase();
    //code=trueCode.toUpperCase();

总结

以上所述是小编给大家介绍的JavaWeb 使用Session实现一次性验证码功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

相关文章

  • 两种java实现二分查找的方式

    两种java实现二分查找的方式

    这篇文章主要给大家分享的是java实现二分查找的方式,二分查找是一种查询效率非常高的查找算法。又称折半查找。下面文章我们介绍了两种方法,需要的朋友可以参考一下
    2021-09-09
  • SpringBoot整合EasyExcel进行大数据处理的方法详解

    SpringBoot整合EasyExcel进行大数据处理的方法详解

    EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。本文将在SpringBoot中整合EasyExcel进行大数据处理,感兴趣的可以了解一下
    2022-05-05
  • Java线程组与未处理异常实例分析

    Java线程组与未处理异常实例分析

    这篇文章主要介绍了Java线程组与未处理异常,结合实例形式分析了java线程组处理异常的相关技巧与操作注意事项,需要的朋友可以参考下
    2019-09-09
  • Java 实现模拟用户登录的示例代码

    Java 实现模拟用户登录的示例代码

    这篇文章主要介绍了Java 实现模拟用户登录的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • java环境配好后jar文件打开命令框闪退(无打开方式,无反应)解决办法

    java环境配好后jar文件打开命令框闪退(无打开方式,无反应)解决办法

    在Java开发中我们经常会遇到运行Jar包时闪退的问题,下面这篇文章主要给大家介绍了关于java环境配好后jar文件打开命令框闪退(无打开方式,无反应)的解决办法,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-04-04
  • SpringBoot实现Read Through模式的操作过程

    SpringBoot实现Read Through模式的操作过程

    Read Through模式通常是指一种缓存策略,其中当应用程序尝试读取数据时,缓存系统首先被检查以查看数据是否已经存在于缓存中,这篇文章主要介绍了SpringBoot实现Read Through模式,需要的朋友可以参考下
    2024-07-07
  • java Spring Boot 配置redis pom文件操作

    java Spring Boot 配置redis pom文件操作

    这篇文章主要介绍了java Spring Boot 配置redis pom文件操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • Springboot中MyBatisplus使用IPage和Page分页的实例代码

    Springboot中MyBatisplus使用IPage和Page分页的实例代码

    这篇文章主要介绍了Springboot中MyBatisplus使用IPage和Page分页,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Springboot自动配置原理及DataSource的应用方式

    Springboot自动配置原理及DataSource的应用方式

    这篇文章主要介绍了Springboot自动配置原理及DataSource的应用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • 使用mybatisplus接收mysql字段为json类型的数据方式

    使用mybatisplus接收mysql字段为json类型的数据方式

    这篇文章主要介绍了使用mybatisplus接收mysql字段为json类型的数据方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04

最新评论