java 生成校验验证码_java 验证码生成与校验

java绘图相关类

de196bc70a4ae4faa4b84c98df58e99c.png

验证码工具类

package dt2008.util;

import javax.imageio.ImageIO;

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;

/**

* 验证码工具类

*/

public class RandomValidateCodeUtil {

//定义随机类

private Random random = new Random();

public void code(HttpServletRequest request, HttpServletResponse response){

//1.创建缓存图片类

//构造方法:new BufferedImage(int width,int height,int model)

BufferedImage image = new BufferedImage(150,50,BufferedImage.TYPE_INT_RGB);

//2.获取画笔

Graphics g = image.getGraphics();

//3.设置画笔颜色

g.setColor(Color.white);//白色

//4.填充矩形

//g.fillRect(x,y,width,height); x,y 起点的坐标,width矩形宽度,height矩形的高度

g.fillRect(0,0,150,50);

//5.画矩形边框

//设置画笔颜色(边框的颜色)

g.setColor(Color.blue);//蓝色

//画边框的语法:g.drawRect(x,y,width,height); x,y 起点的坐标,width边框宽度,height边框的高度

g.drawRect(1,1,147,47);

//6.画4条干扰线

//画直线语法:g.drawLine(x1,y1,x2,y2); x1,y1 线的起点坐标,x2,y2先的终点坐标

for (int i = 0; i < 4; i++) {

//设置画笔为随机颜色

g.setColor(getRandomColor());

//随机获取2个点

int x1 = random.nextInt(147)+1;

int y1 = random.nextInt(47)+1;

int x2 = random.nextInt(147)+1;

int y2 = random.nextInt(47)+1;

//画直线

g.drawLine(x1,y1,x2,y2);

}

//7.画验证码字符串

String checkCodeScope = "qwertyupasdfghjkzxcvbnm";

//定义接收拼接随机获取到的验证码字符变量

StringBuilder checkCodeBuilder = new StringBuilder();

//循环随机获取4个验证码字符

for (int i = 0; i < 4; i++) {

//获取随机位置

int index = random.nextInt(checkCodeScope.length());

//根据位置获取字符

char c = checkCodeScope.charAt(index);

//checkCodeBuilder拼接获取的随机字符

checkCodeBuilder.append(c);

//设置画笔的字体

//字符构造方法:new Font(字体,样式,大小)

g.setFont(new Font("微软雅黑",Font.BOLD,20));

//将每个字符画到图片上

//语法:g.drawString(字符串,x,y);

g.drawString(c+"",30+i*30,30);

}

request.getSession().setAttribute("SESSION_CHECKCODE", checkCodeBuilder.toString());

//8.将验证码图片输出给浏览器

//输出缓存图片的语法:ImageIO.write(缓存图片,图片的格式,输出给浏览器的字节流);

try {

ImageIO.write(image,"png",response.getOutputStream());

} catch (IOException e) {

e.printStackTrace();

}

}

//获取随机的颜色

private Color getRandomColor(){

int r = random.nextInt(256);

int g = random.nextInt(256);

int b = random.nextInt(256);

//构造方法语法:new Color(int r,int g,int b) //由红、绿、蓝组成, 每个颜色值范围0~255

return new Color(r,g,b);

}

}

Controller(生成验证码)

package yingshi.web;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.RestController;

import yingshi.util.RandomValidateCodeUtil;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import java.io.IOException;

/**

* 登录以及验证码

*/

@RestController

@RequestMapping("login/admin")

public class LoginController {

/**

* 生成验证码

*/

@RequestMapping("getVerify")

public void getVerify(HttpServletRequest request, HttpServletResponse response) {

RandomValidateCodeUtil randomValidateCodeUtil = new RandomValidateCodeUtil();

randomValidateCodeUtil.code(request, response);

}

}

这时,可以访问验证码了,可以在前端那写个js点击切换验证码

13ba2a56ade0f05e5941cbf0af2b61f6.png

接下来就是校验验证码(注意:是分大小写的)

package yingshi.web;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.RestController;

import yingshi.util.RandomValidateCodeUtil;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import java.io.IOException;

/**

* 登录以及验证码

*/

@RestController

@RequestMapping("login/admin")

