java代码实现简单的认证——图片验证码形式

时间:2022-08-27 09:41:55

前言:认证在互联网中会经常见到,其主要作用是安全问题中防止恶意破解、刷票等。在系统开发中认证的实现也有很多种,什么手机短信认证,邮箱认证等。在这里我使用最基本的验证码的形式进行认证,下面例出过程。

验证码工具类(用来生成验证码)

创建一个简单的验证码生成器,通过流的方式将随机字体、随机背景色、干扰线、随机字符串,夹杂在一起形成验证码图片

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random; /**
* 自定义验证码类
*/
public class VerifyCode {
private int width = 100; //生成验证码图片的宽度
private int height = 40; //生成验证码图片的高度
private String[] fontNames = {"宋体","楷体","隶书","微软雅黑"};
private Color bgColor = new Color(255,255,255); //定义验证码图片的背景色
private Random random = new Random();
private String codes = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
private String text; //记录随机字符串 /**
* 获取随机一个颜色
* @return
*/
private Color randomColor(){
int red = random.nextInt(150);
int green = random.nextInt(150);
int blue = random.nextInt(150);
return new Color(red,green,blue);
} /**
* 获取随机一个字体
* @return
*/
private Font randomFont(){
String name = fontNames[random.nextInt(fontNames.length)];
int style = random.nextInt(4);
int size =random.nextInt(5)+24;
return new Font(name,style,size);
} /**
* 获取随机一个字符
* @return
*/
private char randomChar(){
return codes.charAt(random.nextInt(codes.length()));
} /**
* 创建一个空白的BufferedImage对象
* @return
*/
private BufferedImage createImage(){
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = (Graphics2D)image.getGraphics();
g2.setColor(bgColor);
g2.fillRect(0,0,width,height);
return image;
} /**
* 绘制干扰线
*/
private void drawLine(BufferedImage image){
Graphics2D g2 = (Graphics2D) image.getGraphics();
int num = 5;
for (int i = 0 ;i < num ; i++){
int x1 = random.nextInt(width);
int y1 = random.nextInt(height);
int x2 = random.nextInt(width);
int y2 = random.nextInt(height);
g2.setColor(randomColor());
g2.setStroke(new BasicStroke(1.5f));
g2.drawLine(x1, y1, x2, y2);
}
} /**
* 绘制验证码
* @return
*/
public BufferedImage getImage(){
BufferedImage image = createImage();
Graphics2D g2 = (Graphics2D) image.getGraphics();
StringBuffer sb = new StringBuffer();
for (int i = 0 ; i < 4 ; i++){
String s = randomChar() + "";
sb.append(s);
g2.setColor(randomColor());
g2.setFont(randomFont());
float x = i * width * 1.0f / 4;
g2.drawString(s,x,height - 15);
}
this.text = sb.toString();
drawLine(image);
return image;
} public String getText(){
return text;
} /**
* 用流传输方法
* @return
*/
public static void output(BufferedImage image, OutputStream out) throws IOException {
ImageIO.write(image,"JPEG",out);
}
}

controller层调用

创建VerifyCode验证码生成器实例,将text(随机字符串)存入session中,将图片用流的方式传入前段

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.image.BufferedImage;
import java.io.IOException; @RestController
public class VerifyCodeController {
@GetMapping("/vercode")
public void code(HttpServletRequest req, HttpServletResponse resp) throws IOException {
//创建验证码生成器实例取得生成图片和随机字符串
VerifyCode vc = new VerifyCode();
BufferedImage image = vc.getImage();
String text = vc.getText();
//随机字符串存入session中
HttpSession session = req.getSession();
session.setAttribute("index_code",text);
//用流传输
VerifyCode.output(image,resp.getOutputStream());
}
}

前段

前段我这里使用的是vue框架(使用什么框架不是问题,姑且提一下),img图片中src路劲调用

<img src="/vercode" alt="">

启动服务器,测试,获取成功

java代码实现简单的认证——图片验证码形式

前段-输入

我这里做登录认证,表单加入验证码输入

<tr>
<td>
<el-tag>验证码</el-tag>
</td>
<td>
<el-input size="mini" v-model="user.code" pleceholder="请输入验证码"></el-input>
</td>
<td>
<img src="/vercode" alt="">
</td>
</tr>

java代码实现简单的认证——图片验证码形式

使用spring security做后台的验证

这里只提取验证码相关的:

过滤器

自定义过滤器,继承GenericFilterBean,重写doFilter方法

@Component
public class VerifyCodeFilter extends GenericFilterBean {
//绑定登录路径
private String defaultFilterProcessUrl = "/doLogin"; @Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
if ("POST".equalsIgnoreCase(request. getMethod()) && defaultFilterProcessUrl.equals(request.getServletPath())){
String requestCaptcha = request.getParameter("code");
String genCaptcha = (String) request.getSession().getAttribute("index_code");
if(StringUtils.isEmpty(requestCaptcha)){
throw new AuthenticationServiceException("验证码不能为空!");
}
if (!genCaptcha.toLowerCase().equals(requestCaptcha.toLowerCase())){
throw new AuthenticationServiceException("验证码错误!");
}
}
chain.doFilter(request,response);
}
}

安全配置器

继承WebSecurityConfigurerAdapter类,重写认证方法

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
VerifyCodeFilter verifyCodeFilter; @Override
public void configure(WebSecurity web) throws Exception {
//防止验证图片被拦截
web.ignoring().antMatchers("/vercode");
} @Override
protected void configure(HttpSecurity http) throws Exception {
//对前段获取到的验证数据进行验证
http.addFilterBefore(verifyCodeFilter,UsernamePasswordAuthenticationFilter.class);
http.authorizeRequests()
//省略账号密码认证
...
...
...
.permitAll()
.and()
.csrf().disable()
}
}

