读书人

servlet发生验证码

发布时间: 2013-08-27 10:20:47 作者: rapoo

servlet产生验证码

package com.mweb.user.servlet; 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.imageio.ImageIO;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; /** * 生成图形验证码的Servlet */public class ImageCodeMakerServlet extends HttpServlet{     @Override    public void init(ServletConfig config) throws ServletException    {        // TODO Auto-generated method stub        super.init(config);    }     /**     *     */    private static final long serialVersionUID = -8924942016876830055L;     public void doGet(HttpServletRequest req, HttpServletResponse resp)            throws ServletException, IOException    {        doPost(req, resp);    }     /**     * @see javax.servlet.http.HttpServlet#void     *      (javax.servlet.http.HttpServletRequest,     *      javax.servlet.http.HttpServletResponse)     */    public void doPost(HttpServletRequest req, HttpServletResponse resp)            throws ServletException, IOException    {         // 首先设置页面不缓存        resp.setHeader("Pragma", "No-cache");        resp.setHeader("Cache-Control", "no-cache");        resp.setDateHeader("Expires", 0);         // 定义图片的宽度和高度        int width = 90, height = 40;        // 创建一个图像对象        BufferedImage image = new BufferedImage(width, height,                BufferedImage.TYPE_INT_RGB);        // 得到图像的环境对象        Graphics g = image.createGraphics();         Random random = new Random();        // 用随机颜色填充图像背景        g.setColor(getRandColor(180, 250));        g.fillRect(0, 0, width, height);        for (int i = 0; i < 5; i++)        {            g.setColor(getRandColor(50, 100));            int x = random.nextInt(width);            int y = random.nextInt(height);            g.drawOval(x, y, 4, 4);        }        // 设置字体,下面准备画随机数        g.setFont(new Font("", Font.PLAIN, 40));        // 随机数字符串        String sRand = "";        for (int i = 0; i < 4; i++)        {            // 生成四个数字字符            String rand = String.valueOf(random.nextInt(10));            sRand += rand;            // 生成随机颜色            g.setColor(new Color(20 + random.nextInt(80), 20 + random                    .nextInt(100), 20 + random.nextInt(90)));            // 将随机数字画在图像上            g.drawString(rand, (17 + random.nextInt(3)) * i + 8, 34);             // 生成干扰线            for (int k = 0; k < 12; k++)            {                int x = random.nextInt(width);                int y = random.nextInt(height);                int xl = random.nextInt(9);                int yl = random.nextInt(9);                g.drawLine(x, y, x + xl, y + yl);            }        }         // 将生成的随机数字字符串写入Session        req.getSession().setAttribute("randcode", sRand);        // 使图像生效        g.dispose();        // 输出图像到页面        ImageIO.write(image, "JPEG", resp.getOutputStream());    }     /**     * 产生一个随机的颜色     *     * @param fc     *            颜色分量最小值     * @param bc     *            颜色分量最大值     * @return     */    public Color getRandColor(int fc, int bc)    {        Random random = new Random();        if (fc > 255)        {            fc = 255;        }        if (bc > 255)        {            bc = 255;        }        int r = fc + random.nextInt(bc - fc);        int g = fc + random.nextInt(bc - fc);        int b = fc + random.nextInt(bc - fc);        return new Color(r, g, b);    }}

读书人网 >编程

热点推荐