public class LoginController {

/**

* 校验后台登录

*/

@RequestMapping("checkVerify")

public String checkVerify(String username, String password, String verifyInput, HttpServletRequest request, HttpServletResponse response) {

//验证码校验

//获取session中的验证码

String sessionCheckCode = (String) request.getSession().getAttribute("SESSION_CHECKCODE");

//判断验证码是否正确

if(!verifyInput.equals(sessionCheckCode)){

return "错误";

}else{

return "正确";

}

}

}

希望这篇文章对您有帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349352.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

红黑树中nil结点_什么是红黑树?程序员面试必问!

点击上方java小组&#xff0c;选择“置顶公众号”优质文章&#xff0c;第一时间送达当在10亿数据中只需要进行10几次比较就能查找到目标时&#xff0c;不禁感叹编程之魅力&#xff01;人类之伟大呀&#xff01; —— 学红黑树有感。终于&#xff0c;在学习了几天的红黑树相关的…

杰克逊JSON解析错误-UnrecognizedPropertyException:无法识别的字段,未标记为可忽略[已解决]...

在解析从我们的一个RESTful Web服务接收到的JSON字符串时&#xff0c;我收到此错误“线程“ main”中的异常com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException&#xff1a;无法识别的字段“人”&#xff08;类Hello $ Person&#xff09;&#xff0c;不是标记…

mysql2008数据库配置_SQL Server 2008 R2 超详细安装图文教程

这篇文章主要介绍了SQL Server 2008 R2 超详细安装图文教程,需要的朋友可以参考下一、下载SQL Server 2008 R2安装文件二、将安装文件刻录成光盘或者用虚拟光驱加载&#xff0c;或者直接解压&#xff0c;打开安装文件&#xff0c;出现下面的界面安装SQL Server 2008 R2需要.NET…

hdfs读写流程_深度探索Hadoop分布式文件系统(HDFS)数据读取流程

一、开篇Hadoop分布式文件系统(HDFS)是Hadoop大数据生态最底层的数据存储设施。因其具备了海量数据分布式存储能力&#xff0c;针对不同批处理业务的大吞吐数据计算承载力&#xff0c;使其综合复杂度要远远高于其他数据存储系统。因此对Hadoop分布式文件系统(HDFS)的深入研究&a…

python可视化分析网易云音乐评论_Python数据可视化:网易云音乐歌单

网易云音乐2018年度听歌报告—遇见你&#xff0c;真好。相信有不少人在上周&#xff0c;应该已经看过自己网易云音乐的年度报告了。小F也是去凑凑热闹&#xff0c;瞅了一波自己的年度听歌报告。那么你在云村又听了多少首歌&#xff0c;听到最多的歌词又是什么呢?2018年你的年度…

mysql隔离级别验证_MySQL事务隔离级别以及验证

查询初始数据开启A事务  并做更新操作再另一端 B开始另一个事务查询 事务级别设置为读未提查询到事务未提交的数据 a的count修改为3 但是没有提交2 第二个级别 读已提交 避免脏读问题 但是有不可重复读问题回滚数据 修改隔离级别 确保都是 读已提交级别客户端A客户端B验证 脏…

登录样式:log4j 2,上下文,自动清除…全部不附加任何字符串!

日志记录-保持操作的时间跟踪-对于任何关键任务系统&#xff0c;无论大小&#xff0c;都至关重要。 我们的Project-X框架也是如此 &#xff0c;这就是为什么我们希望从一开始就正确地做到这一点。 基于我们在传奇的UltraESB上的登录经验&#xff0c; 上下文日志记录&#xff0…

python37安装失败_Linux 安装Python37

1、下载python3.7.0https://www.python.org/downloads/release/python-370/2、创建Linux的python37目录mkdir /usr/local/python373、解压python3.7.0源码tar zxvf python3.7.0.tar.zg4、配置编译参数./configure --prefix/usr/local/python375、make6、make install注意&#…

python string模块template_Python标准库笔记(1) — string模块

String模块包含大量实用常量和类&#xff0c;以及一些过时的遗留功能&#xff0c;并还可用作字符串操作。1. 常用方法常用方法描述str.capitalize()把字符串的首字母大写str.center(width)将原字符串用空格填充成一个长度为width的字符串&#xff0c;原字符串内容居中str.count…

注意力机制可视化_目标跟踪中的(STAM)时空注意力机制

目标跟踪分为单目标跟踪和多目标跟踪&#xff0c;单目标跟踪较为简单&#xff0c;这里我们只讨论多目标跟踪。多目标跟踪的遮挡问题多目标跟踪时特别容易发生目标间的相互遮挡&#xff0c;从而导致严重的预测偏移问题&#xff0c;如下图所示&#xff1a;红色框的行人在和蓝色框…

