本文实现基于spring mvc的图片验证码,分后台代码和前端页面的展现以及验证码的验证。

首看后台实现代码:

@RequestMapping({"authCode"})

public void getAuthCode(HttpServletRequest request, HttpServletResponse response,HttpSession session)
throws IOException {

int width = 63;

int height = 37;

Random random = new Random();

//设置response头信息

//禁止缓存

response.setHeader("Pragma", "No-cache");

response.setHeader("Cache-Control", "no-cache");

response.setDateHeader("Expires", 0);

//生成缓冲区image类

BufferedImage image = new BufferedImage(width, height, 1);

//产生image类的Graphics用于绘制操作

Graphics g = image.getGraphics();

//Graphics类的样式

g.setColor(this.getRandColor(200, 250));

g.setFont(new Font("Times New Roman",0,28));

g.fillRect(0, 0, width, height);

//绘制干扰线

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

g.setColor(this.getRandColor(130, 200));

int x = random.nextInt(width);

int y = random.nextInt(height);

int x1 = random.nextInt(12);

int y1 = random.nextInt(12);

g.drawLine(x, y, x + x1, y + y1);

}

//绘制字符

String strCode = "";

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

String rand = String.valueOf(random.nextInt(10));

strCode = strCode + rand;

g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));

g.drawString(rand, 13*i+6, 28);

}

//将字符保存到session中用于前端的验证

session.setAttribute("strCode", strCode);

g.dispose();

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

response.getOutputStream().flush();

}

创建生成颜色的方法

//创建颜色

Color getRandColor(int fc,int bc){

Random random = new Random();

if(fc>255)

fc = 255;

if(bc>255)

bc = 255;

int r = fc + random.nextInt(bc - fc);

int g = fc + random.nextInt(bc - fc);

int b = fc + random.nextInt(bc - fc);

return new Color(r,g,b);

}

前端代码

<form action="toLogin.do" id="loginUser" method="post">

<div class="form-group">

姓名:<input id="name" name="name" type="text"/>

</div>

<div class="form-group">

密码:<input id="password" name="password" type="password"/>

</div>

<div class="form-group">

验证码:<input id="authCode" name="authCode" type="text"/>

<!--这里img标签的src属性的值为后台实现图片验证码方法的请求地址-->

<label><img type="image" src="authCode.do" id="codeImage" onclick="chageCode()" title="图片看不清?点击重新得到验证码" style="cursor:pointer;"/></label>

<label><a onclick="chageCode()">换一张</a></label>

</div>

<input type="button" class="btn btn-default" onclick="subm()" value="登录"/>

</form>

实现点击图片更换验证码的js方法

    function chageCode(){

$('#codeImage').attr('src','authCode.do?abc='+Math.random());//链接后添加Math.random,确保每次产生新的验证码,避免缓存问题。

}

提交时的表单验证代码

页面加载时行成表单验证对象

$("#loginUser").validate({

rules:{

name:{ required:true},

password:{required:true},

authCode:{required:true,checkCode:true}

},

messages:{

name:{required:"姓名不能为空"},

password:{required:"密码不能为空"},

authCode:{required:"验证码不能为空"}

}

});

然后添加自定义的验证码验证方法

jQuery.validator.addMethod("checkCode", function(value, element) {

var strCode = ${strCode!""};//这里用的freemarke取到后台保存在session中的验证码字符。

var inpCode = $('#authCode').val();

if(strCode==""||strCode == null){

chageCode();

//用后台的字符与页面输入的验证码进行比较

}else if(inpCode == strCode){

return true;

}else{

return false;

}

}, "验证码不正确");

效果图

进行表单验证效果图



