接口获取图片文件流的缓存问题

来源:互联网 发布:数据库 经典公开课 编辑:程序博客网 时间:2024/06/05 16:37

最近在做新闻管理的后台,发现图片请求的非常慢,加载过的图片依然重新加载。

这里我是用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:

    1. Accept:
      text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    2. Accept-Encoding:
      gzip, deflate
    3. Accept-Language:
      zh-CN,zh;q=0.8,en;q=0.6
    4. Cache-Control:
      max-age=0
    5. Connection:
      keep-alive
    6. Cookie:
      Hm_lvt_fbd153e223cf03f359f3793430d98ad0=1502073972,1502160655,1502250279; Hm_lpvt_fbd153e223cf03f359f3793430d98ad0=1502262568; JSESSIONID=DBF618B52AB5792C63B8EF60896CEB23
    7. Host:
      smartsowo.com
    8. If-Modified-Since:
      Mon, 07 Aug 2017 03:04:22 GMT
    9. If-None-Match:
      W/"3864-1502075062000"
    10. Referer:
      http://smartsowo.com/
    11. Upgrade-Insecure-Requests:
      1
    12. User-Agent:
      Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Mobile Safari/537.36
Name

 logo.pngfavicon.ico

  1. Accept:
    text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
  2. Accept-Encoding:
    gzip, deflate
  3. Accept-Language:
    zh-CN,zh;q=0.8,en;q=0.6
  4. Cache-Control:
    no-cache
  5. Connection:
    keep-alive
  6. Cookie:
    Hm_lvt_fbd153e223cf03f359f3793430d98ad0=1502073972,1502160655,1502250279; Hm_lpvt_fbd153e223cf03f359f3793430d98ad0=1502262568; JSESSIONID=B178B1C8029776152BBF8EC3FFEF89F4
  7. Host:
    smartsowo.com
  8. Pragma:
    no-cache
  9. Referer:
    http://smartsowo.com/
  10. Upgrade-Insecure-Requests:
    1
  11. User-Agent:
    Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Mobile Safari/537.36

  1. 缓存后
  2. requestheader
    1. Accept:
      text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    2. Accept-Encoding:
      gzip, deflate
    3. Accept-Language:
      zh-CN,zh;q=0.8,en;q=0.6
    4. Cache-Control:
      max-age=0
    5. Connection:
      keep-alive
    6. Cookie:
      Hm_lvt_fbd153e223cf03f359f3793430d98ad0=1502073972,1502160655,1502250279; Hm_lpvt_fbd153e223cf03f359f3793430d98ad0=1502262568; JSESSIONID=B178B1C8029776152BBF8EC3FFEF89F4
    7. Host:
      smartsowo.com
    8. If-Modified-Since:
      Mon, 14 Aug 2017 03:08:20 GMT
    9. If-None-Match:
      W/"3864-1502680100000"
    10. Referer:
      http://smartsowo.com/
    11. Upgrade-Insecure-Requests:
      1
    12. User-Agent:
      Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Mobile Safari/537.36
    13. 通过Cache-Control的值来判断缓存中是否有这个资源文件,如果有这个文件的缓存,则 通过
      If-Modified-Since和
      If-None-Match值来判断资源文件是否被修改,如果修改重新加载资源返回201 ,页面重新加载图片,如果没有修改则返回304 返回空的responsebody


      1.     @ResponseBody    @RequestMapping("img/{id}.jpg")    public ResponseEntity<byte[]> getImg(@PathVariable Long id,HttpServletRequest request) throws IOException {        String cacheControl = request.getHeader("Cache-Control");        if (cacheControl!=null&&!cacheControl.equals("no-cache")){            return new ResponseEntity<byte[]>( new HttpHeaders(),                HttpStatus.NOT_MODIFIED);        }       /* String eTag = request.getHeader("If-None-Match");        System.out.println(eTag);        if(eTag!=null&&eTag.equals("W/\""+id+"\"")){            return new ResponseEntity<byte[]>( new HttpHeaders(),                HttpStatus.NOT_MODIFIED);        }*/        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"));        }*/        data =  FileUtils.readFileToByteArray(new File(imgBasePath+id+".jpg"));        headers.setContentLength(data.length);//        headers.setCacheControl("no-cache");        headers.setETag("W/\""+id+"\"");        headers.setLastModified(new Date().getTime());//        APPLICATION_OCTET_STREAM        //图片直接下载,导致app无法正常显示//        headers.setContentDispositionFormData("attachment", id+".jpg");        return new ResponseEntity<byte[]>(data, headers,            HttpStatus.CREATED);    }