文章目录

  • 验证码校验分析
  • 生成验证码
  • 测试验证码
  • 校验验证码
  • 测试验证码校验
  • 添加验证码刷新

在网页页面的使用中为防止“非人类”的大量操作和防止一些的信息冗余,增加验证码校验是许多网站常用的方式。

而让用户输入字母和数字组合的验证码是最经典也是最常用的方式。
这一篇是纯利用现有JDK提供的绘图类(ImageIO)类制作,这个过程比较复杂且需要了解ImageIO类。

今天发布的第二篇文章是利用Hutool工具类来实现的,该工具类已经封装验证码所需的相关类等,使用起来较为简单和方便。

验证码的生成和校验过程均使用Servlet和JSP的结合来实现,Servlet的相关内容可以参阅Servlet技术

如何利用基础的JSP知识来实现网页的验证码校验呢?

验证码校验分析

首先要验证码的校验的过程。

验证码校验分为三部分:

  1. 生成验证码
  2. 获取用户输入的验证码
  3. 判断验证码是否输入正确

验证码的生成实际就是输出一个图像,所以在这里使用ImageIO来生成图片,然后结合使用随机数(Random)来实现随机生成验证上的内容,最后进而展示出来,然后利用Session对象存储验证码的内容。在用户输入验证码的时候可以用request来获取用户输入的内容,让其余Session对象中保存的验证码内容进行比较,若一致则验证成功,不一致就验证失败。

生成验证码

先创建一个图片的缓冲区:

BufferedImage bi=new BufferedImage(68, 22,BufferedImage.TYPE_INT_RGB);

创建画布:

Graphics g=bi.getGraphics();

创建颜色:

Color c=new Color(200,150,255);

创建背景颜色:

g.setColor(c);

填充矩形:

g.fillRect(0, 0, 68,22);

将要显示的验证码内容组成元素存入字符串数组:

char[] ch="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();

创建随机的验证码内容:

Random r=new Random();int len=ch.length;int index; //index用于存放随机数字StringBuffer sb=new StringBuffer();for(int i=0;i<4;i++){index=r.nextInt(len);//产生随机数字g.setColor(new Color(r.nextInt(88),r.nextInt(188),r.nextInt(255)));  //设置颜色g.drawString(ch[index]+"",(i*15)+3, 18);//画数字以及数字的位置sb.append(ch[index]);}

将验证码的内容存入Session及显示在页面上:

 request.getSession().setAttribute("piccode",sb.toString()); ImageIO.write(bi, "JPG", response.getOutputStream());

完整代码:

public class ImageServlet  extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {BufferedImage bi = new BufferedImage(68, 22, BufferedImage.TYPE_INT_RGB);//创建图像缓冲区Graphics g = bi.getGraphics(); //通过缓冲区创建一个画布Color c = new Color(200, 150, 255); //创建颜色g.setColor(c);//为画布创建背景颜色g.fillRect(0, 0, 68, 22); //填充矩形char[] ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();//转化为字符型的数组Random r = new Random();int len = ch.length;int index; //index用于存放随机数字StringBuffer sb = new StringBuffer();for (int i = 0; i < 4; i++) {index = r.nextInt(len);//产生随机数字g.setColor(new Color(r.nextInt(88), r.nextInt(188), r.nextInt(255)));  //设置颜色g.drawString(ch[index] + "", (i * 15) + 3, 18);//画数字以及数字的位置sb.append(ch[index]);}request.getSession().setAttribute("piccode", sb.toString());ImageIO.write(bi, "JPG", response.getOutputStream());}
}

测试验证码

在测试之前需要先在web.xml文件中配置一下:

<servlet><servlet-name>ImageServlet</servlet-name><servlet-class>com.kailong.servlet.ImageServlet</servlet-class></servlet><servlet-mapping><servlet-name>ImageServlet</servlet-name><url-pattern>/imageServlet</url-pattern></servlet-mapping>