基于spring mvc的图片验证码实现的更多相关文章

  1. 基于Spring MVC的Web应用开发(三) - Resources

    基于Spring MVC的Web应用开发(3) - Resources 上一篇介绍了在基于Spring MVC的Web项目中加入日志,本文介绍Spring MVC如何处理资源文件. 注意到本项目的we ...

  2. 基于Spring MVC 实现拦截器

    Spring MVC 拦截器 一,具体内容: 在所有的开发之中拦截器属于一个重要的组件,可以说几乎所有的项目都会提供的概念应用,不管是Spring MVC,还是Struts 2.x都是提供有拦截器的, ...

  3. MVC之图片验证码

    MVC之图片验证码 controller中的action方法public ActionResult GetValidateCode() { ValidateCode vCode = new Valid ...

  4. Spring MVC第一课:用IDEA构建一个基于Spring MVC, Hibernate, My SQL的Maven项目

    作为一个Spring MVC新手最基本的功夫就是学会如何使用开发工具创建一个完整的Spring MVC项目,本文站在一个新手的角度讲述如何一步一步创建一个基于Spring MVC, Hibernate ...

  5. spring mvc生成注册验证码

    通过Spring MVC为系统添加验证码 1:布局登陆页面,用户名,密码,填写验证码的文本框,及验证码的图片及点击换图 <%@ taglib prefix="c" uri=& ...

  6. 基于Spring Mvc实现的Excel文件上传下载

    最近工作遇到一个需求,需要下载excel模板,编辑后上传解析存储到数据库.因此为了更好的理解公司框架,我就自己先用spring mvc实现了一个样例. 基础框架 之前曾经介绍过一个最简单的spring ...

  7. 基于Spring Boot的图片上传

    package com.clou.inteface.domain.web.user; import java.io.File; import java.io.IOException; import j ...

  8. 如何开始创建第一个基于Spring MVC的Controller

    万事开头难,良好的开端是成功的一半! 以下示例怎么开始创建我们的第一个Spring MVC控制器Controller 1.新建一个java类,命名为:MyFirstController,包含以下代码, ...

  9. 基于spring mvc的注解DEMO完整例子

    弃用了struts,用spring mvc框架做了几个项目,感觉都不错,而且使用了注解方式,可以省掉一大堆配置文件.本文主要介绍使用注解方式配置的spring mvc,之前写的spring3.0 mv ...

随机推荐

  1. canvas一周一练 -- canvas基础学习

    从上个星期开始,耳朵就一直在生病,里面长了个疙瘩,肿的一碰就疼,不能吃饭不能嗨 (┳_┳)……在此提醒各位小伙伴,最近天气炎热,一定要注意防暑上火,病来如山倒呀~ 接下来我正在喝着5块一颗的药学习ca ...

  2. .net 类型转换

    在.net  平台下类型有两种方式可以进行类型转换,强转或as转换.(有的说法是两种方式都进行强转,有两种强转方式). 如:typeA objA = (typeA)objB 或者使用另一种typeA ...

  3. 为何你跟着滴滴D8级前端大神撸代码,技术却依旧原地踏步?

    引子 听说最近有很多小伙伴,热衷于在慕课网上学习各种前端实战教程,并以完成项目为奋斗目标.比如本文接下来要提到的<Vue2.0高级实战之开发移动端音乐App>,这门课程的传授者是来自滴滴D ...

  4. python基础(6):列表和字典类型

    前面我们所接触的数据类型都是存单个值,今天我们来看看可以存多个值的列表和字典. 预习: 1.有列表data=['alex',49,[1900,3,18]],分别取出列表中的名字,年龄,出生的年,月,日 ...

  5. Python之MRO及其C3算法

    [<class '__main__.B'>, <class '__main__.A'>, <class 'object'>] (<class '__main_ ...

  6. [luogu P3787][新创无际夏日公开赛] 冰精冻西瓜 [树状数组][dfs序]

    题目背景 盛夏,冰之妖精琪露诺发现了一大片西瓜地,终于可以吃到美味的冻西瓜啦. 题目描述 琪露诺是拥有操纵冷气程度的能力的妖精,一天她发现了一片西瓜地.这里有n个西瓜,由n-1条西瓜蔓连接,形成一个有 ...

  7. docker~docker-compose和VS解决方案的关系

    回到目录 一般地,我们在VS里添加了一个解决方案之后,会更新模块或者业务添加多个api,web项目,这类似于最近说的微服务,而我们的docker-compose与微软件正好有了一种默契,当你为你的解决 ...

  8. hashcode-equals方法

    package com.charles.collection; import java.util.HashSet; import java.util.Set; public class Point { ...

  9. oracle-plsql序列问题

    场景:用来汇总工作中数据库的异常问题! 1 问题 序列在会话中未定义 解决: 创建Sequence后直接查询它的当前值(CURRVAL)会出错,要先调用Sequence对象.NEXTVAL,才能查询当 ...

  10. bazel 测试过程

    google的bazel如日中天,尽管我觉得make已经很好用,但是还是尝试一下,记录之. 首先,从 https://github.com/bazelbuild/bazel/releases 下载对应 ...