随笔-199  评论-203  文章-11  trackbacks-0
      // 编写java类:生成验证码图片:

package com.xia;

 

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.image.BufferedImage;

import java.io.IOException;

import java.util.Random;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import com.sun.image.codec.jpeg.JPEGCodec;

import com.sun.image.codec.jpeg.JPEGImageEncoder;

/**

* @(#)VerifyCodeServlet.java Dec 9, 2007 8:14:14 PM

*

* @author Yuan

* 验证码生成器,使用此类需要将表单里的验证码输入框的name属性设为"verifycode"

*/

public class VerifyCodeGenerator {

    

    public static final VerifyCodeGenerator generator = new VerifyCodeGenerator();

    

    private final String ATTRIBUTE_NAME = "verifycode";

    //图片的宽度

    private final int WIDTH = 15;

    //图片的高度

    private final int HEIGHT = 22;

    //字符串长度

    private final int CODE_LENGTH = 4;

    //随机字符串范围

    private final String RAND_RANGE = "abcdefghijklmnopqrstuvwxyz"

        + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

        + "1234567890" ;

    private final char[] CHARS = RAND_RANGE.toCharArray();

    

    private Random random = new Random();

    

    public VerifyCodeGenerator(){

        //

    }

    public static VerifyCodeGenerator getInstance(){

        return generator;

    }

    

    /**

     * 生成随机字符串

     * @return 随机字符串

     */

    private String getRandString(){

        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < CODE_LENGTH; i++)

            sb.append(CHARS[random.nextInt(CHARS.length)]);

        return sb.toString();

    }

    /**

     * 生成随机颜色

     * @param ll 产生颜色值下限(lower limit)

     * @param ul 产生颜色值上限(upper limit)

     * @return 生成的随机颜色对象

     */

    private Color getRandColor(int ll, int ul){

        if (ll > 255) ll = 255;

        if (ll < 1) ll = 1;

        if (ul > 255) ul = 255;

        if (ul < 1) ul = 1;

        if (ul == ll) ul = ll + 1;

        int r = random.nextInt(ul - ll) + ll;

        int g = random.nextInt(ul - ll) + ll;

        int b = random.nextInt(ul - ll) + ll;

        Color color = new Color(r,g,b);

        return color;

    }

    /**

     * 生成指定字符串的图像数据

     * @param verifyCode 即将被打印的随机字符串

     * @return 生成的图像数据

     * */

    private BufferedImage getImage(String verifyCode){

        BufferedImage image = new BufferedImage(WIDTH * CODE_LENGTH, HEIGHT, BufferedImage.TYPE_INT_RGB);

         

        //获取图形上下文

        Graphics graphics = image.getGraphics();

        

        //设置背景色

        graphics.setColor(getRandColor(1,50));

        //填充背景色

        graphics.fillRect(0, 0, WIDTH * 4, HEIGHT);

        

        //设置边框颜色

        graphics.setColor(new Color(0,255,0));

        //画边框

    /*    for (int i=0; i<2; i++)

            graphics.drawRect(i, i, WIDTH * CODE_LENGTH - i * 2 - 1, HEIGHT - i * 2 - 1); */

        

        //设置随机干扰线条颜色

        graphics.setColor(getRandColor(50,100));

        //产生50条干扰线条

        for (int i=0; i<50; i++){

            int x1 = random.nextInt(WIDTH * CODE_LENGTH - 4) + 2;

            int y1 = random.nextInt(HEIGHT - 4) + 2;

            int x2 = random.nextInt(WIDTH * CODE_LENGTH - 2 - x1) + x1;

            int y2 = y1;

            graphics.drawLine(x1, y1, x2, y2);

        }

        //设置字体

        graphics.setFont(new Font("Times New Roman", Font.PLAIN, 18));

        //画字符串

        for (int i=0; i<this.CODE_LENGTH; i++){

            String temp = verifyCode.substring(i, i+1);

            graphics.setColor(getRandColor(100,255));

            graphics.drawString(temp, 13 * i + 6, 16);

        }

        //图像生效

        graphics.dispose();

        return image;

    }

    /**

     * 将验证码的图像输出

     * @param request 用户的请求对象

     * @param response 用户的响应对象

     * */

    public void printImage(HttpServletRequest request,

            HttpServletResponse response){

        //将ContentType设为"image/jpeg",让浏览器识别图像格式。

        response.setContentType("image/jpeg");

        //设置页面不缓存

        response.setHeader("Pragma", "No-cache");

        response.setHeader("Cache-Control", "no-cache");

        response.setDateHeader("Expires", 2000);

        

        //获得随机验证码

        String verifyCode = this.getRandString();

        String str = "ssss";

        for(int i=0; i<10; i++)

            str = str + str;

        //获得验证码的图像数据

        BufferedImage bi = this.getImage(verifyCode);

        //把验证码存入session

        request.getSession().setAttribute(ATTRIBUTE_NAME, verifyCode);

        try{

            //获得Servlet输出流

            ServletOutputStream outStream = response.getOutputStream();

            //创建可用来将图像数据编码为JPEG数据流的编码器

            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outStream);

            //将图像数据进行编码

            encoder.encode(bi);

            //强行将缓冲区的内容输入到页面

            outStream.flush();

            //关闭输出流

            outStream.close();

        }catch(IOException ex){

            ex.printStackTrace();

        }

    }

    /**

     * 检查输入的验证码是否正确,若用户输入的验证码与生成的验证码相符则返回true,否则返回false。

     * @param request 用户的请求对象

     * @return 验证结果

     * */

    public boolean check(HttpServletRequest request){

        if (((String)request.getParameter(ATTRIBUTE_NAME))

                .equalsIgnoreCase((String)request.getSession().getAttribute(ATTRIBUTE_NAME))){

            request.getSession().removeAttribute(ATTRIBUTE_NAME);

            return true;

        }

        return false;

    }

}

2.        编写servlet显示图片信息

package com.xia;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

public class CreateCode extends HttpServlet {

    public void service(HttpServletRequest request, HttpServletResponse response)

       throws ServletException, IOException

       {

          VerifyCodeGenerator ver=new VerifyCodeGenerator();

          ver.printImage(request, response);

       }

}

3.        编写HTML页面:

<%@ page language="java" pageEncoding="utf-8"%>

<%String path = request.getContextPath();

  String basePath = request.getScheme() + "://"

         + request.getServerName() + ":" + request.getServerPort()

         + path + "/";

%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

     <base href="<%=basePath%>">

     <title>My JSP 'index.jsp' starting page</title>

     <meta http-equiv="pragma" content="no-cache">

     <meta http-equiv="cache-control" content="no-cache">

     <meta http-equiv="expires" content="0">

     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

     <meta http-equiv="description" content="This is my page">

     <!--

  <link rel="stylesheet" type="text/css" href="styles.css">

  -->

  </head>

  <script type="text/javascript">

  function show()

  {

  var o=document.getElementById("random");

  var timenow = new Date().getTime();

  o.src="/ValidateCodeDemo/CreateCode";

  }

  </script>

  <body>

     This is my JSP page.

     <input type="text"/>

     <br>

     <input type="image" src="/ValidateCodeDemo/CreateCode" name="random" width="80px" height="30px"/>

<!--   刷新验证码  -->

     <a href="javaScript:show()">看不清楚,换一张</a>

  </body>

</html>

posted on 2009-03-20 07:58 Werther 阅读(1066) 评论(1)  编辑  收藏 所属分类: 10.Java

评论:
# re: 验证码的开发示例 2014-04-28 09:53 | 搜索
啊  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 

I'm reading...

Java 60

Head  First SQL

宝贝连接


If you need these books,pls send me emails.
Email:kunpeng.niu@163.com
<2009年3月>
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

留言簿(10)

随笔分类(178)

随笔档案(208)

文章档案(1)

新闻档案(6)

相册

1.Java Official Website

2.Java Study Website

3.Java Technic Website

4.Java Video Website

5.Database Website

6.Bookshop Website

7.English Website

8.Friends Link

9.Other Web

积分与排名

  • 积分 - 683803
  • 排名 - 67

最新评论

阅读排行榜

评论排行榜