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 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题