使用技巧:Java实现随机验证码功能实例

奥巴马由纪夫

奥巴马由纪夫

2016-02-19 19:29

下面图老师小编要向大家介绍下使用技巧:Java实现随机验证码功能实例,看起来复杂实则是简单的,掌握好技巧就OK,喜欢就赶紧收藏起来吧!

  现在许多系统的注册、登录或者发布信息模块都添加的随机码功能,就是为了避免自动注册程序或者自动发布程序的使用。

  验证码实际上就是随机选择一些字符以图片的形式展现在页面上,假如进行提交操作的同时需要将图片上的字符同时提交,假如提交的字符与服务器session保存的不同,则认为提交信息无效。为了避免自动程序分析解析图片,通常会在图片上随机生成一些干扰线或者将字符进行扭曲,增加自动识别的难度。

  在这里,我们使用servlet来实现随机验证码的实现。

  

package com.servlet;import Java.awt.Color;import java.awt.Font;import java.awt.Graphics2D;import java.awt.image.BufferedImage;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;/** * 生成随机验证码 * @author bitiliu * */public class ValidateCodeServlet extends HttpServlet { private static final long serialVersionUID = 1L;  //验证码图片的宽度。private int width=60;//验证码图片的高度。private int height=20;//验证码字符个数private int codeCount=4;private int x=0;//字体高度private int fontHeight;private int codeY;char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',   'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',   'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };/** * 初始化验证图片属性 */public void init() throws ServletException { //从web.XML中获取初始信息 //宽度  String strWidth=this.getInitParameter("width");  //高度  String strHeight=this.getInitParameter("height");  //字符个数  String strCodeCount=this.getInitParameter("codeCount"); //将配置的信息转换成数值  try  {   if(strWidth!=null && strWidth.length()!=0)   {width=Integer.parseInt(strWidth);   }   if(strHeight!=null && strHeight.length()!=0)   {height=Integer.parseInt(strHeight);   }   if(strCodeCount!=null && strCodeCount.length()!=0)   {codeCount=Integer.parseInt(strCodeCount);   }  }  catch(NumberFormatException e)  {}x=width/(codeCount+1);  fontHeight=height-2;  codeY=height-4;   }protected void service(HttpServletRequest req, HttpServletResponse resp)   throws ServletException, java.io.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);  //随机产生160条干扰线,使图象中的认证码不易被其它程序探测到。  g.setColor(Color.BLACK);  for(int i = 0; i  160; 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(36)]);   //产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。   red = random.nextInt(255);   green = random.nextInt(255);   blue = random.nextInt(255);   //用随机产生的颜色将验证码绘制到图像中。   g.setColor(new Color(red, green, blue));   g.drawString(strRand, (i + 1) * x, codeY);   //将产生的四个随机数组合在一起。   randomCode.append(strRand);  }  // 将四位数字的验证码保存到Session中。  HttpSession session = req.getSession();  session.setAttribute("validateCode", randomCode.toString());  // 禁止图像缓存。  resp.setHeader("Pragma", "no-cache");  resp.setHeader("Cache-Control", "no-cache");  resp.setDateHeader("EXPires", 0);  resp.setContentType("image/jpeg");  //将图像输出到Servlet输出流中。  ServletOutputStream sos = resp.getOutputStream();  ImageIO.write(buffImg, "jpeg", sos);  sos.close(); }}

  
   需要在web.xml中声明servlet

  

servlet servlet-nameValidateCodeServlet/servlet-name servlet-classcom.servlet.ValidateCodeServlet/servlet-class init-param  param-namewidth/param-name  param-value200/param-value /init-param init-param  param-nameheight/param-name  param-value80/param-value /init-param init-param  param-namecodeCount/param-name  param-value5/param-value /init-param  /servlet  servlet-mappingservlet-nameValidateCodeServlet/servlet-nameurl-pattern/validateCodeServlet/url-pattern /servlet-mapping

  需要引用的页面可以这样来写:

  

ccid_file values="validateCodeServlet" width="100/" /

  用户提交后就可以将用户输入的验证码与session中保存的字符串进行比对,达到验证的效果。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)
展开更多 50%)
分享

猜你喜欢

使用技巧:Java实现随机验证码功能实例

编程语言 网络编程
使用技巧:Java实现随机验证码功能实例

解析Java实现随机验证码功能的方法详解

编程语言 网络编程
解析Java实现随机验证码功能的方法详解

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

用PHP实现验证码功能

PHP
用PHP实现验证码功能

java 图片验证码的实现代码

编程语言 网络编程
java 图片验证码的实现代码

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Java 随机生成验证码(支持大小写字母、数字、随机字体)的实例

编程语言 网络编程
Java 随机生成验证码(支持大小写字母、数字、随机字体)的实例

jsp实现图形验证码

Web开发
jsp实现图形验证码

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Java开发学习过程中应该理解的一些重点内容

Java开发学习过程中应该理解的一些重点内容

JSP内部对象详解

JSP内部对象详解
下拉加载更多内容 ↓