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

所属分类: 软件编程 / java 阅读数: 33
收藏 0 赞 0 分享

表单

<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实现一次性验证码功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

更多精彩内容其他人还在看

Springmvc restful配置遇到的小坑

本文是小编给大家带了的Springmvc restful配置遇到的小小坑,小编给大家带来了问题原因及解决办法,非常不错,具有参考借鉴价值,感兴趣的朋友一起看下吧
收藏 0 赞 0 分享

Java中的匿名内部类小结

java内部类分为: 成员内部类、静态嵌套类、方法内部类、匿名内部类。这篇文章主要介绍了Java中的匿名内部类的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Java的云打印Lodop

这篇文章主要介绍了Java的云打印Lodop 的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Java线程池框架核心代码解析

这篇文章主要针对Java线程池框架核心代码进行详细解析,分析Java线程池框架的实现ThreadPoolExecutor,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java 交换两个变量的数值实现方法

下面小编就为大家带来一篇Java 交换两个变量的数值实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

全面了解JAVA_BaseDAO数据处理类

下面小编就为大家带来一篇全面了解JAVA_BaseDAO数据处理类。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

java、python、JavaScript以及jquery循环语句的区别

本篇文章主要介绍java、python、JavaScript以及jquery的循环语句的区别,这里整理了它们循环语句语法跟示例,以便大家阅读,更好的区分它们的不同
收藏 0 赞 0 分享

基于JDBC封装的BaseDao(实例代码)

下面小编就为大家带来一篇基于JDBC封装的BaseDao(实例代码)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

简单通用JDBC辅助类封装(实例)

下面小编就为大家带来一篇简单通用JDBC辅助类封装(实例)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

浅谈java线程中生产者与消费者的问题

下面小编就为大家带来一篇浅谈java线程中生产者与消费者的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享
查看更多