目录

1、效果

2、代码

3、整体下载地址


1、效果

可以不停的变

2、代码(有可能不全)

(1)验证码随机字符

import java.awt.*;
import java.util.Random;
//生成验证码随机字符
public class RandomUtils extends org.apache.commons.lang3.RandomUtils {private static final char[] CODE_SEQ = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J','K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W','X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j','k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w','x', 'y', 'z', '2', '3', '4', '5', '6', '7', '8', '9'};private static final char[] NUMBER_ARRAY = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};private static Random random = new Random();public static String randomString(int length) {StringBuilder sb = new StringBuilder();for (int i = 0; i < length; i++) {sb.append(String.valueOf(CODE_SEQ[random.nextInt(CODE_SEQ.length)]));}return sb.toString();}public static String randomNumberString(int length) {StringBuilder sb = new StringBuilder();for (int i = 0; i < length; i++) {sb.append(String.valueOf(NUMBER_ARRAY[random.nextInt(NUMBER_ARRAY.length)]));}return sb.toString();}public static Color randomColor(int fc, int bc) {int f = fc;int b = bc;Random random = new Random();if (f > 255) {f = 255;}if (b > 255) {b = 255;}return new Color(f + random.nextInt(b - f), f + random.nextInt(b - f), f + random.nextInt(b - f));}public static int nextInt(int bound) {return random.nextInt(bound);}
}

(2)工具类

public class VerifyCode {private String code;private byte[] imgBytes;private long expireTime;public String getCode() {return code;}public void setCode(String code) {this.code = code;}public byte[] getImgBytes() {return imgBytes;}public void setImgBytes(byte[] imgBytes) {this.imgBytes = imgBytes;}public long getExpireTime() {return expireTime;}public void setExpireTime(long expireTime) {this.expireTime = expireTime;}
}

(3)验证码生成接口

import java.io.IOException;
import java.io.OutputStream;//验证码生成接口
public interface IVerifyCodeGen {/*** 生成验证码并返回code,将图片写的os中** @param width* @param height* @param os* @return* @throws IOException*/String generate(int width, int height, OutputStream os) throws IOException;/*** 生成验证码对象** @param width* @param height* @return* @throws IOException*/VerifyCode generate(int width, int height) throws IOException;
}

