我正在使用Android-Universal-Image-Loader在我的Android应用程序上从远程服务器加载图像,通过HTTPS
。为了访问图像,客户端应提供有效的令牌,有时服务器会返回“过期crsf令牌”错误。为了处理这种行为,应定义自定义ImageDownloader。以下是应在我的实现中重写的方法的基本实现。
protected InputStream getStreamFromNetwork(String imageUri, Object extra) throws IOException {
HttpURLConnection conn = createConnection(imageUri, extra);
int redirectCount = 0;
while (conn.getResponseCode() / 100 == 3 && redirectCount < MAX_REDIRECT_COUNT) {
conn = createConnection(conn.getHeaderField("Location"), extra);
redirectCount++;
}
InputStream imageStream;
try {
imageStream = conn.getInputStream();
} catch (IOException e) {
// Read all data to allow reuse connection (http://bit.ly/1ad35PY)
IoUtils.readAndCloseStream(conn.getErrorStream());
throw e;
}
if (!shouldBeProcessed(conn)) {
IoUtils.closeSilently(imageStream);
throw new IOException("Image request failed with response code " + conn.getResponseCode());
}
return new ContentLengthInputStream(new BufferedInputStream(imageStream, BUFFER_SIZE), conn.getContentLength());
}
我希望重新编写代码以处理无效的令牌错误。例如,如果服务器返回此类错误,则应识别该错误,重新生成令牌并重复请求。
我能想到的唯一解决方案是这样的(缩短后的代码):
imageStream = conn.getInputStream();
byte[] body = org.apache.commons.io.IOUtils.toByteArray(imageStream);
if (body.length < 300 // high probability to contain err message
&& isInvalidToken(body)) {
// handle error
}
return new ByteArrayInputStream(body);
如果我只是用它来生成最大80kb的缩略图,那么使用这种解决方案是否安全?还有其他解决方案吗?
java.io.InputStream
,而且因为它是一个抽象类,我们必须要用extend
来继承它。已经修正了上面的代码,希望你也能理解。 - gaborsch