当前位置:   article > 正文

Glide缓存- 图片URL带token问题_glide 缓存 token

glide 缓存 token

         部门项目的图片资源都是存放在阿里云上面的,最近项目重构,领导决定将内部图片和资料存放在360云上,因此部分支持换成了360云。而360云为了对图片资源进行保护,会在图片的URL地址的基础之上再加上一个令牌参数也就是说,一张图片的URL地址可能会是如下格式:

http://url.com/image.jpg?token=d9caa6e02c990b0a

        而使用滑翔加载这张图片的话,也就会使用这个URL地址来组成缓存的关键。

        但是接下来问题就来了,令牌作为一个验证身份的参数并不是一成不变的,很有可能时时刻刻都在变化。而如果令牌变了,那么图片的URL也就跟着变了,图片的URL变了,缓存关键也就跟着变了。结果就造成了,明明是同一张图片,就因为令牌不断在改变,导致滑翔的缓存功能完全失效了,这是一个很棘手的问题。项目组的图片加载框架是下滑,但是吉尔德不能直接解决这个问题。为此,我上网找了一些解决方法,再次记录。

解决思路

        一个图片的URL都是唯一的,假设我们可以将令牌后缀过滤,那么就可以正常使用滑翔自带的缓存,解决这个问题。

滑行中是通过GlideUrl这个对象来作为缓存识别的。所以,大佬们的教程也是先查看对应源码。

  1. public class GlideUrl {
  2. private final URL url;
  3. private final String stringUrl;
  4. ...
  5. public GlideUrl(URL url) {
  6. this(url, Headers.DEFAULT);
  7. }
  8. public GlideUrl(String url) {
  9. this(url, Headers.DEFAULT);
  10. }
  11. public GlideUrl(URL url, Headers headers) {
  12. ...
  13. this.url = url;
  14. stringUrl = null;
  15. }
  16. public GlideUrl(String url, Headers headers) {
  17. ...
  18. this.stringUrl = url;
  19. this.url = null;
  20. }
  21. public String getCacheKey() {
  22. return stringUrl != null ? stringUrl : url.toString();
  23. }
  24. ...
  25. }

          GlideUrl类的构造函数接收两种类型的参数一种是URL字符串,一种是URL对象。然后getCacheKey()方法中的判断逻辑非常简单,如果传入的是URL字符串,那么就直接返回这个字符串本身,如果传入的是URL对象,那么就返回这个对象的toString()后的结果。

  1. public String getCacheKey() {
  2. return stringUrl != null ? stringUrl : url.toString();
  3. }

        因此,我们可以重写getCacheKey()这个方法,来过滤调图片URL里面的令牌后缀。

解决方法

      创建一个MyGlideUrl继承自GlideUrl,代码如下所示:

  1. public class MyGlideUrl extends GlideUrl {
  2. private String mUrl;
  3. public MyGlideUrl(String url) {
  4. super(url);
  5. mUrl = url;
  6. }
  7. @Override
  8. public String getCacheKey() {
  9. return mUrl.replace(findTokenParam(), "");
  10. }
  11. private String findTokenParam() {
  12. String tokenParam = "";
  13. int tokenKeyIndex = mUrl.indexOf("?token=") >= 0 ? mUrl.indexOf("?token=") : mUrl.indexOf("&token=");
  14. if (tokenKeyIndex != -1) {
  15. int nextAndIndex = mUrl.indexOf("&", tokenKeyIndex + 1);
  16. if (nextAndIndex != -1) {
  17. tokenParam = mUrl.substring(tokenKeyIndex + 1, nextAndIndex + 1);
  18. } else {
  19. tokenParam = mUrl.substring(tokenKeyIndex);
  20. }
  21. }
  22. return tokenParam;
  23. }
  24. }

       可以看到,这里我重写了getCacheKey()方法,在里面加入了一段逻辑用于将图片URL地址中的令牌参数的这一部分移除掉。这样getCacheKey()方法得到的就是一个没有令牌参数的URL地址,从而不管令牌怎么变化,最终滑翔的缓存键都是固定不变的了。

使用方法

       当然,定义好了MyGlideUrl还得使用它才行,将加载图片的代码改成如下方式即可:

  1. Glide.with(this)
  2. .load(new MyGlideUrl(url))
  3. .into(imageView);

       我们需要在负载()方法中传入这个自定义的MyGlideUrl对象,而不能再像之前那样直接传入URL字符串了。不然的话滑翔在内部还是会使用原始的GlideUrl类,而不是我们自定义的MyGlideUrl类。这样我们就将这个棘手的缓存问题给解决掉了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/947301
推荐阅读
相关标签
  

闽ICP备14008679号