(4)Service

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;@Service
public class SimpleCharVerifyCodeGenImpl implements IVerifyCodeGen {private static final Logger logger = LoggerFactory.getLogger(SimpleCharVerifyCodeGenImpl.class);private static final String[] FONT_TYPES = {"\u5b8b\u4f53", "\u65b0\u5b8b\u4f53", "\u9ed1\u4f53", "\u6977\u4f53", "\u96b6\u4e66"};private static final int VALICATE_CODE_LENGTH = 4;/*** 生成随机字符** @param width* @param height* @param os* @return* @throws IOException*/@Overridepublic String generate(int width, int height, OutputStream os) throws IOException {BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics graphics = image.getGraphics();fillBackground(graphics, width, height);String randomStr = RandomUtils.randomString(VALICATE_CODE_LENGTH);createCharacter(graphics, randomStr);graphics.dispose();//设置JPEG格式ImageIO.write(image, "JPEG", os);return randomStr;}/*** 验证码生成** @param width* @param height* @return*/@Overridepublic VerifyCode generate(int width, int height) {VerifyCode verifyCode = null;try (//将流的初始化放到这里就不需要手动关闭流ByteArrayOutputStream baos = new ByteArrayOutputStream();) {String code = generate(width, height, baos);verifyCode = new VerifyCode();verifyCode.setCode(code);verifyCode.setImgBytes(baos.toByteArray());} catch (IOException e) {logger.error(e.getMessage(), e);verifyCode = null;}return verifyCode;}/*** 设置字符颜色大小** @param g* @param randomStr*/private void createCharacter(Graphics g, String randomStr) {char[] charArray = randomStr.toCharArray();for (int i = 0; i < charArray.length; i++) {//设置RGB颜色算法参数g.setColor(new Color(50 + RandomUtils.nextInt(100),50 + RandomUtils.nextInt(100), 50 + RandomUtils.nextInt(100)));//设置字体大小,类型g.setFont(new Font(FONT_TYPES[RandomUtils.nextInt(FONT_TYPES.length)], Font.BOLD, 26));//设置x y 坐标g.drawString(String.valueOf(charArray[i]), 15 * i + 5, 19 + RandomUtils.nextInt(8));}}/*** 设置背景颜色及大小,干扰线** @param graphics* @param width* @param height*/private static void fillBackground(Graphics graphics, int width, int height) {// 填充背景System.setProperty("myColor", "#BBDAEE");graphics.setColor(Color.getColor("myColor"));//设置矩形坐标x y 为0graphics.fillRect(0, 0, width, height);// 加入干扰线条for (int i = 0; i < 8; i++) {//设置随机颜色算法参数graphics.setColor(RandomUtils.randomColor(40, 150));Random random = new Random();int x = random.nextInt(width);int y = random.nextInt(height);int x1 = random.nextInt(width);int y1 = random.nextInt(height);graphics.drawLine(x, y, x1, y1);}}
}

(5)LoginController

@Controller
@RequestMapping("login")
@ResponseBody
public class LoginController {@Resourceprivate UserService userService;/*** 获取验证码controller* @param response* @param request*/@RequestMapping(value = "verifyCode",method = RequestMethod.GET)public void verifyCode(HttpServletResponse response, HttpServletRequest request){IVerifyCodeGen iVerifyCodeGen = new SimpleCharVerifyCodeGenImpl();//设置长宽try {VerifyCode verifyCode = iVerifyCodeGen.generate(120, 28);String code = verifyCode.getCode();request.getSession().setAttribute("VerifyCode",code);response.setHeader("Pragma","no-cache");response.setHeader("Cache-Control","no-cache");response.setDateHeader("Expires",0);response.setContentType("image/jpeg");response.getOutputStream().write(verifyCode.getImgBytes());response.getOutputStream().flush();} catch (IOException e) {e.printStackTrace();}}

(6)前端

<script>$(function () {// 页面加载时先请求验证码getvCode();});//登录请求接口$("#btnLogin").click(function () {$.ajax({type:"POST",url:"/login",data:$("#myForm").serialize(),dataType:"json",success:function (vo) {if(vo.code === 200){window.location.href = "/pages/index.html";}else {alert(vo.msg);}}});});/*** 获取验证码* 将验证码写到login.html页面的id = verifyimg 的地方*/function getvCode() {var getTimestamp = new Date().getTime();let requestUrl = "/login/verifyCode?timestamp="+getTimestamp;$("#verifyImg").attr('src', requestUrl);}/*** 点击图片刷新验证码*/$("#verifyImg").click(function () {getvCode();});</script>

3、整体下载地址

Java实现登录验证码功能-Java文档类资源-CSDN下载

Java实现登录验证码功能相关推荐

  1. php登录调用验证码,PHP编写登录验证码功能 附调用方法

    本文实例为大家分享了一个PHP写的登录验证码功能,供大家参考,具体内容如下 ShowKey.php<?php session_start(); //设置COOKIE或Session functi ...

  2. Django前后端分离实现登录验证码功能

    Django前后端分离实现登录验证码功能 当下最流行最热门的开发方式当属前后端分离开发,分工也更加明确与专注,前端也是越来越难,几天不学习就跟不上节奏,一个月不学习可以好不夸张的说,你已经不适合这个行 ...

  3. java短信验证码功能发送的验证码如何校验_java 实现发送短信验证码功能

    原标题:java 实现发送短信验证码功能 如何使用java + maven的项目环境发送短信验证码,本文使用的是榛子云短信 的接口. 1. 安装sdk 下载地址: http://smsow.zhenz ...

  4. php实现登录验证码_PHP实现登录验证码功能

    本篇文章主要介绍PHP如何编写登录验证码的功能,感兴趣的朋友参考下,希望对大家有所帮助. 在最顶端声明函数 session_start(); 告诉服务器我们要用这个函数的功能.session_star ...

  5. java短信验证码功能发送的验证码如何校验_Java实现发送短信验证码功能

    一个发送短信验证码的功能,使用的是信易通的短信平台接口,然后在Java中使用HttpClient模拟POST请求或者GET请求(看短信平台要求,一般的情况下都是POST请求),调用短信平台提供的接口( ...

  6. html页面实现登录验证码功能(纯前端)

    html+css+javascript简易实现注册或登录时实现验证码功能: 原文链接:https://blog.csdn.net/weixin_41472431/article/details/907 ...

  7. 用java来实现验证码功能

    科技优家 2017-06-12 12:10 昨天在网上看到了一篇关于验证码的文章,很不错,但是有些不尽人意的地方,比如没有考虑到前端传过来的验证码如果是小写的话,那么做验证的时候就会出现错误, 因为j ...

  8. Web网页实现登录验证码功能

    三部分内容 1.在登录页面生成验证码图片 2.点击图片更换新的验证码图片 3.点击登录,判定输入验证码与实际验证码是否一致 1.如何生成一个验证码图片,放置在登录页面? servlet: packag ...

  9. JavaWeb实现登录验证码功能

    先在Web目录下的lib目录中导入jar包:ValidateCode.jar 然后创建一个Servlet类来创建验证码:ValidateCodeServlet.java 创建验证码 将验证码存储到se ...

  10. java短信验证码功能发送的验证码如何校验_发送短信验证码和邮箱验证码—Java实现...

    短信验证码 短信验证码都是调用一些接口来进行短信的发送,短信验证码在登录.注册等操作中使用的最广泛,本文这一节演示如何使用Java制作一个简单的短信验证码登录. 我这里演示使用的是聚合数据的短信接口( ...

最新文章

  1. python装饰器作用-Python 装饰器的作用
  2. [Linux网络编程学习笔记]套接字地址结构
  3. 惠普打印信息页无法连接到服务器,惠普M400系列打印机网络连接无法打印怎么办?...
  4. 电脑知识:磁盘分区相关知识笔记!
  5. arrays中copyof复制两个数组_Java的数组初识和拷贝用法
  6. java抽象类重载_在JAVA中使用一个抽象方法的重载方法
  7. 杜比dss200服务器重装,杜比数字影片库 DSL200 (Dolby Show Library DSL200)
  8. 华为称不会退出海外市场;英伟达证实遭遇黑客攻击;TypeScript 4.6发布 | 极客头条...
  9. 单片机C语言PWM程序原理,单片机C语言程序设计:用 ADC0808 控制 PWM 输出
  10. python资料-Python资料汇总(建议收藏)
  11. 【点击模型学习笔记】Modeling contextual factors of click rates_MS_AAAI2007
  12. Python程序不使用函数将字符大写
  13. 银行数字化转型导师坚鹏:基于招商银行案例研究的银行APP运营
  14. 【轻聊前端】JavaScript中的数字游戏
  15. 使用 logrotate 配置 supervisor 进行日志管理按天备份
  16. Vue中使用Tinymce-edtio
  17. 一个简单的Java例程
  18. 移动平均法 指数平滑法
  19. c++实现软光栅(二)实现立方体的绘制几个视图矩阵变换投影矩阵推导
  20. 相芯科技助力华为Mate20Pro玩转3D Live Emoji

热门文章

  1. 局域网arp攻击_图解ARP协议(二)ARP攻击原理与实践
  2. 局域网管理工具_个人(wiki)知识管理工具-一代神器之mybase
  3. 任务栏流量监测工具 NetSpeedMonitor 在Windows 8下的安装使用
  4. 计算机工具栏查看,win10工具栏显示网速小工具_技术教程
  5. java web导出excel_javaweb导出excel文件的简单步骤
  6. 双线macd指标参数最佳设置_手机mt4平台怎么使用macd双线指标
  7. MySQL数据库入门学习
  8. fiddler4苹果手机证书无法使用的问题解决方案
  9. 钢结构节点输出软件_BIM技术助力桥梁钢结构设计施工一体化建设
  10. Java之Maven配置教程