Glide缓存- 图片URL带token问题

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

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

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

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

解决思路

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

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

public class GlideUrl {

    private final URL url;
    private final String stringUrl;
    ...
    public GlideUrl(URL url) {
        this(url, Headers.DEFAULT);
    }

    public GlideUrl(String url) {
        this(url, Headers.DEFAULT);
    }

    public GlideUrl(URL url, Headers headers) {
        ...
        this.url = url;
        stringUrl = null;
    }

    public GlideUrl(String url, Headers headers) {
        ...
        this.stringUrl = url;
        this.url = null;
    }
    
    public String getCacheKey() {
        return stringUrl != null ? stringUrl : url.toString();
    }
    ...
}

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

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

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

解决方法

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

public class MyGlideUrl extends GlideUrl {

    private String mUrl;

    public MyGlideUrl(String url) {
        super(url);
        mUrl = url;
    }

    @Override
    public String getCacheKey() {
        return mUrl.replace(findTokenParam(), "");
    }

    private String findTokenParam() {
        String tokenParam = "";
        int tokenKeyIndex = mUrl.indexOf("?token=") >= 0 ? mUrl.indexOf("?token=") : mUrl.indexOf("&token=");
        if (tokenKeyIndex != -1) {
            int nextAndIndex = mUrl.indexOf("&", tokenKeyIndex + 1);
            if (nextAndIndex != -1) {
                tokenParam = mUrl.substring(tokenKeyIndex + 1, nextAndIndex + 1);
            } else {
                tokenParam = mUrl.substring(tokenKeyIndex);
            }
        }
        return tokenParam;
    }
}

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

使用方法

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

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

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

发布了51 篇原创文章 · 获赞 97 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/m0_37218227/article/details/83718505
今日推荐