传统登陆页面中包含两个输入项:
• 用户名
• 密码
有时为了防止机器人进行自动登陆操作,或者防止恶意用户进行用户信息扫描,需增加动态验证码功能。
此时,登陆页面中包含了三个输入项:
• 用户名
• 密码
• 验证码
结合前端以及后端(java),介绍一个简单的验证码功能实现。

首先介绍一下验证码的整体流程:

两个流程:1、生成验证码,2、验证验证码。

前端

前端的主要工作是从后端获取验证码,并在用户登录时,将验证码提交到后端。
此时,需要知道后端生成验证的url地址。
并且,还要在在登陆页面中,增加验证码的input和显示显示验证码的img。
利用jquery或者其他方式,实现验证码的获取和刷新。

<input type="text" name="checkCode" placeholder="验证码" />
<img id="checkCode_img" alt="点击刷新验证码" />
<script>
var getCodeUrl="/getCode";//获取验证码的后端地址
$('#checkCode_img').attr('src',getCodeUrl+'?t='+ new Date().getTime()).show();
$('#checkCode_img').click(function(){this.src=getCodeUrl+'?t='+ new Date().getTime();});
</script>

获取验证码时的时间参数,可有可无。
这样,在已有登陆页面的基础上,增加了验证码的显示以及输入区域了。
注意:其中/getCode是获取验证的后台地址。

后台

将地址/getCode映射到验证码绘制controller,在此controller中,利用BufferedImage类新建图片绘制的内存空间,使用BufferedImage.createGraphics()获取图片绘制的具体实例。
在图片绘制实例中,可以绘制多种线条和文字,同时可设置绘制时使用的颜色和字体。
在绘制线条和文字时,可进行画布的旋转。

使用java绘制具体可参考网络资料。
http://www.jb51.net/article/73136.htm
http://www.open-open.com/lib/view/open1413428178653.html

图片绘制完后,不要忘记进行dispose操作,释放资源。使用

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bi, "jpg", baos);
byte[] bytes = baos.toByteArray();

获取图片的二进制数据,并通过base64编码,传输给前端显示。
在验证码图片绘制的同时,后端可将绘制的文字,保存到session会话中,

request.getSession().setAttribute(codeKey, checkValue);

可在用户提交登录信息时,在登陆验证拦截器程序里面,可以获取到此用户会话中创建的验证码。

request.getSession().getAttribute(codeKey, checkValue);

为了保证在大规模web后端,依然可以使用验证码功能,需要多台web后端共享生成的验证码信息。
此时需要对后端验证码保存方式进行改造。
一种方式就是,为生成的验证码图片计算出一个哈希key来,并将key和验证码文字保存到集中式的缓存中,比如redis。
同时,传输给前端的数据增加一个参数,即验证码的key,前端还需要增加一个input保存此key值,在用户登陆时,将此key值一同提交到后端,完成验证码的验证流程。

web系统登陆页面增加验证码的更多相关文章

  1. 亿级Web系统搭建——单机到分布式集群

    当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压力带来问题,我们需要在Web系统架构层 ...

  2. 亿级Web系统搭建——单机到分布式集群[转]

    当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压力带来问题,我们需要在Web系统架构层 ...

  3. 【web】 亿级Web系统搭建——单机到分布式集群

      当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压力带来问题,我们需要在Web系统架 ...

  4. 很不错的文章---【问底】徐汉彬:亿级Web系统搭建——单机到分布式集群

    [导读]徐汉彬曾在阿里巴巴和腾讯从事4年多的技术研发工作,负责过日请求量过亿的Web系统升级与重构,目前在小满科技创业,从事SaaS服务技术建设. 大规模流量的网站架构,从来都是慢慢“成长”而来.而这 ...

  5. 徐汉彬:亿级Web系统搭建——单机到分布式集群(转载)

    文章转载自http://www.csdn.net/article/2014-11-06/2822529/1 当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的 ...

  6. 徐汉彬:亿级Web系统搭建—单机到分布式集群

    当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压力带来问题,我们需要在Web系统架构层 ...

  7. [转]亿级Web系统搭建:单机到分布式集群

    当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压力带来问题,我们需要在Web系统架构层 ...

  8. 【问底】徐汉彬:亿级Web系统搭建——单机到分布式集群

    http://www.csdn.net/article/2014-11-06/2822529/3 大规模流量的网站架构,从来都是慢慢"成长"而来.而这个过程中,会遇到很多问题,在不 ...

  9. 亿级 Web 系统搭建:单机到分布式集群

    本文内容 Web 负载均衡 HTTP 重定向 反向代理 IP 负载均衡 DNS 负载均衡 Web 系统缓存机制的建立和优化 MySQL 数据库内部缓存 搭建多台 MySQL 数据库 MySQL 数据库 ...

随机推荐

  1. linux 命令笔记

    linux 命令 创建目录 mkdir XX 列出目录 ls 进入目录 cd .. 进入上层目录 cd xx 进入xx目录 cd ~ 进入用户主目录 删除目录 rm -fr XX 清空目录,谨慎使用 ...

  2. UVALive 4849 String Phone(2-sat、01染色)

    题目一眼看去以为是4-sat... 题意:给n(n<=3000)个黑方块的坐标,保证黑方块没有公共边.对于每个黑方块选一个角作为结点,使得所选结点满足输入的一个无向图.其中距离为曼哈顿距离.输出 ...

  3. JAVA SSM 示例代码

    SSM 即spring+spring mvc+mybatis,开发工具IDEA 1.先看下项目结构如图: 2.主要配置文件 spring-mvc.xml <?xml version=" ...

  4. October 19th Week 43rd Wednesday, 2016

    I find that the harder I work, the more luck I seem to have. 越努力,越幸运. However, I find that the harde ...

  5. NYOJ题目27水池数目

    --------------------------------------------- 这道题有点坑,也怪我总是有点马虎,按照正常人的思维0是表示有水池啊竟然是1表示有水池,最坑的是写反了竟然还能 ...

  6. 【Java EE 学习 46】【Hibernate学习第三天】【多对多关系映射】

    一.多对多关系概述 以学生和课程之间的关系为例. 1.在多对多关系中涉及到的表有三张,两张实体表,一张专门用于维护关系的表. 2.多对多关系中两个实体类中应当分别添加对方的Set集合的属性,并提供se ...

  7. Myeclipse 运行maven控制台中文乱码

    需要在pom中的properties中增加一行配置: <properties> <argLine>-Dfile.encoding=UTF-8</argLine> & ...

  8. redis数据类型之—Hash

    (1)hash 简单介绍 hash类型适合存储对象,字段值只能是字符串,不支持其他数据类型. (2)hash 常用命令 // 增加hash属性值 > hset user: name zm (in ...

  9. html学习第二天—— 第七章——CSS样式基本知识

    外部式css样式,写在单独的一个文件中外部式css样式(也可称为外联式)就是把css代码写一个单独的外部文件中,这个css样式文件以“.css”为扩展名,在<head>内(不是在<s ...

  10. (iOS)Base64加密和DES加密、以及JAVA和iOS中DES加密统一性问题

    我们在项目中为了安全方面的考虑,通常情况下会选择一种加密方式对需要安全性的文本进行加密,而Base64加密和DES64加密是常用的加密算法.我记得我在前一个项目中使用的就是这两种加密算法的结合:Bas ...