启动服务器后在浏览器中输入http://localhost:8080/工程名/imageServlet 即可

验证码的生成已经实现成功,下面实现验证验证码的Servlet。

校验验证码

先新建一个jsp用户界面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>登录界面</title>
</head>
<body>
<form action="<%= request.getContextPath()%>/loginServlet" method="get" >验证码:<input  type="text" name="checkCode"/><br/><img alt="验证码" id="imagecode" src="<%= request.getContextPath()%>/imageServlet"/><input type="submit" value="提交">
</form>
</body>
</html>

校验验证码过程:

  1. 将生成的验证码内容保存在Session对象中
  2. 获取用户输入的验证码内容
  3. 将两个内容进行对照

代码实现:

获取Session中的验证码内容:

String piccode=(String) request.getSession().getAttribute("piccode");

获取用户输入的验证码内容:

String checkCode=request.getParameter("checkCode");

验证码判断(使用了PrintWriter将相关内容输出)

response.setContentType("text/html;charset=utf-8");//解决乱码问题
PrintWriter out=response.getWriter();
if(checkCode.equals(piccode))
{out.println("验证码输入正确!");
}
else
{out.println("验证码输入错误!!!");
}
out.flush();//将流刷新
out.close();//将流关闭

完整代码:

public class LoginServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException//用于验证验证码{String piccode = (String) request.getSession().getAttribute("piccode");String checkCode = request.getParameter("checkCode");response.setContentType("text/html;charset=utf-8");//解决乱码问题PrintWriter out = response.getWriter();if (checkCode.equals(piccode)) {out.println("验证码输入正确!");} else {out.println("验证码输入错误!!!");}out.flush();//将流刷新out.close();//将流关闭}
}

测试验证码校验

测试前先在web.xml文件中配置一下:

 <servlet><servlet-name>LoginServlet</servlet-name><servlet-class>com.kailong.servlet.LoginServlet</servlet-class></servlet><servlet-mapping><servlet-name>LoginServlet</servlet-name><url-pattern>/loginServlet</url-pattern></servlet-mapping>

添加验证码刷新

在验证码生成之后,用户在识别的时候可能不能正确识别,这时候就需要刷新一下重新生成。

添加超链接实现刷新:

login.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>登录界面</title><script>function reloadCode() {var time=new Date().getTime();document.getElementById("imagecode").src="<%= request.getContextPath()%>/imageGenerate?d="+time;}</script>
</head>
<body>
<form action="<%= request.getContextPath()%>/loginServlet" method="get" >验证码:<input  type="text" name="checkCode"/><br/><img alt="验证码" id="imagecode" src="<%= request.getContextPath()%>/imageServlet"/><a href="javascript:reloadCode();">看不清楚</a><br><br/><input type="submit" value="提交">
</form>
</body>
</html>

js部分的Date相关是防止浏览器缓存后不能正常刷新,添加时间的唯一性来实现能够及时刷新和展示。

js 部分可以参阅:JavaScript 语言入门

也可以在ImageServlet中添加防止浏览器缓存的语句:

response.setHeader("Pragma", "No-cache");

公众号本文地址:https://mp.weixin.qq.com/s/XHucabQ_WwUx2OMDGSTMkw
头条本文地址:https://www.toutiao.com/item/7154265403634926112/
欢迎关注公众号:愚生浅末。

