有一种需求是这样子,在注册这个功能上,利用cookie进行标识当前手机,进行短信验证码的获取。
流程是这样的(有点坑,csdn好像用代码画不了下面这个图):
这时候问题来了,我们需要获取Glide请求验证码的Cookie,这该怎么解决呢?
结合okhttp,Glide使用okhttp进行加载,然后okhttp进行cookie管理,发送请求获取短信验证码。
导入使得glide支持okhttp的包(注意后面有aar,就是代表导入aar的包,包含资源的。这里的这个包 包含了Manifest,里面有对应的服务等)
compile 'com.github.bumptech.glide:okhttp3-integration:1.4.0@aar'
自定义Okhttp的cookie管理,在Okhttp初始化的时候设置进去。
因为发送短信的请求需要利用图形验证码请求的cookie,所以cookie管理的逻辑就是,保存上一次请求的cookie,下一次请求的时候利用上一次请求的cookie。
/**
* 特殊的自动管理Cookies
*/
private class CookiesManager implements CookieJar {
//保存每个url的cookie
private HashMap> cookieStore = new HashMap<>();
//上一个请求url
private HttpUrl url;
@Override
public void saveFromResponse(HttpUrl httpUrl, List list) {
//保存链接的cookie
cookieStore.put(httpUrl, list);
//保存上一次的url,供给下一次cookie的提取。
url = httpUrl;
}
@Override
public List loadForRequest(HttpUrl httpUrl) {
//加载上一个链接的cookie
List cookies = cookieStore.get(url);
return cookies != null ? cookies : new ArrayList();
}
}
//初始化okhttp,
mOkHttpClient = new OkHttpClient.Builder()
.cookieJar(new CookiesManager()) //cookie管理
.build();
//不Register的话,图片请求不会经过OkHttpClient
Glide.get(MainActivity.this)
.register( //使用okhttp作为图片请求
GlideUrl.class
,InputStream.class
,new OkHttpUrlLoader.Factory(mOkHttpClient));
如常加载,因为是图像验证码,所以这里禁止缓存。
Glide.with(MainActivity.this)
.load(PicUrl)
.skipMemoryCache(true) //验证码不缓存
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView);
这时候加载的Glide加载的图片就是用okhttp进行加载的了,所以会有保存到cookie。
获取图形验证码完毕之后,输入验证码到编辑框,然后继续请求短信验证码接口:
private void postAsynHttp(String code) {
//请求短信验证码的接口
String url = SmsUrl+"?captcha="+code;
//创建请求
Request request = new Request.Builder()
.url(url)
.get()
.build();
final Call call = mOkHttpClient.newCall(request);
//在线程执行
new Thread(new Runnable() {
@Override
public void run() {
try {
Response response = call.execute();
//打印请求结果
Log.e("@@", response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
这就可以了。主要是cookie的管理。
图形验证码不要用Glide加载了。 直接用网络框架例如okhttp下载回来,但是cookie还是得用上面的方式管理。
注意: 这篇文章不是说Glide加载需要验证的图片。