您的位置:首页 > 编程语言 > Java开发

Rxjava2+Retrofit2请求验证码,请求头加入JSESSIONID。

2017-12-22 11:19 141 查看
Rxjava2 Retrofit2 OkHttp3 简直就是绝配。凡是晚上不能解决的BUG,都会来此记录一下

请求验证码,Glide 方式加载验证码Bitmap,

Glide.with(this)
.load(Constants.CODE_URL) //验证码接口
.asBitmap()
.skipMemoryCache(true)  //跳过内存缓存,为了可以切换验证码
.diskCacheStrategy(DiskCacheStrategy.NONE)

.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
ivCode.setImageBitmap(resource);
}
});


验证码,是可以正常加载,但是天真了,验证码一个接口,登录是一个接口,请求登录接口返回验证码验证失败,服务器通过Session 在服务器端记录信息确定用户身份。

原理:服务器执行Session 机制会生成Session的id 值,此id值会发送给客户端,客户端请求的时候把这个id值放到Http请求头中,客户端会把这个Id值用Cookie 存下来。android 端用SharedPrefence 存放这个cookie (cookie 欺骗?)

所以在请求头添加JSESSIONID,可以通过OkHttp的拦截器

//cookie 读取拦截器
public class CookieReadInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request.Builder builder = chain.request().newBuilder();
HashSet<String> stringSet = (HashSet<String>) SpUtil.getStringSet(MyApplication.getInstance(), Constants.LOGIN_COOKIE, new HashSet<String>());
for (String cookie : stringSet) {
builder.addHeader("Cookie", cookie);
}

return chain.proceed(builder.build());
}
}


//存储Cookie拦截器
public class CookieSaveInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Response originalResponse = chain.proceed(chain.request());

if (!originalResponse.headers("Set-Cookie").isEmpty()) {
HashSet<String> cookies = new HashSet<>();

for (String header : originalResponse.headers("Set-Cookie")) {
cookies.add(header);
}

SpUtil.putStringSet(MyApplication.getInstance(), Constants.LOGIN_COOKIE, cookies);

}
return originalResponse;
}
}


调用

builder.addInterceptor(new CookieReadInterceptor());
builder.addInterceptor(new CookieSaveInterceptor());


因此用Rxjava2请求验证码的代码

RetrofitService.getApi()
.getValidCode()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.map(new Function<ResponseBody, InputStream>() {
@Override
public InputStream apply(@NonNull ResponseBody responseBody) throws Exception {
return responseBody.byteStream();
}
})
.map(new Function<InputStream, Bitmap>() {
@Override
public Bitmap apply(@NonNull InputStream is) throws Exception {
return BitmapFactory.decodeStream(is);
}
})
.subscribe(new Consumer<Bitmap>() {
@Override
public void accept(Bitmap bitmap) throws Exception {
ivCode.setImageBitmap(bitmap);
}
});
可以看到在请求头中添加了JSESSIONID

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息