我可以使用HttpClient获取缓存的图像吗?

时间:2013-10-05 19:29:59

标签: java apache-commons-httpclient

是否可以使用HttpClient加载登录页面,并从缓存中获取img元素的图像文件,而不是从src链接获取,而不重新加载?这很重要,因为我需要为刚加载的页面保存验证码,如果我尝试从src链接加载它,它将是另一个验证码。我试过了:

    DefaultHttpClient httpclient = new DefaultHttpClient();

    HttpGet httpget = new HttpGet("http://www.mysite/login.jsp");

    HttpResponse response = httpclient.execute(httpget);
    HttpEntity entity = response.getEntity();

    InputStream instream = entity.getContent();
    OutputStream outstream = new FileOutputStream("d://file.html");
    org.apache.commons.io.IOUtils.copy(instream, outstream);
    outstream.close();
    instream.close();

但没有任何图像。我也尝试过来自selenium库的HtmlUnitDriver,也没有任何图像。也许我必须尝试其他的东西?你能帮帮我吗?

谢谢,对不起我的英语。

1 个答案:

答案 0 :(得分:0)

如上所述:HttpClient Get images from response DefaultHttpClient / HttpClient只获得一个内容,在您的情况下,它是一个HTML页面(由:http://www.mysite/login.jsp)。你需要解析那个HTML页面并获得指定的img标签,而不是你只需要下载它(只需要重新发送login.jsp请求!)。如果您下载验证码图像,则需要尽快获取该图像,否则可能会被试图登录的其他用户覆盖。

正如浏览器所做的那样,你需要以相同的方式,下载HTML,而不是解析它,而不是请求所有src / link / ect取决于你需要的。

DefaultHttpClient默认情况下不会缓存。

默认情况下启用

CachingHttpClient缓存,在这种情况下,您需要分析If-Modified-Since和If-None-Match标头,以确定是否执行了对远程服务器的请求,或者是否结果从缓存返回。如果服务器上没有任何更改,如果您先前已缓存,则会获得缓存数据。