Jsp servlet验证码工具类分享

昨晚在csdn看到一位前辈写一个ajax+servlet+jsp验证,顿时心血来潮,在阅读前辈的代码下我亲手体验一下,做了一个验证码生成工具类,以供大家做个参考。

1、添加VeriyCodeUtils类生成验证码图像

package com.servlet; 

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.OutputStream;
import java.util.Random; 

import javax.imageio.ImageIO; 

/**
 *
 * @author hubiao
 *  验证码生成器
 * 用到API
 *  BufferedImage 创建一个图像
 *  Graphics2D 绘制
 *   fillRect(x,y,width,height);背景
 *   font()字体
 *   drawRect();边框
 *   drawLine();线
 *   drwaString:图像数据
 *  ImageIO 生成图像
 */
public class VeriyCodeUtils {
 /**
  * @param output 保存验证图像的流
  * @return 验证码
  */
 public static String newVeriyCode(OutputStream output)
 {
  int width = 90;
  int height = 40;
  int codeCount = 5;
  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' }; 

  //创建图像对象,8位RGB
  BufferedImage buffered = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 

  //通过Crapahices来绘制图像到BufferedImage中
  Graphics2D gra = buffered.createGraphics(); 

  //设置图片背景:白色
  gra.setColor(Color.WHITE);
  gra.fillRect(0, 0, width, height); 

  //设置字体,字体大小根据图片高度决定
  gra.setFont(new Font("Fixedsys",Font.PLAIN,height-2)); 

  //设置边框:黑色,1cm
  gra.setColor(Color.BLACK);
  gra.drawRect(0, 0, width-1, height-1); 

  //生成10条黑色干扰线
  gra.setColor(Color.BLACK);
  Random ran = new Random();
  for(int i = 0; i < 70;i++)
  {
   int x = ran.nextInt(255);
   int y = ran.nextInt(255);
   int x1 = ran.nextInt(255);
   int y1 = ran.nextInt(255);
   gra.drawLine(x, y,x+x1, y+y1);//画直线
  }
  //生成验证码
  StringBuffer sb = new StringBuffer();
  int r = 0,g = 0,b = 0;
  for(int i = 0; i < codeCount; i++)
  {
   String strRand = String.valueOf(codeSequence[ran.nextInt(codeSequence.length)]);
   //对每位验证码都生成不同的颜色,增加识别系统难度
   r = ran.nextInt(255);
   g = ran.nextInt(255);
   b = ran.nextInt(255);
   gra.setColor(new Color(r, g, b));
   gra.drawString(strRand, (i+1)*13, height-4);
   sb.append(strRand);
  }
  try {
   ImageIO.write(buffered, "jpeg", output);
  } catch (Exception e) {
   throw new RuntimeException(e);
  } 

  return sb.toString();
 }
}

2、servlet使用验证码

protected void doPost(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
  //禁止图像缓存
  resp.setHeader("Pragma", "no-cache");
  resp.setHeader("Cache-Control", "no-cache");
  resp.setDateHeader("Expires", 0);
  resp.setContentType("image/jpeg"); 

  //生成验证码图像
  String veriyCode = VeriyCodeUtils.newVeriyCode(resp.getOutputStream()); 

  //将验证码保存到session中
  HttpSession session = req.getSession();
  session.setAttribute("validateCode", veriyCode);
 }

3、JSP页面使用验证码

</head>
 <script type="text/javascript">
  function createCode()
  {
   var t = new Date().getTime();//防止页面缓存,使用时间搓
   var srcImg = document.getElementById("srcImg");
   srcImg.src="/ImgVeifyWeb/vity.do?"+t;
  }
 </script>
 <body>
 <h1>${requestScope.code}</h1>
 <img id="srcImg" src="<c:url value="/vity.do"></c:url>" /> #这里使用直接让img访问servlet,通过response响应一个图像流
 <a href="##" rel="external nofollow" id="codeId" onclick="createCode()">换一张</a>
 <form action="<c:url value="/hello.do"></c:url>" method="post">
  <input type="text" name="codeVify"/>
  <input type="submit" value="提交"/>
 </form>
 </body>

4、校验验证码

protected void doPost(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
  HttpSession session = req.getSession();
  Object validateCode = session.getAttribute("validateCode");
  System.out.println(validateCode); 

  String codeVify = req.getParameter("codeVify");
  if(codeVify==null || codeVify.equals(""))
  {
   req.setAttribute("code","验证证不能为空");
   req.getRequestDispatcher("/index.jsp").forward(req, resp);
   return;
  }else if(!validateCode.toString().equalsIgnoreCase(codeVify))
  {
   req.setAttribute("code","验证证错误");
   req.getRequestDispatcher("/index.jsp").forward(req, resp);
   return;
  }
  System.out.println("下面开始 做其他业务操作....");
 }