JSP页面实现验证码校验相关推荐

  1. jsp页面生成验证码且验证

    一般先写出验证码,利用java语言写出(后台或者前台写,前台jsp还是用<% %>包java语句写出) 然后登陆页面用img的src引入验证码的方法,比如: <img src=&qu ...

  2. SpringBoot+Vue项目中实现登录验证码校验

    SpringBoot+Vue项目中实现登录验证码校验 在各大项目中,为保证数据的安全性,通常在登录页面加入验证码校验,以防止爬虫带来的数据泄露危机.本文将介绍在前后端分离的项目中,怎样实现图形验证码校 ...

  3. Jsp页面用javascript加 滑动验证条

    先上个效果图 1. 在head之间加入 <head> <script type="text/javascript" charset="utf-8&quo ...

  4. AJAX验证jsp页面验证码

    我们在做登录的时候往往会加上验证码,然后提交form表单到action验证,然而,传统的这种做法往往验证不通过,返回INPUT页面时,出现验证码图片不显示,并抛出空指针异常,遇到这种情况,通常的解决方 ...

  5. JSP 页面访问用户验证

    jsp安全性问题,当别人知道某个jsp文件的网址后就可以跳过登陆页面直接访问该jsp文件了,这样无法禁止外部无权限用户的访问.本文讨论内容是通过权限验证的用户,才可以访问特定的页面. JSP 页面验证 ...

  6. AJAX应用【股票案例、验证码校验】

    一.股票案例 我们要做的是股票的案例,它能够无刷新地更新股票的数据.当鼠标移动到具体的股票中,它会显示具体的信息. 我们首先来看一下要做出来的效果: 1.1服务器端分析 首先,从效果图我们可以看见很多 ...

  7. struts2中jsp页面上验证码的生成

    如何在jsp页面中显示验证码: 验证码:<img class="yzm_img" align="middle" id="validateImag ...

  8. 在java中建个jsp文件_第一个jsp页面

    安装JDK,配置JDK开发环境: //配置JAVA_HOME,在系统环境变量中创建: //变量名:JAVA_HOME //变量值:(JDK所在的根目录) C:\Program Files\Java\j ...

  9. JSP页面中验证码的调用方法

    步骤: 1.首先是要生成验证码 2.对验证码类进行调用:主要 实现的是  将验证码图片 输出到response.getOutputStream()这个输出流中 调用时,可以在页面调用,也可以在serv ...

最新文章

  1. Asp.net SignalR 应用并实现群聊功能 开源代码
  2. tsne pca 自编码器 绘图(CC2)——一定记得做无量纲化处理使用standardscaler,数据聚类更明显...
  3. 微信公众号手机无法直接下载APK文件是怎么回事
  4. ExecutorCompletionService 源码分析
  5. WinSock嗅探虚拟主机拿站取webshell
  6. 技术选型:Sentinel vs Hystrix
  7. PYTHON——多线程:Thread类与线程函数
  8. 推荐系统实战系列(python版).rar_python实战音乐推荐系统
  9. 解决sea.js引用jQuery提示$ is not a function的问题
  10. 201809-2-买菜
  11. python语法注释原则
  12. 信息图表是如何炼成的之一:媒体使用情况
  13. gdb 打印所有线程堆栈
  14. 吊炸天——74款APP完整源码
  15. JavaScript 3D 散点图
  16. 计算机考研用python_20年苏州大学计算机考研经验
  17. 网络协议 终章 - GTP 协议:复杂的移动网络
  18. 马哥教育N38第二周作业
  19. 碎片时间”绑架了多少焦虑的现代人?
  20. x%3e=y%3e=z的c语言表达式,我的C语学习笔记-C语言教程(三).doc

热门文章

  1. 株洲入选国家低碳试点城市 这些事与市民息息相关
  2. PVE系列教程(二)、安装网心云x86专业版
  3. 快递物流驿站签收的单号查询筛选的方法
  4. Linux网络——网桥设置管理
  5. CSS练习--努比亚
  6. 感觉最智能的工作,偏偏最人工——元旦的致命来电
  7. mysql 添加索引 mysql 如何创建索引
  8. 数字化转型:AI中台如何在企业中落地
  9. Android很多功能iPhone没有,为什么越来越多的人选择Android手机,iPhone到底哪点比不了?...
  10. 高薪程序员面试题精讲系列77之如何防止前端页面重复提交请求?