Rxjava2+Retrofit2请求验证码,请求头加入JSESSIONID。
2017-12-22 11:19
141 查看
Rxjava2 Retrofit2 OkHttp3 简直就是绝配。凡是晚上不能解决的BUG,都会来此记录一下
请求验证码,Glide 方式加载验证码Bitmap,
验证码,是可以正常加载,但是天真了,验证码一个接口,登录是一个接口,请求登录接口返回验证码验证失败,服务器通过Session 在服务器端记录信息确定用户身份。
原理:服务器执行Session 机制会生成Session的id 值,此id值会发送给客户端,客户端请求的时候把这个id值放到Http请求头中,客户端会把这个Id值用Cookie 存下来。android 端用SharedPrefence 存放这个cookie (cookie 欺骗?)
所以在请求头添加JSESSIONID,可以通过OkHttp的拦截器
调用
因此用Rxjava2请求验证码的代码
请求验证码,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
相关文章推荐
- python3 requests请求截取JSESSIONID
- javawebday29(JSESSIONID 获取 一次性图形验证码)
- HttpClient模拟请求登录的jSessionId无法手动修改的问题
- Java中session保存和获取验证码获取的id不一致问题
- 由JSESSIONID谈cookie与SESSION的区别和联系
- 从session实现机制分析模拟请求验证码的可行性(转)
- 运行中修改协调器PAN ID和Channel,协调器广播至所有的设备重启加入新建后的网络
- Shiro在请求头中获取sessionId以及rememberMe信息
- Bootstrap中文本框的宽度变窄并且加入一副验证码图片的实现方法
- 去掉shiro登录时url里的JSESSIONID
- jsessionid用途
- 在程序中加入UAC权限请求
- 以整体思维看问题:解决单页应用,系统角色请求覆盖身份唯一标识(本项目中是session_id命名的)发送请求问题
- WEB登录页面加入简单验证码
- vs2005下彩色验证码的实现(可自由定义是否加入干扰点、验证码位数等验证码显示效果) <br />转自<a href="http://www.cnblogs.com/zm235/archive/2006/10/02/520233.html" target="_blank">http://www.cnblogs.com/zm235/archive/2006/10/02/520233.html</a>
- vs2005下彩色验证码的实现(可自由定义是否加入干扰点、验证码位数等验证码显示效果)
- url中的jsessionid解释
- HttpClient使用SESSIONID模拟用户发送请求
- jsessionid 对JAVA WEB jsessionid的剖析
- java web强制更新JSESSIONID