现在网络上各个网站上都有验证码,但是实现的形形×××各不相同.通过查资料和摸索,使用servlet来实现验证码.
一 建一个验证码生成类RandomImageGenerator ,其功能就是实现验证码
该类实现如下
import java.awt.*;
import java.awt.p_w_picpath.*;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.p_w_picpathio.ImageIO;
import org.apache.commons.lang.RandomStringUtils;
/**
 * 随即图片生成器
 * 该类用于用户注册时候需要用户根据图片内容进行填写正确后方可注册
 * @author Liudong
 */
public class RandomImageGenerator {
//随即生成包含验证码的字符串   
public static String random() {
        //20060320 add by wyx
        //因为o和0,l和1很难区分,所以,去掉大小写的o和l
String str = "";
        str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz";//初始化种子
        return RandomStringUtils.random(6, str);//返回6为的字符串
            }
/**
     * 根据要求的数字生成图片,背景为白色,字体大小16,字体颜色黑色粗体
     * @param num 要生成的数字
     * @param out 输出流
     * @throws IOException
     */
    public static void render(String num, OutputStream out) throws IOException {
        if (num.getBytes().length > 6) {
            throw new IllegalArgumentException(
                    "The length of param num cannot exceed 6.");
        }
        //设定宽度和高度
        int width = 130; 
int height = 30; 
        // 在内存中创建图象
        BufferedImage bi = new BufferedImage(width, height,
                                             BufferedImage.TYPE_INT_RGB);
        // 获取图形上下文
        Graphics2D g = (Graphics2D) bi.getGraphics();
        //画边框
        java.util.Random random = new java.util.Random();
        g.setColor(Color.white);
        g.fillRect(0, 0, width, height);
        //设置字体
        Font mFont = new Font("Tahoma", Font.BOLD, 16);
        g.setFont(mFont);
        g.setColor(Color.BLACK);//设置字体颜色
        //画认证码,每个认证码在不同的水平位置
        String str1[] = new String[6];
        for (int i = 0; i < str1.length; i++) {
            str1[i] = num.substring(i, i + 1);
            int w = 0;
            int x = (i + 1) % 3;
//随即生成验证码字符的水平偏移量
            if (x == random.nextInt(3)) {
                w = 19 - random.nextInt(7);
            } else {
                w = 19 + random.nextInt(7);
            }
//随即生成颜色
            Color color1 = new Color(random.nextInt(180), random.nextInt(180),
                                     random.nextInt(180));
            g.setColor(color1);
            g.drawString(str1[i], 20 * i + 10, w);
        }
// 随机产生干扰点,并用不同的颜色表示,使图象中的认证码不易被其它程序探测到
        for (int i = 0; i < 100; i++) {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            Color color1 = new Color(random.nextInt(255), random.nextInt(255),
                                     random.nextInt(255));
            g.setColor(color1); //随即画各种颜色的点
            g.drawOval(x, y, 0, 0);
        }
        //画干扰线
        for (int i = 0; i < 5; i++) {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            int x1 = random.nextInt(width);
            int y1 = random.nextInt(height);
            Color color1 = new Color(random.nextInt(255), random.nextInt(255),
                                     random.nextInt(255));
g.setColor(color1); //随即画各种颜色的线
            g.drawLine(x, y, x1, y1);
        }
        //图像生效
        g.dispose();
        //输出页面
        ImageIO.write(bi, "jpg", out);
    }
public static void main(String[] args) throws IOException {
        String num = random();
        System.out.println(num);
        render(num, new FileOutputStream("D:\\test.jpg"));
        System.out.println("Image generated.");
    }
}
二 验证码的实现,使用servlet来实现验证码
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import peopleBlog.util.RandomImageGenerator;

/**
 * 用于产生随即图片以防止非法***
 * @author Liudong
 */
public class RandomImageServlet extends HttpServlet {
 public final static String RANDOM_LOGIN_KEY = "RANDOM_LOGIN_KEY";
public void init() throws ServletException {
  System.setProperty("java.awt.headless","true");
 }
public static String getRandomLoginKey(HttpServletRequest req) {
        return (String)req.getSession().getAttribute(RANDOM_LOGIN_KEY);
    }
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
    {
        HttpSession ssn = req.getSession();
        if(ssn!=null) {
            String randomString = RandomImageGenerator.random();//生成种子
            ssn.setAttribute(RANDOM_LOGIN_KEY,randomString);//将种子放到session里面
            res.setContentType("p_w_picpath/jpeg");//设置图像生成格式
RandomImageGenerator.render(randomString,res.getOutputStream());//输出到页面
        }
    }
}
其中 ssn.setAttribute(RANDOM_LOGIN_KEY,randomString);这一行代码的作用是:
当从页面上输入验证码,提交后,在后台sevlet或者action里面验证输入的验证码和session里面的是否一致,如果不一致返回错误信息.
三,页面实现
在web.xml文件中设置
<servlet>
    <servlet-name>p_w_picpath</servlet-name>
    <servlet-class>peopleBlog.RandomImageServlet</servlet-class>
    <load-on-startup>5</load-on-startup>
  </servlet>
