文档章节

验证码验证功能

xjcyxyx
 xjcyxyx
发布于 2014/06/10 15:08
字数 702
阅读 1164
收藏 13
点赞 0
评论 1
  • JSP

JSP页面实现验证码输出


验证码:<input type="text" id="randomCode" name="randomCode" value="" maxlength="4">
 <img id="randomCodeImg" src="randomCodeServlet" alt="看不清?点击更换" style="cursor:hand;" onClick="refreshRandomCode()"/>
 <a id="nview" href="#" onClick="refreshRandomCode()" class="left">看不清?</a>



js实现切换验证码



<script type="text/javascript">
function refreshRandomCode(){ 
  $("#randomCodeImg").attr("src","randomCodeServlet?time="+new Date());
 }
</script>


  • Servlet


<!--randomCode -->
 <servlet>
  <servlet-name>randomCodeServlet</servlet-name>
  <servlet-class>com.mp.platform.web.servlet.RandomCodeServlet</servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>randomCodeServlet</servlet-name>
  <url-pattern>/randomCodeServlet</url-pattern>
 </servlet-mapping>


  • Java

Util类:RandomCodeServlet.java

package com.mp.platform.web.servlet;

import java.awt.Color;
import java.awt.Font;
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.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;

/**
 * @描述: 用于生成随机验证码
 */
public class RandomCodeServlet extends HttpServlet
{
	
