JSP页面实现验证码校验功能

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

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

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

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

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

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

验证码校验分析

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

验证码校验分为三部分:

  • 生成验证码
  • 获取用户输入的验证码
  • 判断验证码是否输入正确

验证码的生成实际就是输出一个图像,所以在这里使用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"/>

    <img alt="验证码" id="imagecode" src="<%= request.getContextPath()%>/imageServlet"/>
    <input type="submit" value="提交">
</form>
</body>
</html>

校验验证码过程:

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

代码实现:

获取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();" rel="external nofollow"   >看不清楚</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页面实现验证码校验的文章就介绍到这了,更多相关JSP验证码内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JSP + Servlet实现生成登录验证码示例

    随机生成四位数验证码,包括汉字,数字,英文大小写. 1.Servlet类 package servlet; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.awt.geom.Line2D; i

  • jsp 生成验证码代码

    调用方法:在jsp页面用图像标签便可以直接调用如下是标签代码<img border=0 src="image.jsp">,只需要把该代码发在验证码要显示的区域就可以了) <%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %> <%! public static Strin

  • JSP实用教程之简易图片验证码的实现方法(附源码)

    前言 很多新手对图片验证码不是很了解,所以本文尝试通过一个简单的 JSP 小程序来实现验证码功能.文中给出了详细的示例代码,文末给出了完整实例代码的下载地址,下面话不多说了,来一起看看详细的介绍吧. 效果图 示例代码 前台代码如下: <form action="action.jsp" method="POST"> <label> 用户名: <input type="text" name="name"

  • Jsp生成页面验证码的方法[附代码]

    image.jsp------------------------------生成随机验证码图片的Jsp页面 代码如下:  复制代码 代码如下: <%@ page contentType="image/jpeg" import="java.awt.*, java.awt.image.*,java.util.*,javax.imageio.*" %> <%! Color getRandColor(int fc,int bc) { Random ran

  • jsp引用servlet生成的验证码代码演示

    此演示代码主要包括以下三部分:1.checkCode.java:用于生成验证码2.checkCodeServler3.check.jsp 验证 下面是checkCode.java的内容: 复制代码 代码如下: //用于获取四位随机数     private char mapTable[] = {'0','1','2','3','4','5','6','7','8','9'}; //生成验证码,并返回随机生成的数字     public String getEnsure(int width, in

  • JSP实现登录功能之添加验证码

    jsp登陆验证,网页登陆验证带验证码校验,登录功能之添加验证码 part_1:专门用于生成一个验证码图片的类:VerificationCode.Java package cn.mike.javase.test; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.i

  • jsp实现简单图片验证码功能

    本文实例为大家分享了jsp实现简单图片验证码的具体代码,供大家参考,具体内容如下 一.实现的功能分析 (1)在登陆页面加验证码的功能,起到一定的安全性.在输入正确的验证码,用户名和密码的情况下,才可以实现登录.(2)实现查询数据库的功能.在登陆后的页面中,显示用户名和密码,并且设置有一个超链接,实现查询数据库的功能.(3)代码核心是:随机生成验证码,并且显示在页面上.同时要和输入框中的输入验证码进行校验.(4)主页面使用img标签的src属性引入验证页面的jsp文件.(5)验证码的实现页面使用B

  • JSP页面实现验证码校验功能

    目录 验证码校验分析 生成验证码 测试验证码 校验验证码 测试验证码校验 添加验证码刷新 在网页页面的使用中为防止“非人类”的大量操作和防止一些的信息冗余,增加验证码校验是许多网站常用的方式. 而让用户输入字母和数字组合的验证码是最经典也是最常用的方式.这一篇是纯利用现有JDK提供的绘图类(ImageIO)类制作,这个过程比较复杂且需要了解ImageIO类. 今天发布的第二篇文章是利用Hutool工具类来实现的,该工具类已经封装验证码所需的相关类等,使用起来较为简单和方便. 验证码的生成和校验过

  • PHP实现登录验证码校验功能

    验证码的校验是利用PHP中的 SESSION功能来实现. 在最顶端声明函数 session_start(); 告诉服务器我们要用这个函数的功能. session_start(); 接下来我们用到的就是验证码实现的代码.这里用英文数字的代码为例. $image = imagecreatetruecolor(100, 30); //创建一个100×30的画布 $white = imagecolorallocate($image,255,255,255);//白色 imagefill($image,0

  • 利用Java工具类Hutool实现验证码校验功能

    目录 Hutool工具类介绍 Hutool实现验证码生成 测试验证码生成 其他样式的验证码 第一篇是纯利用现有JDK提供的绘图类(ImageIO)类制作,这个过程比较复杂且需要了解ImageIO类. 这一篇文章是利用Hutool工具类来实现的,该工具类已经封装验证码所需的相关类等,使用起来较为简单和方便. Hutool工具类介绍 Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”.

  • PHP实现验证码校验功能

    验证码的校验是利用PHP中的 SESSION功能来实现. 在最顶端声明函数 session_start(); 告诉服务器我们要用这个函数的功能. session_start(); 接下来我们用到的就是验证码实现的代码.这里用英文数字的代码为例. $image = imagecreatetruecolor(100, 30); //创建一个100×30的画布 $white = imagecolorallocate($image,255,255,255);//白色 imagefill($image,0

  • JavaWeb验证码校验功能代码实例

    后台生成验证码工具方法 /* * 设置图片的背景色 */ public static void setBackGround(Graphics g, int WIDTH, int HEIGHT) { // 设置颜色 g.setColor(Color.WHITE); // 填充区域 g.fillRect(0, 0, WIDTH, HEIGHT); } /* * 设置图片的边框 */ public static void setBorder(Graphics g, int WIDTH, int HEI

  • Django框架登录加上验证码校验实现验证功能示例

    本文实例讲述了Django框架登录加上验证码校验实现验证功能.分享给大家供大家参考,具体如下: 验证码生成函数 pip install Pillow # /verify_code def verif_ycode(request): #引入绘图模块 from PIL import Image, ImageDraw, ImageFont #引入随机函数模块 import random #定义变量,用于画面的背景色.宽.高 bgcolor = (random.randrange(20, 100), r

  • Java Web实现登录页面验证码验证功能

    一.验证码 验证码本质上是一张图片,图片内容会随着程序的运行而随机生成 验证码的作用:防止应用恶意发送数据,一定程度上避免了恶意程序对网站的攻击. 验证码本质上是一张图片,图片内容的准确解析不容易用程序来实现. 验证码的绘制:绘制验证码图片不仅仅需要随机生成要绘制的内容,同时要配合Java中与绘图有关的一套API来完成. 二.效果演示 验证码Demo 三.给出完整代码 (1)服务器端代码ActionServlet.java package session; import java.io.IOEx

  • Java使用正则表达式对注册页面进行验证功能实现

    本文给大家介绍java使用正则表达式对注册页面进行验证的代码,代码如下所示: package regex; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; public class registered { public static void main(String[] args) { //注册用户 Scanner sc=new Scanner(System.in

  • 详解Struts2中对未登录jsp页面实现拦截功能

    Struts2中拦截器大家都很经常使用,但是拦截器只能拦截action不能拦截jsp页面.这个时候就有点尴尬了,按道理来说没登录的用户只能看login界面不能够通过输入URL进行界面跳转,这显然是不合理的.这里介绍Struts2中Filter实现jsp页面拦截的功能.(有兴趣的人可以去研究Filter过滤器的其它用法,因为利用过滤器也可以实现action拦截的功能) 下面直接上代码,边看边分析实现步骤和原理. 1.web.xml中的配置信息: <filter> <filter-name&

  • jsp网页登陆验证

    jsp登陆验证,网页登陆验证带验证码校验,登录功能之添加验证码 part_1:专门用于生成一个验证码图片的类:VerificationCode.java package cn.mike.javase.test; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.i

随机推荐