<servlet-mapping>
    <servlet-name>p_w_picpath</servlet-name>
    <url-pattern>/verifyCode.jsp</url-pattern>
</servlet-mapping>
然后在jsp页面中
<td><input name="verifyCode" type="text" id="verifyCode" class="input2" style="width:55px;" οnkeydοwn="JavaScript:ifEnter()"/>&nbsp; <img src="/blog/verifyCode.jsp" align="absMiddle" border="0"/> </td>
再在目的servlet中进行验证码判断就ok了

转载于:https://blog.51cto.com/nxdxt/25148

应用中验证码的生成方法.相关推荐

  1. java jsp验证码_JSP验证码简单生成方法

    本文实例讲述了JSP验证码简单生成方法.分享给大家供大家参考.具体如下: Color getRandColor(int fc,int bc){//给定范围获得随机颜色 Random random = ...

  2. JSP页面中验证码的调用方法

    步骤: 1.首先是要生成验证码 2.对验证码类进行调用:主要 实现的是  将验证码图片 输出到response.getOutputStream()这个输出流中 调用时,可以在页面调用,也可以在serv ...

  3. android 生成aar文件,Android 中.aar文件生成方法与用法

    https://i.cnblogs.com/EditPosts.aspx?opt=1 无论是用Eclipse还是用Android Studio做android开发,都会接触到jar包,全称应该是:Ja ...

  4. markdown中 文件目录树生成方法

    md文件常见的目录树的生成方法 cd 到代码目录 tree /f 然后拷贝 卷 新加卷 的文件夹 PATH 列表 卷序列号为 9CA4-E004 E:. │ .gitignore │ .name │ ...

  5. struts2中验证码的生成和使用

    第一步生产字符串: package com.yancode.demo; import java.util.Arrays; /*  * 一步一步来,要生成验证码图片,首先要有验证码,然后才能在画在图片上 ...

  6. JAVA中随机数的生成方法

    一.第一种:使用Math类中的random方法 该方法的返回数值为[0.0,1.0)的double类型数,由于double类数的精度很高,可以在一定程度下看做随机数,借助(int)来进行类型转换就可以 ...

  7. vs2010中moc文件生成方法

    Qt 程序在交由标准编译器编译之前,先要使用 moc 分析 C++ 源文件.如果它发现在一个头文件中包含了宏 Q_OBJECT,则会生成另外一个 C++ 源文件.这个源文件中包含了 Q_OBJECT ...

  8. Android 中.aar文件生成方法与用法

    https://i.cnblogs.com/EditPosts.aspx?opt=1 无论是用Eclipse还是用Android Studio做android开发,都会接触到jar包,全称应该是:Ja ...

  9. Revit软件用幕墙工具创建百叶窗及CAD门窗生成方法

    Revit软件用幕墙工具创建百叶窗及CAD门窗生成方法 首先,新建轮廓族,如图1-1所示,尺寸根据需要确定,如图: 编辑新建族的类别轮廓类型修改为竖挺如图1-2, 新组类型命名百叶窗如图1-3所示.然 ...

最新文章

  1. 转投AI?英国这所大学决定裁掉数学系,激怒了菲尔兹奖得主
  2. 怎样使用Spring Boot项目的单元测试?
  3. TK:vtkCellTreeLocator用法实战
  4. 学 Python找不到练手项目?试试这些!
  5. 【springboot】之自动配置原理
  6. JavaScript直接导出Excel,Word
  7. ubuntu如何杀死进程
  8. 小学生python编程教程-围观~山东省的小学生Python编程入门都学的什么?
  9. 微信小程序中多个button/view组件中进行切换时改变样式
  10. Django 【第六篇】ORM跨表操作(聚合查询,分组查询,F和Q查询等)
  11. Android 手机的坐标
  12. hp/博科光纤交换机配置小记
  13. preview一直不显示,无法和代码同步变化
  14. python模拟人工滑动_pyppeteer 模拟人工滑动验证(一)
  15. SVN更新(update)文件时,报skipped, remains conficted时的解决办法
  16. 颠覆虚拟机的神器——WSL来了
  17. 开源php官方团队解散,php语言大厦将倾?
  18. mysql utf8mb4 bin_Mysql的utf8与utf8mb4区别,utf8mb4_bin、utf8mb4_general_ci与utf8mb4_unicode_ci的选择...
  19. 童文、李烨:6G的9大挑战
  20. Python 中拼音库 PyPinyin 的用法

热门文章

  1. linux企业常用命令必之必会二
  2. 微软宣布.NET Native预览版
  3. java通过反射,泛型将定义的对象与对象之间互转
  4. 逃离伪PHP程序员应该做的事
  5. Python天天美味(28) - urlopen
  6. vue 编译警告 Compiled with 4 warnings
  7. 爬虫监控1000家企业新闻动态
  8. iOS:使用集成的支付宝SDK的支付流程
  9. Go -- 一致性哈希算法
  10. LFCS 系列第二讲:如何安装和使用纯文本编辑器 vi/vim