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

2016-02-19 19:29 6 1 收藏

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

【 tulaoshi.com - 编程语言 】

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

  验证码实际上就是随机选择一些字符以图片的形式展现在页面上,假如进行提交操作的同时需要将图片上的字符同时提交,假如提交的字符与服务器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://www.tulaoshi.com/bianchengyuyan/)

来源:http://www.tulaoshi.com/n/20160219/1621120.html

延伸阅读
12306验证码怎么用?12306火车票订票网站图片验证码使用教程   12306火车票订票网站的验证码一直是困扰大家的一个大问题,数字+字母的验证码太简单以致于被自动识别验证码的火车票抢票软件滥用,太复杂又让广大乘客很受伤。12306推出了全新的图案验证码,点击所有的某个物品图案实现验证。下面跟小编一起来来看看12306图片验证码怎么...
标签: Web开发
我们在做验证码的时候往往由于要反作弊,验证有时故意加入多的干扰因素,这时验证码显示不很清楚,用户经常输入错误。这样不但要重新刷新页面,导致用户没有看清楚验证码而重填而不是修改,而且如果没有用session保存下用户输入的其它数据的话(如姓名),用户刚刚输入的内容也不存在了,这样给用户造成不好的体验。 本例在原有验证方式基础之上增...
标签: Web开发
  生成有4个随机数字和杂乱背景的图片,数字和背景颜色会改变,服务器端刷新(用history.go(-1)也会变)     原型参考ALIBABA  http://china.alibaba.com/member/showimage     产生验证码图片的文件-----image.jsp     %@ page contentType="image/jpeg" import="java.awt.*,jav...
标签: Java JAVA基础
      生成有4个随机数字和杂乱背景的图片,数字和背景颜色会改变,服务器端刷新(用history.go(-1)也会变) 原型参考ALIBABA  http://china.alibaba.com/member/showimage 产生验证码图片的文件-----image.jsp <%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imag...
标签: Java JAVA基础
  一些网站采用了字母和数字的验证码,数字和字母加起来一共30多个,如果有心,还是能够通过方法识别出来。 我在网上看到一篇文章"jsp彩色验证码",我进行了加强,生成的验证码内容为汉字,可以方便应用在面向汉语网民的网站认证上。 当然,我还看到别人考虑的几种方法: 1.生成计算题,比如20+34*(23-12)=?,用户必须输入正确的答案才...

经验教程

294

收藏

76
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部