登录测试

java代码实现简单的认证——图片验证码形式

这次就到这里,有什么问题或建议可以在下面评论。

积累点点滴滴,一步一脚印,加油

java代码实现简单的认证——图片验证码形式的更多相关文章

  1. Java之英格玛简单实现以及加密验证码的应用

    最近看了一部电影<模仿游戏>,<模仿游戏>中艾伦·图灵破译英格玛让我对英格玛产生了好奇,于是就开始翻阅资料对其进行研究,但是毕竟智慧有限,所以我这里用Java实现一个简单的英格 ...

  2. Jmeter4&period;0---- jmeter中写入java代码&lowbar;简单了解(15)

    1.说明 BeanShell:是一个小型嵌入式Java源代码解释器,具有对象脚本语言特性,能够动态地执行标准JAVA语法,并利用在JavaScript和Perl中常见的的松散类型.命令.闭包等通用脚本 ...

  3. Python简单的制作图片验证码

    -人人可以学Python--这里示范的验证码都是简单的,你也可以把字符扭曲 人人可以学Python.png Python第三方库无比强大,PIL 是python的一个d第三方图片处理模块,我们也可以使 ...

  4. Java生成登陆时使用的图片验证码

    package com.ws.frame.utils; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; i ...

  5. java代码GUI简单的。。。

    总结:觉得 package com.da; import java.awt.*; //逆向思维:important //创建一个String对象的数组,然后执行读取文本,把文本每一行存入数组,它将读取 ...

  6. MVC伪一个12306图片验证码

    本文的来由主要是满足自己的好奇心,而不是证明什么东西,如果涉及到什么官方性的事情,麻烦通知我谢谢:本篇将要和大家分享的是一个看起来通12306图片验证码相似的效果,这篇应该是今年农历最后一篇分享文章了 ...

  7. 使用Maven根据WSDL生成生成Java代码

    转载:https://blog.csdn.net/pzasdq/article/details/52601473 为便于自己学习,整理 修改pom.xml <project xmlns=&quo ...

  8. 开发工具类API调用的代码示例合集:六位图片验证码生成、四位图片验证码生成、简单验证码识别等

    以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 六位图片验证码生成:包括纯数字.小写字母.大写字母.大小写混合.数 ...

  9. SpringBoot &plus; Spring Security 学习笔记(三)实现图片验证码认证

    整体实现逻辑 前端在登录页面时,自动从后台获取最新的验证码图片 服务器接收获取生成验证码请求,生成验证码和对应的图片,图片响应回前端,验证码保存一份到服务器的 session 中 前端用户登录时携带当 ...

随机推荐

  1. WPF 札记

    今天在工程中发现了一个非常消耗CPU资源的过程---一个创建Popup并根据绑定的Collection填充ListBox的过程. 通过VS的性能诊断,最终确定的耗时过程锁定在了Popup.isOpen ...

  2. yum安装时出现:Cannot retrieve metalink for repository&colon; epel&period; Please verify its path and try again

    在CentOS 6.3 x86_64下安装php-mcrypt的时候出现了问题:Error: Cannot retrieve metalink for repository: epel. Please ...

  3. CLR via C&num;(15)--String,熟悉而又陌生

    好久没写文章了,再拿起这本书,学习加分享,乐趣无穷啊.这两天看了写关于字符串的知识,从学写代码的时候开始,我们就基本天天跟String打交道,对它再熟悉不过了.但是仔细看看,还是有一种拨开云雾的感觉, ...

  4. lintcode &colon; 二叉树的序列化和反序列化

    题目 二叉树的序列化和反序列化 设计一个算法,并编写代码来序列化和反序列化二叉树.将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”. 如何反序列化或序列化二叉树是没有限制 ...

  5. Python模块探秘之smtplib&comma;实现纯文本邮件的发送

    今天学到了如何使用Python的smtplib库发送邮件,中间也是遇到了各种各样的错误和困难,还好都一一的解决了.下面来谈一谈我的这段经历. 配置你的邮箱 为什么要配置邮箱呢?具体要配置什么呢? 因为 ...

  6. FCC(ES6写法) Validate US Telephone Numbers

    如果传入字符串是一个有效的美国电话号码,则返回 true. 思路:用正则,参考网上资料和js高级程序设计(5.4RegExp类型). let telephoneCheck = str => /^ ...

  7. 亲子编程玩Micro&colon;bit-动力小车&OpenCurlyDoubleQuote;麦昆”

    少儿编程之风已经吹进各大城市,编程猫.乐博机器人.童程童美等专业培训机构逐渐进入大家的视野,年龄段已经从K12逐渐降低到幼儿园中班.其实,少儿编程的门槛并不高,它不会让孩子一上手就去接触代码,而是会通 ...

  8. 自动化测试-15&period;selenium单选框与复选框状态判断

    本篇主要介绍单选框和复选框的操作 一.认识单选框和复选框 1.先认清楚单选框和复选框长什么样 2.各位小伙伴看清楚哦,上面的单选框是圆的:下图复选框是方的,这个是业界的标准,要是开发小伙伴把图标弄错了 ...

  9. echarts横向柱状图Demo

    echarts链接:http://gallery.echartsjs.com/editor.html?c=xByfdMz7mM 代码: option = { backgroundColor: 'bla ...

  10. UDP服务器

    用c#开发的一个UDP服务器.可以接收UDP的连接请求.给予响应. 代码已经上传至 GitHub,功能还会不断完善. 界面很丑.我很奇怪的是很少(到现在为止,我都没有见到过),所以界面一直做的不够酷炫 ...