	private static final long serialVersionUID = 1L;
	
	
	@SuppressWarnings("unused")
	private static Logger logger = Logger.getLogger(RandomCodeServlet.class);
	
	
	private int width = 60;// 图片宽度
	
	
	private int height = 20;// 图片高度
	
	
	private int codeCount = 4;// 验证码个数
	
	
	private int x = 0;
	
	
	private int fontHeight;// 字体高度
	
	
	private int codeY;
	
	
	char[] codeSequence =
	{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
	
	
	
	
	/**
	 * 初始化图片属性
	 */
	public void init() throws ServletException
	{
		// 读取web.xml获取初始信息
		String sWidth = getInitParameter("width");
		String sHeight = getInitParameter("height");
		String sCodeCount = getInitParameter("codeCount");
		
		try
		{
			if (sWidth != null && sWidth.length() > 0)
			{
				width = Integer.parseInt(sWidth);
			}
			if (sHeight != null && sHeight.length() > 0)
			{
				height = Integer.parseInt(sHeight);
			}
			if (sCodeCount != null && sCodeCount.length() > 0)
			{
				codeCount = Integer.parseInt(sCodeCount);
			}
		}
		catch (Exception ex)
		{
			ex.printStackTrace();
		}
		
		x = width / (codeCount + 1);
		fontHeight = height - 2;
		codeY = height - 4;
	}
	
	
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException,
	        IOException
	{
		// 定义图像buffer
		BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		Graphics2D g = buffImg.createGraphics();
		
		
		// 创建一个随机数生成器类
		Random random = new Random();
		
		
		// 将图像填充为白色
		g.setColor(Color.WHITE);
		g.fillRect(0, 0, width, height);
		
		
		// 创建字体,字体的大小应该根据图片的高度来定。
		Font font = new Font("Fixedsys", Font.PLAIN, fontHeight);
		// 设置字体。
		g.setFont(font);
		
		
		// 画边框。
		g.setColor(Color.BLACK);
		g.drawRect(0, 0, width - 1, height - 1);
		
		
		// 随机产生20条干扰线,使图象中的认证码不易被其它程序探测到。
		g.setColor(Color.BLACK);
		for (int i = 0; i < 0; i++)
		{
			int x = random.nextInt(width);
			int y = random.nextInt(height);
			int xl = random.nextInt(12);
			int yl = random.nextInt(12);
			g.drawLine(x, y, x + xl, y + yl);
		}
		
		
		// randomCode用于保存随机产生的验证码,以便用户登录后进行验证。
		StringBuffer randomCode = new StringBuffer();
		int red = 0, green = 0, blue = 0;
		
		
		// 随机产生codeCount数字的验证码。
		for (int i = 0; i < codeCount; i++)
		{
			// 得到随机产生的验证码数字。
			String strRand = String.valueOf(codeSequence[random.nextInt(10)]);
			// 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。
			red = random.nextInt(255);
			green = random.nextInt(255);
			blue = random.nextInt(255);
			
			
			// 用随机产生的颜色将验证码绘制到图像中。
			g.setColor(new Color(red, green, blue));
			g.drawString(strRand, (i + 0.5f) * x, codeY);
			
			
			// 将产生的四个随机数组合在一起。
			randomCode.append(strRand);
		}
		
		
		// 将四位数字的验证码保存到Session中。
		HttpSession session = request.getSession();
		session.setAttribute("randomCode", randomCode.toString());
		
		
		// 禁止图像缓存。
		response.setHeader("Pragma", "no-cache");
		response.setHeader("Cache-Control", "no-cache");
		response.setDateHeader("Expires", 0);
		
		response.setContentType("image/jpeg");
		
		
		// 将图像输出到Servlet输出流中。
		ServletOutputStream sos = response.getOutputStream();
		ImageIO.write(buffImg, "jpeg", sos);
		sos.close();
		
	}
}



然后比较获取输入的验证码和从session获取的验证码是否一致

String randomCode = request.getParameter("randomCode");
randomCode.equals(request.getSession().getAttribute("randomCode"))

© 著作权归作者所有

共有 人打赏支持
xjcyxyx
粉丝 5
博文 28
码字总数 4019
作品 0
杨浦
高级程序员
加载中

评论(1)

isam
isam
验证码最好放到cookie里面就好了,用不着session。
php利用云片网实现短信验证码功能

本文将以php举例,介绍网页短信验证码功能的实现。 在众多的第三方短信服务商中我选择了云片网这个短信服务商,本文也将尽可能利用最简单的方式去帮助广大开发者解决短信验证码功能模块的实现...

爱前端的小白
2017/11/17
0
0
CCaptchaAction,Yii中的验证码工具bug修复方案

前段时间做登陆功能,涉及到了一个验证码的插件。想到Yii框架自带的一个CCaptcha的扩展,轻松许多。 1、先用CActiveForm做了个登陆的表单, 2、然后往里面添加一个CCaptcha的widget <dl clas...

wedv
2014/02/23
0
0
急!短信验证码验证问题

忘记密码功能时要用到手机验证码的功能, 用户申请找回密码,APP服务器后台产生一个验证码并设置有效期为5分钟,把验证码发回用户,用户输入验证码后, 接下来是由APP端去验证验证码的是否超...

xiejunbo
2014/12/12
1K
10
SpringBoot集成Spring Security(4)——自定义表单登录

通过前面三篇文章,应该大致了解了Spring Security的流程。你应该发现了,真正的登录请求是由Spring Security帮我们处理的,那么我们如何实现自定义表单登录呢,比如添加一个验证码… 源码地...

yuanlaijike
05/09
0
0
节日活动季安全指南 | 八招应对短信验证码攻击

如今,大量的网站、网站、手机app都在使用短信验证码作为验证用户身份的安全技术措施。尤其在年底,企业的促销、抽奖、互动活动会迎来一个高峰期,用到短信验证码的场景非常频繁。 但近期,阿...

云安全2016
01/08
0
0
世纪互联版Office 365 MFA配置

Azure 多重身份验证 (MFA) 是 Microsoft 的双重验证解决方案,在国际版Office 365很早就可以实现,但是世纪互联版Office 365上该功能一直未更新。最近在研究世纪互联版Office 365时,发现此功...

ljb_job
2017/04/11
0
0
Web安全指南 | 八招应对短信验证码攻击

如今,大量的网站、网站、手机app都在使用短信验证码作为验证用户身份的安全技术措施。尤其在年底,企业的促销、抽奖、互动活动会迎来一个高峰期,用到短信验证码的场景非常频繁。 但近期,阿...

正禾
03/12
0
0
TODO:Laravel增加验证码

TODO:Laravel增加验证码 1. 先聊聊验证码是什么,有什么作用? 验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和...

OneTODO
2016/12/22
37
0
cas添加验证码

cas添加验证码,折腾了好久,终于整理好了,很大部分都是借鉴http://binghejinjun.iteye.com/blog/1255293这个的。但是他的有一个很不好的地方就是不能提升验证码错误! 红色字体的为我添加的...

毛爷爷夸我帅
2016/06/15
26
0
手机短信验证微服务--SmsCode

SmsCode 这是什么 专为需要【手机短信验证码】使用场景而设计的微服务(Micro service),如:用户注册、找回密码、用户身份验证、验证码登录等等。 为什么要造这个轮子 首先我没有找到已实现这...

luo_yongyao
2017/02/06
4.3K
4

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JAVA知识点随心记

1.Switch case具体的支持类型? Q:支持byte、short、char、int基本类型,枚举类型和String类型(JDK7以上支持),四种基本类型的包装类型也支持,但是原因在于触发了自动拆箱,将包装类型拆成了基本...

勤奋的蚂蚁
13分钟前
0
0
NoSQL

一、NoSQL介绍 NoSQL属于非关系型数据,mysql属于关系型数据库。 对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当数据量非常大的时候...

人在艹木中
18分钟前
0
0
第17章MySQL主从配置

mysql安装总结 mysql主从准备工作: 准备两台机器,每台机器安装msyql服务,并启动mysql服务 mysql详细安装 1.首先下载二进制免编译的包,下载到/usr/local/src/目录下 2.解压压缩包 3.解压完...

Linux学习笔记
22分钟前
0
0
Redis高可用及分片集群

一、主从复制 使用异步复制 一个服务器可以有多个从服务器 从服务器也可以有自己的从服务器 复制功能不会阻塞主服务器 可以通过服务功能来上主服务器免于持久化操作,由从服务器去执行持久化...

Java大蜗牛
26分钟前
0
0
前端面试题汇总

最近在复习,准备找工作了,特此总结一下前端的相关知识。 1.获取浏览器URL中查询字符的参数: function getQuery(name){    var reg = new RegExp("(^|&)"+name+"=([^&]*)"(&|$));...

凛冬来袭
今天
0
0
可持续发展的学习道路

与其要求别人,不如提升自己 内心渴望进步 经常做出改变现有模式,不断学习 寻找资源,整合资源,不断熟练这种模式 渠道很重要 先打开新世界的航路

狮子狗
今天
0
0
apollox-lua开源项目 示例codepen2

今天在示例上增加了几个功能, 首先添加js array的标准库。 所有js array的方法目前都支持了。 添加查看code模式。 点击查看code可以看到生成的lua代码。默认web模式需要把标准库连接进来, ...

钟元OSS
今天
0
0
javascript性能优化之避免重复工作

javascript最重要也最根本的性能优化标准之一是避免工作,避免工作又包括两点,第一,不做不必要的工作,第二,不做重复的已经完成的工作。第一部分可以通过代码重构完成,第二部分不做重复的...

老韭菜
今天
0
0
缓存穿透、并发和雪崩那些事

0 题记 缓存穿透、缓存并发和缓存雪崩是常见的由于并发量大而导致的缓存问题,本文讲解其产生原因和解决方案。 缓存穿透通常是由恶意攻击或者无意造成的;缓存并发是由设计不足造成的;缓存雪...

Java填坑之路
今天
1
0
项目jar包管理构建工具---Maven

一、what is Maven? 我们来寻找一下官网,里面介绍了maven到底是什么?下面一句话就有讲解到:Apache Maven is a software project management and comprehension tool. Based on the conc...

一看就喷亏的小猿
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部