关于java 图形验证码的解决方法
发布时间:2023-08-09 15:21:19
package cn.response;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class validatePicture extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
validateimage(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
public static final int WIDTH = 120;
public static final int HEIGHT = 25;
public void validateimage(HttpServletRequest request,
HttpServletResponse response) throws Exception {
BufferedImage bi = new BufferedImage(WIDTH, HEIGHT,
BufferedImage.TYPE_INT_RGB);// 在内存中构建一幅图象
Graphics g = bi.getGraphics();
setBackGround(g);// 设置背景色
setBorder(g);// 设置边框
drawRandomLine(g);// 画干扰线
String random = drawRandomNum((Graphics2D) g);// 写随机数
request.getSession().setAttribute("random", random);
//request.getSession(false);
response.setContentType("image/jpeg");
// 设置不要缓存
response.setDateHeader("expries", -1);
response.setHeader("Cache-Control", "no-cache");
ImageIO.write(bi, "jpg", response.getOutputStream());
}
private String drawRandomNum(Graphics2D g) {
g.setColor(Color.RED);
g.setFont(new Font("宋体", Font.BOLD, 20));
// [\u4e00-\u9fa5]中文数字区间
String base = "\u4e00\u4f00\u5e00\u4e50\u4e89\u4f10\u4e09";
StringBuffer sb = new StringBuffer();
int x = 5;
for (int i = 0; i < 4; i++) {
int degree = new Random().nextInt() % 30;
String ch = base.charAt(new Random().nextInt(base.length())) + "";
sb.append(ch);
g.rotate(degree * Math.PI / 180, x, 20);
g.drawString(ch, x, 20);
g.rotate(-degree * Math.PI / 180, x, 20);
x = x + 30;
}
System.out.println(sb.toString());
return sb.toString();
}
private void drawRandomLine(Graphics g) {
g.setColor(Color.GREEN);
for (int i = 0; i < 3; i++) {
int x1 = new Random().nextInt(WIDTH);
int y1 = new Random().nextInt(HEIGHT);
int x2 = new Random().nextInt(WIDTH);
int y2 = new Random().nextInt(HEIGHT);
g.drawLine(x1, y1, x2, y2);
}
}
private void setBorder(Graphics g) {
g.setColor(Color.BLUE);
g.drawRect(1, 1, WIDTH - 2, HEIGHT - 2);
}
private void setBackGround(Graphics g) {
g.setColor(Color.WHITE);
g.fillRect(0, 0, WIDTH, HEIGHT);
}
}


猜你喜欢
- 目录首先,写一个需求文档:一、登录界面1.界面2.登录3.退出二、开始游戏界面三、缓冲加载游戏界面四、游戏主界面五、结束界面上代码首先,写一
- 引言大家应该都知道,对Excel表格设置分页对我们预览、打印文档时是很方便的,特别是一些包含很多复杂数据的、不规则的表格,为保证打印时每一页
- 前言用过Spring的人多多少少也都用过@Async注解,至于作用嘛,看注解名,大概能猜出来,就是在方法执行的时候进行异步执行。一、如何使用
- JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现。获取文件MD5值主要分为
- 如何实现 WPF 代码查看器控件框架使用.NET40;Visual Studio 2019;代码展示需要使用到AvalonEdit是基于WP
- 本篇文章主要介绍了java自动生成编号的实现,分享给大家,具体如下/** * 自动生成编号格式:yyMM+四位流水号 */ @Reques
- Struct的理论看过好一些,可是工作上基本没有应用过,Class倒处处都有。难道Struct就没有什么使用价值吗?搜了一下如何在类和结构中
- 本文实例为大家分享了Unity实现VR中在黑板上写字的具体代码,供大家参考,具体内容如下一、工具1.开发用的是Unity 5.6.2版本2.
- 本文实例为大家分享了六种Android常见控件的使用方法,供大家参考,具体内容如下1、TextView 主要用于界面上显示一段文本
- 本文实例分析了C#中Convert.ToString和ToString的区别,对于初学者来说是很有必要加以熟练掌握的。具体分析如下:1.Co
- 记一下学习单例模式的笔记:单例就是要保证该类仅有一个实例。实现完全封闭的单例(外部不能new)其实就要两点要求:全局访问:需要一个该类型的全
- 如有错误,望指正;SpringBoot可以有三种方式定义初始化器,来为容器中增加自定义的对象,具体如下:1、定义在spring.factor
- 本文实例为大家分享了android实现蓝牙app的具体代码,供大家参考,具体内容如下private BluetoothGatt blueto
- 目录前言开始总结前言小伙伴们都知道,现在市面上最流行的web开发框架就是springboot了,在springboot开始流行之前,我们都用
- spring boot是个好东西,可以不用容器直接在main方法中启动,而且无需配置文件,方便快速搭建环境。可是当我们要同时启动2个spri
- 1. LongAdder和AtomicLong类似的使用方式,但是性能比AtomicLong更好。LongAdder与AtomicLong都
- 一、简介我们在线程编程的时候往往会涉及到线程的通信,通过信号的接受来进行线程是否阻塞的操作。AutoResetEvent 允许线程通过发信号
- 问题换了台开发机,重新安装了下开发环境。突然发现Visual Studio Code无法用来调试Unity了。明明流程都是按照Unity官方
- MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoD
- 首先是创建redis-cluster文件夹:因为redis最少需要6个节点(三主三从),为了更好的理解,我这里创建了两台虚拟机(192.16