验证码action

public class AuthorizationCode extends BaseAction
{
    
    static final long serialVersionUID = 19881218; // 明明的生日
    
    public void getVoid()
        throws IOException
    {
        
        response.setContentType("image/jpeg");
        response.setHeader("Pragma", "No-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
        // 在内存中创建图象
        int width = 60, height = 20;
        BufferedImage image =
            new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        
        // 获取图形上下文
        Graphics g = image.getGraphics();
        
        // 生成随机类
        Random random = new Random();
        
        // 设定背景色
        g.setColor(new Color(255, 255, 255));
        g.fillRect(0, 0, width, height);
        
        // 设定字体
        g.setFont(new Font("Comic Sans MS", Font.PLAIN, 18));
        // 画边框
        g.setColor(this.getRndColor());
        // g.drawRect(0,0,width-1,height-1);
        
        // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
        g.setColor(this.getRndColor());
        for (int i = 0; i < 10; 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);
        }
        
        // 取随机产生的认证码(4位数字)
        String sRand = "";
        for (int i = 0; i < 4; i++)
        {
            String rand = String.valueOf(random.nextInt(10));
            sRand += rand;
            // 将认证码显示到图象中
            g.setColor(new Color(127, 127, 127));// 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
            g.drawString(rand, 13 * i + 6, 16);
        }
        request.getSession().setAttribute("AuthorizationCode", sRand);
        // 图象生效
        g.dispose();
        ServletOutputStream responseOutputStream = response.getOutputStream();
        // 输出图象到页面
        ImageIO.write(image, "JPEG", responseOutputStream);
        
        // 以下关闭输入流!
        responseOutputStream.flush();
        responseOutputStream.close();
    }
    
    private Color getRndColor()
    {// 给定范围获得随机颜色
        return new Color(this.rnd(), this.rnd(), this.rnd());
    }
    
    /** 随机生成0-255的数字* */
    private int rnd()
    {
        java.util.Random random = new java.util.Random();
        return random.nextInt(255);
    }
    
    /** 把除了大小写字母和数字外的字符全过滤掉* */
    @SuppressWarnings("unused")
    private char filter(int k)
    {
        if (k < 65)
            k = 48 + (k % 10);
        if (k > 64 && k < 96)
            k = 65 + (k % 26);
        if (k > 96)
            k = 97 + (k % 26);
        return (char)k;
    }
    
    /** 取得一个随机字体* */
    @SuppressWarnings("unused")
    private String getRndFontNames()
    {
        GraphicsEnvironment ge =
            GraphicsEnvironment.getLocalGraphicsEnvironment();
        String[] k = ge.getAvailableFontFamilyNames();
        java.util.Random r = new java.util.Random();
        return k[r.nextInt(k.length)];
    }
    
}

你可能感兴趣的:(cache)