基于springMVC的汉字与数学计算的图片验证码
@RequestMapping(value = URLConsts.UserLoginH5Controller.GET_CODE)
public void getCode(HttpServletRequest req, HttpServletResponse response)
throws IOException {
//设置页面不缓存
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg");
// 在内存中创建图象
int width = 120, height = 30;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 获取图形上下文
Graphics2D g = (Graphics2D) image.getGraphics();
//生成随机类
Random random = new Random();
// 设定背景色
g.setColor(getRandColor(240, 250));
g.fillRect(0, 0, width, height);
/*GraphicsEnvironment graph = GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] fontFamilies = graph.getAvailableFontFamilyNames();
for (String s : fontFamilies) {
System.out.println(s);
}*/
//这里很重要 你的环境里所拥有的汉字字体 不然汉字会乱码
Font font = new Font("宋体", Font.PLAIN, 25);
// //设定字体
g.setFont(font);
// 随机产生90条干扰线,更改getRandColor()方法中的参数可以改变干扰线的粗细程度
g.setColor(getRandColor(90, 230));
for (int i = 0; i < 90; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(1200);
int yl = random.nextInt(1200);
g.drawLine(x, y, x + xl, y + yl);
}
//验证码,由2个一位数的加减乘三种运算法构成
int num1 = (int)(Math.random() * 10)+1;
int num2 = (int)(Math.random() * 10)+1;
int funNo = random.nextInt(3); //产生[0,2]之间的随机整数
String funMethod = "";
int result =0;
switch (funNo) {
case 0: funMethod = "加"; result = num1 + num2; break;
case 1: funMethod = "减"; result = (num1 - num2)>0?(num1 - num2):(num2 - num1); break;
case 2: funMethod = "乘"; result = num1 * num2; break;
}
String calc = funMethod=="减"?((num1-num2)>0?(num1 + funMethod+ num2 + "=?"):(num2 + funMethod + num1 + "=?")):(num1 + funMethod + num2 + "=?");
g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
FontRenderContext context = g.getFontRenderContext();
Rectangle2D bounds = (font).getStringBounds(calc, context);
double x = (width - bounds.getWidth()) / 2;
double y = (height - bounds.getHeight()) / 2;
double ascent = -bounds.getY();
double baseY = y + ascent;
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g.drawString(calc, (int)x, (int) baseY);
// 将生成的验证码存入SESSION
HttpSession session = req.getSession();
LOG.info("生成验证码[{}],结果为:[{}]",calc,result);
session.setAttribute("certCode", String.valueOf(result));
// 图象生效
g.dispose();
// 输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream());
response.getOutputStream().flush();
response.getOutputStream().close();
}
/**
* 验证码校验
* @param code
* @return
*/
@RequestMapping(value = URLConsts.UserLoginH5Controller.CHECK_CODE)
@ResponseBody
public String getCode(String code){
Object s=getSession().getAttribute("certCode");
Map<String, Object> outMap = new HashMap<String, Object>();
if(CheckUtil.isNotEmpty(s)){
if(s.toString().equals(code)){
outMap.put("isOk", "ok");
return buildJsonResp(outMap);
}else{
outMap.put("isOk", "no");
}
}else{
outMap.put("isOk", "emptyCode");
}
return buildJsonResp(outMap);
}
jsp页面验证码:
<img id="imgObj" name="verifycode" width="120" height="50" alt="看不清" οnclick="getCode()" />
javaScript:
function getCode() {
$("#index_code").val("");
var url = ctx()+"/h5/user/getCode?timestamp="+(new Date()).valueOf();
$("#imgObj").attr("src", url);
}
function checkCode() {
if($("#codes").is(':hidden')){
return;
}
$.ajax({
type : "get",
async: true,
url :'${ctx}/h5/user/checkCode',
data : {
code:$("#index_code").val(),
},
dataType : 'json',
success : function(data) {
if(data.isOk=="ok"){
alert("验证码正确");
}
else{
alert("验证码错误");
getCode();
}
}
});
}
图形效果如下:
转载于:https://www.cnblogs.com/rongguanghai-9527/p/6197176.html
基于springMVC的汉字与数学计算的图片验证码相关推荐
- python神经网络库识别验证码_基于TensorFlow 使用卷积神经网络识别字符型图片验证码...
本项目使用卷积神经网络识别字符型图片验证码,其基于TensorFlow 框架.它封装了非常通用的校验.训练.验证.识别和调用 API,极大地减低了识别字符型验证码花费的时间和精力. 项目地址:http ...
- 数学计算软件(Matlab、Mathematica)网页版
有时候会用到Matlab及Mathematica的数值计算或者符号计算功能,但是去安装一下太麻烦,而且毕竟不是常用,所以有了这样的需求. 在网上搜了下,发现真没这样的网站,可能也涉及到版权的问题,所以 ...
- 直扩 单音干扰抑制 matlab,数学计算软件MATLAB资料集锦分享
数学计算软件MATLAB资料集锦分享 (2014-08-20 17:07:08) 标签: matlab 数学建模 仿真模拟 整理了一些有关MATLAB资料如下: 1.H型可逆PWM变换器的控制方式解析 ...
- C/C++数学计算库
c/c++数学计算库,他们基本上都是开源的,你完全不必担心版权问题,他们都是一些自由软件,你要做的仅仅是仔细阅读他们的授权协议确保不要滥用就可以了: 计算几何算法库 CGAL CGAL ,计算几何算法 ...
- CSharpGL(54)用基于图像的光照(IBL)来计算PBR的Specular部分
CSharpGL(54)用基于图像的光照(IBL)来计算PBR的Specular部分 接下来本系列将通过翻译(https://learnopengl.com)这个网站上关于PBR的内容来学习PBR(P ...
- PHP运算口诀,超级实用的数学计算知识顺口溜
超级实用的数学计算知识顺口溜: 一.20以内进位加法 看大数,分小数,凑整十,加零头. (掌握"凑十法",提倡"递推法".) 二.20以内退位减法 20以内退位 ...
- GIS开发:地图中的数学计算(Mercator)
引言 在地图的开发中,会涉及到各种的数学计算,比如距离.角度计算等,经纬度坐标系的情况下,地图使用的坐标是经纬度的形式,单位是度,而计算距离的时候,结果是米制单位,这就需要其中有一个转换,或者存在对应 ...
- 【转载】常见的C++数学计算库
转载来源: https://blog.csdn.net/panhao762/article/details/55276811 作为理工科学生,想必有限元分析.数值计算.三维建模.信号处理.性能分析.仿 ...
- Python语音计算器——通过语音输入实现数学计算(附完整源代码)
Python语音计算器--通过语音输入实现数学计算(附完整源代码) 随着人工智能技术的不断进步,语音识别技术变得越来越成熟,我们可以利用这项技术实现很多有趣的应用.本文将会介绍一个基于Python和语 ...
最新文章
- 敏捷之父Martin Fowler作序推荐《演进式架构》
- 因果解释能够对规则进行解释吗?
- Elmah 日志记录组件
- 机器视觉:图像与视频朝向检测
- 关于分页插件PageHelper不起作用的问题
- C++ auto关键字
- 一个月按多少天计算日工资合理
- 解决 spring-cloud-starter-zipkin 启动错误
- 利用stat命令获取Linux文件系统和文件的详细状态信息
- Gitlab Merge Request Builder Plugin 配置小记
- LeetCode 785. 判断二分图(染色法)
- ab plc编程软件_AB编程软件及所有组态软件授权及安装教程包含FTViewV11
- 对int array进行排序
- 如何在三层交换机上实现跨VLAN 的DHCP配置
- 环境监测设备中,使用GPS模拟器测试TTFF和灵敏度的注意点
- 计算机建立excel文件,用Excel建立数据库 -电脑资料
- gstreamer插件指南
- 推荐一款可自创外星文字的工具
- 【论文阅读】利用深度自编码器神经网络预测药物相似度
- HTML网页设计制作大作业(div+css) ~ 中华美德6页面带音乐 ~ 学生网页设计作业源码(中华文化)
热门文章
- python3.4编程_python编程:从入门到实践习题3-4~3-7
- mysql count or null_为什么在对带有条件的行进行计数时,为什么在MySQL中需要“ OR NULL”...
- shell 获取ora报错信息_带你了解企业是如何编写脚本的-第2篇:Shell脚本规范
- python第一单元测试,知到Python语言应用第一单元章节测试答案
- 去掉java文件中的注释_利用JavaParser去除java文件中的注释
- vue中使用原始html插值,VUE.JS中的插值表达式、v-cloak、v-text、v-html、v-bind:、v-on:...
- java对接支付宝微信银联_经典设计模式之策略模式【如何重构聚合支付平台,对接【支付宝,微信,银联支付】】(示例代码)...
- python怎么调用navicat_图中的这个功能应该怎么用Python实现啊?
- linux ip addr peer,CentOS 7 设置网络IP地址
- java httpost阻塞_httpclient发送get请求阻塞?