校验图如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • js提取中文拼音首字母的封装工具类

    前言 本文主要记录了如何用js提前中文拼音首字母的方法.封装一个函数,假如有需要的,可以直接拿去用.下面话不多说了,来一起看看详细的介绍吧. 原理 主要是根据中文的unicode码来进行的.主要是在收集的中文范围内查找,大家可以多收集一些.假如中文是多音字,那可能有点坑了! var getPy = (function() { //函数使用,本表收录的字符的Unicode编码范围为19968至40869, XDesigner 整理 var strChineseFirstPY = "YDYQSXMW

  • JavaScript封装的常用工具类库bee.js用法详解【经典类库】

    本文实例讲述了JavaScript封装的常用工具类库bee.js.分享给大家供大家参考,具体如下: bee.js下载地址: github下载地址:https://github.com/shadowOfCode/bee.js 或点击此处本站下载. 使用: <!--area.js存放区域编码的一个常量.由于bee.js里面的getPersonInfo18()方法需要调用这个常量,所以在bee.js之前引入.如果不需要用到这个方法也可以不引入area.js--> <script type=&q

  • JS实现Cookie读、写、删除操作工具类示例

    本文实例讲述了JS实现Cookie读.写.删除操作工具类.分享给大家供大家参考,具体如下: /*** *读取指定的Cookie值 readCookie("id"); *@param {string} cookieName Cookie名称 */ function readCookie(cookieName) { var theCookie = "" + document.cookie; var ind = theCookie.indexOf(cookieName);

  • 详解javascript常用工具类的封装

    前言 因为工作中经常用到这些方法,所有便把这些方法进行了总结. JavaScript 1. type 类型判断 isString (o) { //是否字符串 return Object.prototype.toString.call(o).slice(8, -1) === 'String' } isNumber (o) { //是否数字 return Object.prototype.toString.call(o).slice(8, -1) === 'Number' } isObj (o) {

  • javaScript日期工具类DateUtils详解

    本文实例为大家分享了javaScript日期工具类的具体代码,供大家参考,具体内容如下 DateUtils = { patterns: { PATTERN_ERA: 'G', //Era 标志符 Era strings. For example: "AD" and "BC" PATTERN_YEAR: 'y', //年 PATTERN_MONTH: 'M', //月份 PATTERN_DAY_OF_MONTH: 'd', //月份的天数 PATTERN_HOUR_O

  • js验证手机号、密码、短信验证码代码工具类

    本文实例为大家分享了js验证手机号.密码.短信验证码的代码工具类,供大家参考,具体内容如下 代码工具类 /** * 参数较验 * * */ var verification = { stop : false, //倒计时 //验证手机号 phone : function (tel, id) { if ("" == tel || !tel) { mui.toast('手机号不可以为空!'); } else { var reg = /^0?1[3|4|5|7|8][0-9]\d{8}$/;

  • javaScript手机号码校验工具类PhoneUtils详解

    本文实例为大家分享了javaScript手机号码校验工具类PhoneUtils的具体代码,供大家参考,具体内容如下 //PhoneUtils命名空间 PhoneUtils = { phoneRegexs: { //中国电信号码段 CHINA_TELECOM_PATTERN: /^(?:\+86)?1(?:33|53|7[37]|8[019])\d{8}$|^(?:\+86)?1700\d{7}$/, //中国联通号码段 CHINA_UNICOM_PATTERN: /^(?:\+86)?1(?:3

  • Java实现的JSONUtil工具类与用法示例

    本文实例讲述了Java实现的JSONUtil工具类与用法.分享给大家供大家参考,具体如下: import java.util.HashMap; import java.util.Map; import com.alibaba.druid.util.StringUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; public class JSONUtils { /** * Bean对象转J

  • javaScript字符串工具类StringUtils详解

    本文实例为大家分享了javaScript字符串工具类的具体代码,供大家参考,具体内容如下 StringUtils = { isEmpty: function(input) { return input == null || input == ''; }, isNotEmpty: function(input) { return !this.isEmpty(input); }, isBlank: function(input) { return input == null || /^\s*$/.t

  • JavaScript日期工具类DateUtils定义与用法示例

    本文实例讲述了JavaScript日期工具类DateUtils定义与用法.分享给大家供大家参考,具体如下: DateUtils = { patterns: { PATTERN_ERA: 'G', //Era 标志符 Era strings. For example: "AD" and "BC" PATTERN_YEAR: 'y', //年 PATTERN_MONTH: 'M', //月份 PATTERN_DAY_OF_MONTH: 'd', //月份的天数 PATT

随机推荐