discus733 2008-07-10 13:10
浏览 156
已采纳

关于 验证码算法的 问题

本人的脑子不 怎么好使,写了一个关于验证码的算法,但是总是不能达到理想的效果,
验证码的算法大致采用的随机 4 个 random() 算法,来产生 4 位验证码,但是,在服务器不重启的条件下,不管怎么刷新验证页面,所得到的验证码都是一样,

我想问一下,我的思路有什么问题,是什么地方出了错误?
[b]问题补充:[/b]
说的有道理,但是我对你回答的

“...应用设定的Session时效.认为你在恶意刷新,而没有响应你的请求 ?”
中的“Session时效”,感觉好深奥,不懂,能不是解释一下,具体指的是什么东西?

是什么意思?

  • 写回答

2条回答 默认 最新

  • sunlarry 2008-07-12 15:19
    关注

    生成随机数
    [code="java"]
    public class DrawRandNumber
    {

    private static BufferedImage image = new BufferedImage(50, 20, 1);
    private static DrawRandNumber instance = new DrawRandNumber();
    public static final Random RANDOM = new Random();
    
    private DrawRandNumber()
    {
    }
    
    @SuppressWarnings("unused")
    private void init()
    {
    }
    
    public static DrawRandNumber getInstance()
    {
        return instance;
    }
    
    public synchronized String writeRandNumber(int bits, int to, HttpServletRequest request)
        throws IOException
    {
        String rand = getRandNumber(bits, to);
        setSession(request, rand);
        return rand;
    }
    
    public synchronized Image drawRandNumber(int bits, int to, HttpServletRequest request)
    {
        String rand = getRandNumber(bits, to);
        Graphics g = image.getGraphics();
        refreshBgColor(g);
        g.setColor(getRandColor(20, 130));
        g.drawString(rand, 6, 16);
        g.dispose();
        setSession(request, rand);
        return image;
    }
    
    private String getRandNumber(int bits, int to)
    {
        StringBuffer randBuffer = new StringBuffer();
        for(int i = 1; i <= bits; i++)
            randBuffer.append(RANDOM.nextInt(to));
    
        return randBuffer.toString();
    }
    
    private void setSession(HttpServletRequest request, String rand)
    {
        request.getSession(true).setAttribute("rand",rand);
    }
    
    private void refreshBgColor(Graphics g)
    {
        g.fillRect(0, 0, 50, 20);
        g.setFont(new Font("Times New Roman", 0, 18));
        g.setColor(getRandColor(160, 200));
        for(int i = 0; i < 100; i++)
        {
            int x = RANDOM.nextInt(50);
            int y = RANDOM.nextInt(20);
            int xl = RANDOM.nextInt(12);
            int yl = RANDOM.nextInt(12);
            g.drawLine(x, y, x + xl, y + yl);
        }
    
    }
    
    private Color getRandColor(int fc, int bc)
    {
        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);
    }
    

    }

    [/code]

    servlet:
    [code="java"]
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
    {
    response.setHeader("Cache-Control", "no-cache");
    response.setHeader("Cache-Control", "no-store");
    response.setDateHeader("Expires", 0L);
    response.setHeader("Pragma", "no-cache");
    ImageIO.write((RenderedImage)DrawRandNumber.getInstance().drawRandNumber(4, 10, request), "JPEG", response.getOutputStream());
    }
    [/code]

    调用,可点击刷新:
    [code="java"]
    [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 PADS Logic 原理图
  • ¥15 PADS Logic 图标
  • ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
  • ¥20 气象站点数据求取中~
  • ¥15 如何获取APP内弹出的网址链接
  • ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
  • ¥50 STM32单片机传感器读取错误
  • ¥15 (关键词-阻抗匹配,HFSS,RFID标签天线)
  • ¥15 机器人轨迹规划相关问题
  • ¥15 word样式右侧翻页键消失