@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的汉字与数学计算的图片验证码相关推荐

  1. python神经网络库识别验证码_基于TensorFlow 使用卷积神经网络识别字符型图片验证码...

    本项目使用卷积神经网络识别字符型图片验证码,其基于TensorFlow 框架.它封装了非常通用的校验.训练.验证.识别和调用 API,极大地减低了识别字符型验证码花费的时间和精力. 项目地址:http ...

  2. 数学计算软件(Matlab、Mathematica)网页版

    有时候会用到Matlab及Mathematica的数值计算或者符号计算功能,但是去安装一下太麻烦,而且毕竟不是常用,所以有了这样的需求. 在网上搜了下,发现真没这样的网站,可能也涉及到版权的问题,所以 ...

  3. 直扩 单音干扰抑制 matlab,数学计算软件MATLAB资料集锦分享

    数学计算软件MATLAB资料集锦分享 (2014-08-20 17:07:08) 标签: matlab 数学建模 仿真模拟 整理了一些有关MATLAB资料如下: 1.H型可逆PWM变换器的控制方式解析 ...

  4. C/C++数学计算库

    c/c++数学计算库,他们基本上都是开源的,你完全不必担心版权问题,他们都是一些自由软件,你要做的仅仅是仔细阅读他们的授权协议确保不要滥用就可以了: 计算几何算法库 CGAL CGAL ,计算几何算法 ...

  5. CSharpGL(54)用基于图像的光照(IBL)来计算PBR的Specular部分

    CSharpGL(54)用基于图像的光照(IBL)来计算PBR的Specular部分 接下来本系列将通过翻译(https://learnopengl.com)这个网站上关于PBR的内容来学习PBR(P ...

  6. PHP运算口诀,超级实用的数学计算知识顺口溜

    超级实用的数学计算知识顺口溜: 一.20以内进位加法 看大数,分小数,凑整十,加零头. (掌握"凑十法",提倡"递推法".) 二.20以内退位减法 20以内退位 ...

  7. GIS开发:地图中的数学计算(Mercator)

    引言 在地图的开发中,会涉及到各种的数学计算,比如距离.角度计算等,经纬度坐标系的情况下,地图使用的坐标是经纬度的形式,单位是度,而计算距离的时候,结果是米制单位,这就需要其中有一个转换,或者存在对应 ...

  8. 【转载】常见的C++数学计算库

    转载来源: https://blog.csdn.net/panhao762/article/details/55276811 作为理工科学生,想必有限元分析.数值计算.三维建模.信号处理.性能分析.仿 ...

  9. Python语音计算器——通过语音输入实现数学计算(附完整源代码)

    Python语音计算器--通过语音输入实现数学计算(附完整源代码) 随着人工智能技术的不断进步,语音识别技术变得越来越成熟,我们可以利用这项技术实现很多有趣的应用.本文将会介绍一个基于Python和语 ...

最新文章

  1. 敏捷之父Martin Fowler作序推荐《演进式架构》
  2. 因果解释能够对规则进行解释吗?
  3. Elmah 日志记录组件
  4. 机器视觉:图像与视频朝向检测
  5. 关于分页插件PageHelper不起作用的问题
  6. C++ auto关键字
  7. 一个月按多少天计算日工资合理
  8. 解决 spring-cloud-starter-zipkin 启动错误
  9. 利用stat命令获取Linux文件系统和文件的详细状态信息
  10. Gitlab Merge Request Builder Plugin 配置小记
  11. LeetCode 785. 判断二分图(染色法)
  12. ab plc编程软件_AB编程软件及所有组态软件授权及安装教程包含FTViewV11
  13. 对int array进行排序
  14. 如何在三层交换机上实现跨VLAN 的DHCP配置
  15. 环境监测设备中,使用GPS模拟器测试TTFF和灵敏度的注意点
  16. 计算机建立excel文件,用Excel建立数据库 -电脑资料
  17. gstreamer插件指南
  18. 推荐一款可自创外星文字的工具
  19. 【论文阅读】利用深度自编码器神经网络预测药物相似度
  20. HTML网页设计制作大作业(div+css) ~ 中华美德6页面带音乐 ~ 学生网页设计作业源码(中华文化)

热门文章

  1. python3.4编程_python编程:从入门到实践习题3-4~3-7
  2. mysql count or null_为什么在对带有条件的行进行计数时,为什么在MySQL中需要“ OR NULL”...
  3. shell 获取ora报错信息_带你了解企业是如何编写脚本的-第2篇:Shell脚本规范
  4. python第一单元测试,知到Python语言应用第一单元章节测试答案
  5. 去掉java文件中的注释_利用JavaParser去除java文件中的注释
  6. vue中使用原始html插值,VUE.JS中的插值表达式、v-cloak、v-text、v-html、v-bind:、v-on:...
  7. java对接支付宝微信银联_经典设计模式之策略模式【如何重构聚合支付平台,对接【支付宝,微信,银联支付】】(示例代码)...
  8. python怎么调用navicat_图中的这个功能应该怎么用Python实现啊?
  9. linux ip addr peer,CentOS 7 设置网络IP地址
  10. java httpost阻塞_httpclient发送get请求阻塞?