java实现动态验证码

 更新时间:2021年03月04日 17:43:06   作者:iqqcode  
这篇文章主要为大家详细介绍了java实现动态验证码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

java动态实现验证码,供大家参考,具体内容如下

【实现效果】

  • 点击图片或者文字可以更换验证码
  • 验证码随机生成,由大小写字母和数字组成
  • 验证码字体颜色随机生成,字母角度有偏转
  • 干扰线随机分布

验证码的功能: 防止恶意的表单注册

VerificationCode.java 验证码功能实现

package com.iqqcode.servlet.checkcode;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

/**
 * @Author: Mr.Q
 * @Date: 2020-02-12 10:12
 * @Description:验证码生成
 */
@WebServlet("/VerificationCode")
public class VerificationCode extends HttpServlet {
 @Override
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 int width = 120;
 int height = 50;

 //1.创建对象,验证码图片对象
 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

 //2.美化图片
 //2.1填充背景色
 //Graphics g = image.getGraphics();
 Graphics2D g = (Graphics2D) image.getGraphics();//画笔对象,2D来旋转验证码字母
 g.setColor(Color.WHITE);//设置画笔颜色
 g.fillRect(0, 0, width, height);

 //2.2画边框
 g.setColor(Color.BLUE);
 g.drawRect(0, 0, width - 1, height - 1);

 //2.3生成验证码
 String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
 //生成随机角标
 Random random = new Random();
 //改变字体
 g.setFont(new Font("宋体",Font.BOLD,35));

 //将验证码偏转并写到画布上
 for (int i = 1; i <= 4; i++) {
 int x = width/5 * i;
 int y = height/2;
 String msg = "";
 int index = random.nextInt(str.length());
 //获取字符
 char ch = str.charAt(index);//随机字符
 //获取正负30的角度
 int angle = random.nextInt(60) - 30;
 double radian = angle * Math.PI/180;
 //设置验证码中的字体颜色
 //g.setColor(Color.BLUE);
 int red = 0; int green = 0; int blue = 0;
 int codeY = 32;
 // 得到随机产生的验证码数字
 // 产生随机的颜色分量来构造颜色值,使输出的每位数字的颜色值都不同
 red = random.nextInt(255);
 green = random.nextInt(255);
 blue = random.nextInt(255);
 // 用随机产生的颜色将验证码绘制到图像中
 g.setColor(new Color(red, green, blue));
 //写验证码
 g.rotate(radian, x, y);
 //把字母画在画布上
 //g.drawString(ch+"", x, y);
 g.drawString(String.valueOf(ch)+"", x, codeY);
 //把每次旋转的再旋转回来
 g.rotate(-radian, x, y);
 //每次向右移动20像素
 x += 15;
 msg += ch;
 }

 //2.4随机产生20条干扰线,使图象中的认证码不易被其它程序探测到
 g.setColor(Color.MAGENTA);
 //随机生成坐标点
 for (int i = 0; i < 20; i++) {
 int x1 = random.nextInt(width);
 int x2 = random.nextInt(width);
 int y1 = random.nextInt(height);
 int y2 = random.nextInt(height);
 g.drawLine(x1, x2, y1, y2);
 }

 //3.将图片输出到页面展示
 //将图片对象写入流中
 ImageIO.write(image, "jpg", response.getOutputStream());
 }

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

insex.jsp 前台页面展示

分析:

  • 点击超链接或者图片,需要换一张
  • 给超链接和图片绑定单击事件
  • 重新设置图片的src属性值

生成的图片先要缓存在本地,每次请求是不会修改,所以验证码图片不会切换;
将图片路径后添加时间戳,通过错误的路径来欺骗服务器重新请求

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
 <title>验证码</title>
 <script>
 window.onload = function () {
 //1.获取图片对象
 var img = document.getElementById("checkCode");
 //2.绑定图片单击事件
 img.onclick = function () {
 //加时间戳
 var date = new Date().getTime();
 //加时间戳,防止浏览器利用缓存
 img.src = "/ServletResponse/VerificationCode?" + date;
 }
 //绑定链接点击事件
 var ahref = document.getElementById("change");
 ahref.onclick = function () {
 var date = new Date().getTime();
 img.src = "/ServletResponse/VerificationCode?" + date;
 }
 }
 </script>
</head>
<body>
<h2>验证码动态实现</h2>
<img id="checkCode" src="/ServletResponse/VerificationCode">
<a id="change" href="">看不清?换一张</a>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • spring中的事务执行流程图解

    spring中的事务执行流程图解

    这篇文章主要介绍了spring中的事务执行流程图解,Spring事务是Spring框架提供的一种管理数据库事务的机制,它通过将一系列数据库操作封装在一个事务中,保证这些操作要么全部成功执行,要么全部回滚,从而确保数据的一致性和完整性,需要的朋友可以参考下
    2023-10-10
  • Spring中的依赖注入DI源码详细解析

    Spring中的依赖注入DI源码详细解析

    这篇文章主要介绍了Spring中的依赖注入DI源码详细解析,Spring的依赖注入(Dependency Injection,DI)是Spring框架核心的一部分,它是实现控制反转(Inversion of Control,IoC)的一种方式,需要的朋友可以参考下
    2023-11-11
  • 使用Spring由构造方法自动装配

    使用Spring由构造方法自动装配

    这篇文章主要介绍了使用Spring由构造方法自动装配,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Flask接口如何返回JSON格式数据自动解析

    Flask接口如何返回JSON格式数据自动解析

    这篇文章主要介绍了Flask接口如何返回JSON格式数据自动解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Java中Boolean引发缺陷的解决

    Java中Boolean引发缺陷的解决

    本文主要介绍了Java中Boolean引发缺陷的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Maven构建Hadoop项目的实践步骤

    Maven构建Hadoop项目的实践步骤

    本文主要介绍了Maven构建Hadoop项目的实践步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 5个主流的Java开源IDE工具详解

    5个主流的Java开源IDE工具详解

    这篇文章主要介绍了5个主流的Java开源IDE工具,无论如何,Java在当今使用的编程语言中始终排在前三名,在TIOBE索引中涉及700万到1000万的程序员和开发者
    2020-07-07
  • springboot配置项目启动后自动打开浏览器访问项目方式

    springboot配置项目启动后自动打开浏览器访问项目方式

    这篇文章主要介绍了springboot配置项目启动后自动打开浏览器访问项目方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • 详解Java注解实现自己的ORM

    详解Java注解实现自己的ORM

    这篇文章主要介绍了Java注解实现自己的ORM知识,本文通过示例代码给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2022-10-10
  • fastjson生成json时Null属性不显示的解决方法

    fastjson生成json时Null属性不显示的解决方法

    下面小编就为大家带来一篇fastjson生成json时Null属性不显示的解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02

最新评论