Rxjava2+Retrofit2请求验证码,请求头加入JSESSIONID。
来源:互联网 发布:电视剧直播软件 编辑:程序博客网 时间:2024/05/21 11:18
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());
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
阅读全文
0 0
- Rxjava2+Retrofit2请求验证码,请求头加入JSESSIONID。
- Retrofit2+RxJava2进行网络请求
- Android RxJava2+Retrofit2搭建网络请求框架
- RxJava2和Retrofit2实现简单网络请求
- rxjava2+rxandroid2+retrofit2 封装网络请求
- Retrofit2+Rxjava2如何主动取消网络请求
- Retrofit2+Rxjava2网络请求框架的封装
- RxJava2+Retrofit2实现网络请求和解析封装
- Android使用Retrofit2.0和RxJava2.0处理网络请求
- Retrofit2+Okhttp3+Rxjava2通过SOAP协议请求WebService
- 给你一个原汁原味的Retrofit2+Rxjava2的请求封装
- RxJava2+Retrofit2网络请求框架封装及使用
- 基于RxJava2+Retrofit2的简单易用网络请求框架
- Rxjava2.0和Retrofit2.0结合使用(2)post请求
- 简单上手的Retrofit2+Rxjava2网络请求框架
- 简单实现RxJava2+Okhttp+Retrofit2的网络请求框架封装
- 优雅地封装使用rxjava2+retrofit2发送http请求
- Retrofit2结合RxJava2简单处理嵌套请求(flatMap)
- pycharm激活码
- 学习笔记第四篇之python编码问题
- Week 7算法分析作业
- Labelme、LabelImg的安装和使用
- 一位资深程序员的程序人生总结十三条
- Rxjava2+Retrofit2请求验证码,请求头加入JSESSIONID。
- 枚举算法1
- 3D轮播图与外层ViewPager滑动冲突问题
- Mybatis
- iKcamp团队制作|基于Koa2搭建Node.js实战(含视频)☞ 中间件用法
- CORS 跨域 access-control-allow-headers 的问题
- 每天一个linux命令(30): chown命令
- 请手动释放你的资源(Please release resources manually)
- 批量行编辑,批量去注释