byteman_使用Byteman和JUnit进行故障注入

byteman我们的应用程序独立存在的时间已经很久了。 如今&#xff0c;应用程序是一种非常复杂的野兽&#xff0c;它们使用无数的API和协议相互通信&#xff0c;将数据存储在传统或NoSQL数据库中&#xff0c;通过网络发送消息和事件……例如&#xff0c;您多久考虑一次例如数据库…

java动态扩展_java栈内存动态扩展要怎么理解?要如何实现?

小伙伴们知道如何在java栈中内存动态扩展吗?这是虚拟机中的一个概念&#xff0c;下面让我们一起来看看该如何实现吧。一、内存概念在java中&#xff0c;我们一般会简单把java内存区域划为两种&#xff1a;堆内存与栈内存。其实这种划分是比较粗粒度的。其中栈内存就是指的是虚…

python 爬虫热搜_Python网络爬虫之爬取微博热搜

微博热搜的爬取较为简单&#xff0c;我只是用了lxml和requests两个库1.分析网页的源代码&#xff1a;右键--查看网页源代码.从网页代码中可以获取到信息(1)热搜的名字都在的子节点里(2)热搜的排名都在的里(注意置顶微博是没有排名的&#xff01;)(3)热搜的访问量都在的子节点里…

优盘复制进来为空_为何电脑上的文件夹一复制到U盘里就变成空文件夹了?

(格式化后的卡在恢复前千万不要往里面存东西,因为这样会覆盖你想恢复的内容,如果你不小心存东西了也不要放弃,只不过恢复的机率会变小),下面开始:::在百度里输入Easy recover 软件找到后下载安装到电脑上,然后将内存卡与电脑连接,打开Easy recover 软件,首次打开时软件会分析系…

Spring Cloud教程–使用Spring Cloud Bus自动刷新配置更改

问题 在上一篇文章Spring Cloud Config Server简介 &#xff08; http://sivalabs.in/2017/08/spring-cloud-tutorials-introduction-to-spring-cloud-config-server/ &#xff09;中&#xff0c;我们已经了解了如何使用Spring Cloud配置服务器。 但是&#xff0c;问题是要重新…

js给标签添加属性和值_jquery节点属性

一.节点操作1.DOM内容节点操作&#xff1a;​ ①innerHTML属性&#xff1a;设置或获取文本的内容&#xff08;普通文本和标签&#xff09;。​ ②innerText属性&#xff1a;设置或获取文本的内容&#xff08;普通文本&#xff09;&#xff0c;存在兼容性问题。2.jQuery内容节点…

sci translate好用吗_228个学科分类对应12000+本SCI和SSCI期刊,总有你要的那款!

最近有很多小伙伴询问选刊的问题&#xff0c;而且都是非常具体的学科方向&#xff0c;我们的小编虽然非常热心且礼貌的回答“近期安排”&#xff0c;但其实我们也感觉到鸭梨山大:根据WOS最新一期&#xff08;2020/9/21&#xff09;名单公布&#xff0c;WOS目前总共收录了12266本…

java 反射 属性顺序_java反射得到的方法数组的顺序

展开全部看了下你好像需要set和get方法&#xff0c;如果你知道属性的名字的话不需要遍历可以这样获取&#xff0c;这个是我以前的demo的一个32313133353236313431303231363533e58685e5aeb931333332633561片段:Class clazzClass.forName("com.demo.reflectdemo.Student&quo…

arrays.sort(._Arrays.sort与Arrays.parallelSort

arrays.sort(.我们都使用Arrays.sort对对象和原始数组进行排序。 此API在下面使用合并排序或Tim排序对内容进行排序&#xff0c;如下所示&#xff1a; public static void sort(Object[] a) {if (LegacyMergeSort.userRequested)legacyMergeSort(a);elseComparableTimSort.sor…

python冒泡排序函数_python冒泡排序-Python,冒泡排序

arr[7,4,3,67,34,1,8].defbubble_sort:最近在学习Python&#xff0c;下面是我的一些笔记冒泡排序实现思路&#xff1a; 使用双重for循环&#xff0c;内层变量为i&#xff0c; 外层为j&#xff0c;在内层循环中不断的比较相邻的两个值(i, i1)的大小&#xff0c;如果i1的值大于i的…