最近在做新闻管理的后台,发现图片请求的非常慢,加载过的图片依然重新加载。
这里我是用controller返回图片的,所以每次请求图片的时候会进入controller中然后返回图片,每次返回的responsebody size都会略大于图片大小。
但是在请求tomcat静态资源时,首次加载时和上面情况类似,但是下次刷新responsebody就只有几十b的大小。
一开始没有清空缓存,以为tomcat把图片压缩成几十b大小,感觉这也太不可思议了,但是还是选择尝试一下。在controller中用gzip对图片资源进行压缩
public final class GzipUtil {
public static byte[] compress(byte[] data) {
ByteArrayOutputStream byteOutput = new ByteArrayOutputStream(1024);
GZIPOutputStream output = null;
try {
System.out.println("before:"+data.length);
output = new GZIPOutputStream(byteOutput);
output.write(data);
} catch (IOException e) {
} finally {
try {
output.close();
} catch (IOException e) {
}
}
return byteOutput.toByteArray();
}
}
@ResponseBody
@RequestMapping("img/{id}.jpg")
public ResponseEntity<byte[]> getImg(@PathVariable Long id,HttpServletRequest request) throws IOException {
HttpHeaders headers = new HttpHeaders();
// String encoding = request.getHeader( "accept-encoding" );
headers.setContentType(MediaType.IMAGE_JPEG);
byte[] data ;
if((encoding != null) && (encoding.indexOf( "gzip" ) != -1)){
// "Content-Encoding", "gzip"
headers.set("Content-Encoding","gzip");
data = GzipUtil.compress(FileUtils.readFileToByteArray(new File(imgBasePath+id+".jpg")));
System.out.println("data size "+data.length);
}else{
data = FileUtils.readFileToByteArray(new File(imgBasePath+id+".jpg"));
}
headers.setContentLength(data.length);
return new ResponseEntity<byte[]>(data, headers,
HttpStatus.CREATED);
}
先判断浏览器是否支持 gzip,如果支持使用gzip压缩。
然后在浏览器测试,发现压缩后的responseboy只比压缩前少了几k,看来并不是这个原因
后来清空chrom浏览器缓存(command+shift+R )后发现每次请求和controller请求图片一样。所以可以判断为缓存问题
tomcat :
缓存前
requestheader: