Glide结合OkHttp保证短信验证接口携带图形验证码接口返回Cookie值去做网络请求

一、实现效果

在这里插入图片描述

二、步骤

注意:仅展示核心部分代码

1、导入依赖

api 'com.github.bumptech.glide:glide:4.10.0'
kapt 'com.github.bumptech.glide:compiler:4.10.0'
api 'com.squareup.okhttp3:okhttp:3.11.0'
api 'com.squareup.okhttp3:logging-interceptor:3.11.0'

2、自定义MyAppGlideModule类

自定义Okhttp的cookie管理,在Okhttp初始化的时候设置进去。并在Glide中注册请求对象。

因为发送短信的请求需要利用图形验证码请求的cookie,所以cookie管理的逻辑就是,保存上一次请求的cookie,下一次请求的时候利用上一次请求的cookie。

大概业务流程原理如图所示:
在这里插入图片描述
代码如下:

package com.custom.jfrb.http;import android.content.Context;
import androidx.annotation.NonNull;
import com.bumptech.glide.Glide;
import com.bumptech.glide.Registry;
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.integration.okhttp3.OkHttpUrlLoader;
import com.bumptech.glide.load.model.GlideUrl;
import com.bumptech.glide.module.AppGlideModule;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import okhttp3.Cookie;
import okhttp3.CookieJar;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
//......@GlideModule
public class MyAppGlideModule extends AppGlideModule {public static OkHttpClient okHttpClient;@Overridepublic void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) {okHttpClient = new OkHttpClient.Builder().cookieJar(new CookiesManager()).build();registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(okHttpClient));}@Overridepublic boolean isManifestParsingEnabled() {return false;}/*** Cookie管理类*/private class CookiesManager implements CookieJar {//保存每个url的cookieprivate HashMap<HttpUrl, List<Cookie>> cookieStore = new HashMap<>();//上一个请求urlprivate HttpUrl url;@Overridepublic void saveFromResponse(HttpUrl httpUrl, List<Cookie> list) {//保存链接的cookiecookieStore.put(httpUrl, list);//保存上一次的url,供给下一次cookie的提取。url = httpUrl;}@Overridepublic List<Cookie> loadForRequest(HttpUrl httpUrl) {//加载上一个链接的cookieList<Cookie> cookies = cookieStore.get(url);return cookies != null ? cookies : new ArrayList<Cookie>();}}
}

3、自定义输入图形验证码弹窗Dialog

package com.custom.jfrb.ui.jfrb.login;import android.annotation.SuppressLint;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
import com.alibaba.fastjson.JSONObject;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import org.jetbrains.annotations.NotNull;@SuppressLint("ValidFragment")
public class SMSCheckDialog extends DialogFragment {private ImageView ivCode;private SMSCheckCallback checkCallback;//手机号private String phone;//账号名private String account;//可以把请求短信验证码接口时候需要的接口参数通过构造方法传进来public SMSCheckDialog(SMSCheckCallback callback, String phone,String account) {this.checkCallback = callback;this.phone = phone;this.account = account;}@Overridepublic void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setStyle(STYLE_NORMAL, R.style.CustomDialog);setCancelable(false);}@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.dialog_sms_check, container, false);ImageView ivDelete = view.findViewById(R.id.iv_delete);ivCode = view.findViewById(R.id.iv_code);ivCode.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//加载图形验证码loadCapture();}});loadCapture();final EditText etCode = view.findViewById(R.id.et_code);ivDelete.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//关闭图形验证码弹窗dismiss();}});Button ivSure = view.findViewById(R.id.iv_login);ivSure.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (TextUtils.isEmpty(etCode.getText().toString())) {RnToast.showToast(getContext(),"请输入图形验证码");return;}//图形验证码输入完成后,发送短信验证码请求new Thread(new Runnable() {@Overridepublic void run() {//去请求发送短信验证码getSmsCode(account,phone,etCode.getText().toString());}}).start();}});return view;}/*** 加载显示图形验证码URL*/private void loadCapture(){if (getContext() != null) {Log.e("mylog","执行loadCapture请求");String url = UserService.getImageCodeURL();Glide.with(getContext()).load(url).skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE).into(ivCode);}}/*** 请求短信验证码* @param account 账户* @param phone 手机号码* @param imageCode 图片验证码*/private void getSmsCode(String account,String phone,String imageCode){Map<String,Object> map = new HashMap<>();map.put("userName",account);map.put("telephone",phone);map.put("captchaCheckCode",imageCode);JSONObject jsonObject = new JSONObject(map);MediaType JSON = MediaType.parse("application/json; charset=utf-8");RequestBody body = RequestBody.create(jsonObject.toString(),JSON);String url = "网络请求地址......";Log.d("mylog_sms: ","短信验证码获取请求参数:"+"_账号:"+account+"_手机号:"+phone+"_验证码:"+imageCode);Request request = new Request.Builder().url(url).post(body).build();MyAppGlideModule.okHttpClient.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(@NotNull Call call, @NotNull IOException e) {Log.d("mylog_sms: ","短信验证码接口请求失败"+e.toString());}@Overridepublic void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {Log.d("mylog_sms: ","短信验证码请求成功"+response.toString());if (response == null){Log.d("mylog_sms: ","请求失败!");checkCallback.onGetCodeFailed(getString(R.string.send_fail));dismiss();return;}if (response.body() == null){Log.d("mylog_sms: ","请求失败!");checkCallback.onGetCodeFailed(getString(R.string.send_fail));dismiss();return;}String result = response.body().string();JSONObject object = (JSONObject) JSONObject.parse(result);Log.d("mylog_sms: ","接受短信验证码接口返回数据:"+object);if ((int)object.get("code") == 0){Log.d("mylog_sms: ","验证成功!");checkCallback.onGetCode();}else{Log.d("mylog_sms: ","验证错误");checkCallback.onGetCodeFailed(object.get("msg").toString());}dismiss();}});}public interface SMSCheckCallback {void onGetCode();void onGetCodeFailed(String msg);}
}

4、相关布局文件

styles.xml文件中放入如下自定义Style

<style name="CustomDialog" parent="android:style/Theme.Dialog"><!--背景颜色及和透明程度--><item name="android:windowBackground">@android:color/transparent</item><!--是否去除标题 --><item name="android:windowNoTitle">true</item><!--是否去除边框--><item name="android:windowFrame">@null</item><!--是否浮现在activity之上--><item name="android:windowIsFloating">true</item><!--是否模糊--><item name="android:backgroundDimEnabled">true</item></style>

Dialog图形验证码验证弹窗的布局文件

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"><androidx.constraintlayout.widget.ConstraintLayoutandroid:layout_width="300dp"android:layout_height="wrap_content"android:layout_gravity="center"android:background="@drawable/shape_white_8"><ImageViewandroid:id="@+id/iv_delete"android:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="12dp"android:src="@drawable/close"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintTop_toTopOf="parent" /><TextViewandroid:id="@+id/tv_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="24dp"android:layout_marginTop="20dp"android:layout_marginEnd="10dp"android:text="请输入图形验证码"android:textColor="#999999"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/iv_delete" /><ImageViewandroid:id="@+id/iv_code"android:layout_width="70dp"android:layout_height="28dp"android:layout_marginTop="8dp"android:layout_marginEnd="24dp"android:scaleType="fitXY"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintTop_toBottomOf="@id/tv_text" /><EditTextandroid:id="@+id/et_code"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_marginStart="24dp"android:layout_marginEnd="8dp"android:textColor="@color/color_222222"android:textSize="16sp"android:hint="@string/enter_image_code"android:paddingTop="10dp"android:paddingBottom="5dp"android:background="@drawable/edittext_bg"android:textCursorDrawable="@drawable/edit_text_cursor"android:textColorHint="@color/color_D5D5D5"android:inputType="text"android:maxLength="4"app:layout_constraintBottom_toBottomOf="@+id/iv_code"app:layout_constraintEnd_toStartOf="@id/iv_code"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="@+id/iv_code" /><Buttonandroid:id="@+id/iv_login"android:layout_width="match_parent"android:layout_height="40dp"android:layout_marginTop="36dp"android:layout_marginBottom="36dp"android:layout_marginStart="36dp"android:layout_marginEnd="36dp"android:background="@drawable/shape_jfrb_login_button"android:textColor="@color/white"android:text="@string/login_confirm"android:textSize="@dimen/sp_16"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/iv_code" /></androidx.constraintlayout.widget.ConstraintLayout>
</FrameLayout>

三、使用

图形验证码输入弹窗的调用

//图形验证码校验
SMSCheckDialog checkDialog = new SMSCheckDialog(new SMSCheckDialog.SMSCheckCallback() {@Overridepublic void onGetCode() {//短信验证码接口请求成功countdown();}@Overridepublic void onGetCodeFailed(String msg) {runOnUiThread(new Runnable() {@Overridepublic void run() {//短信验证码接口请求失败}});}}, phone,account);checkDialog.show(getSupportFragmentManager(), "SMSCheckDialog");

发送短信验证码成功后等待间隙的60s倒计时文字显示

 private void countdown() {final long count = 60L;Observable.intervalRange(0, 61, 0, 1, TimeUnit.SECONDS).map(new Function<Long, Long>() {@Overridepublic Long apply(Long aLong) throws Exception {return count - aLong;}}).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<Long>() {@Overridepublic void onSubscribe(Disposable d) {
//                        addSubscribe(d);}@SuppressLint("SetTextI18n")@Overridepublic void onNext(Long aLong) {mTvGetCode.setText(aLong + "s");mTvGetCode.setEnabled(false);}@Overridepublic void onError(Throwable e) {}@Overridepublic void onComplete() {mTvGetCode.setText(getString(R.string.change_phone9));mTvGetCode.setEnabled(true);}});}

附:参考Glide结合Okhttp做cookie管理实现注册需求的图片验证码短信验证码功能

四、完成,Nice!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/208376.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【EMFace】《EMface: Detecting Hard Faces by Exploring Receptive Field Pyramids》

arXiv-2021 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method5 Experiments5.1 Datasets and Metrics5.2 Ablation Study5.3 Comparison with State-of-the-Arts 6 Conclusion&#xff08;own&#xff09; 1 Background and Motivatio…

腾讯云云服务器功能与优势

腾讯云云服务器&#xff08;Cloud Virtual Machine&#xff0c;CVM&#xff09;是腾讯云提供的可扩展的计算服务。使用云服务器 CVM 避免了使用传统服务器时需要预估资源用量及前期投入的问题&#xff0c;帮助您在短时间内快速启动任意数量的云服务器并及时部署应用程序。 云服…

<软考>软件设计师-1计算机组成与结构(总结)

(一)计算机系统基础知识 1 计算机硬件组成 计算机的基本硬件系统由运算器、控制器、存储器、输入设备 和 输出设备 5大部件组成。 1 运算器、控制器等部件被集成在一起统称为中央处理单元(CPU) 。CPU是硬件系统的核心&#xff0c;用于数据的加工处理&#xff0c;能完成各种算…

Linux系统安装Docker-根据官方教程教程(以Ubuntu为例)

Linux系统安装Docker-根据官方教程教程&#xff08;以Ubuntu为例&#xff09; 1. 背景介绍2. 环境配置2.1 软件环境要求2.2 软件下载2.3 文档地址2.3 必备命令工具下载 3. 安装Docker3.1 使用root用户操作后续命令3.2 卸载可能存在的旧版本 4. 安装Docker4.1 更新依赖包4.2 配置…

电脑提示mfc100u.dll缺失如何解决?分享有效的5个解决方法

由于各种原因&#xff0c;电脑可能会出现一些问题&#xff0c;其中之一就是电脑提示mfc100u.dll的错误。这个问题可能会导致电脑无法正常运行某些程序或功能。为了解决这个问题&#xff0c;我将分享验证有效的五个修复方法&#xff0c;帮助大家恢复电脑的正常运行。 首先&#…

时间戳转换为日期格式(封装)

在前端开发中&#xff0c;后端有时候传过来的数据为时间戳的格式 而我们又需要将其转换为时间格式来回显。所以需要一个可以转换时间戳的工具。 封装函数 构建一个函数&#xff0c;传入我们的时间戳和我们想要的时间格式&#xff0c;通过JavaScript的时间对象方法&#xff0c;…

基于springboot,vue高校图书馆管理系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;vueelementUI 服务端技术&#xff1a;springbootmybatisredis 本项…

【Unity入门】声音组件AudioSource简介及实现声音的近大远小

AudioSource组件 将需要播放声音的物体挂载Audio Listener组件&#xff0c;实现声音的播放 AudioSource组件属性 &#xff08;1&#xff09;AudioClip&#xff08;音频剪辑&#xff09;&#xff1a;指定播放的音频文件。 &#xff08;2&#xff09;Output&#xff08;音频输…

Python提取PDF表格(基于AUTOSAR_SWS_CANDriver.pdf)

个人学习笔记&#xff0c;仅供参考。 需求&#xff1a;提取AUTOSAR SWS中所有的API接口信息&#xff0c;用于生成C代码。 此处以AUTOSAR_SWS_CANDriver.pdf为例&#xff0c;若需要提取多个SWS文件&#xff0c;遍历各个文件即可。 1.Python包 pdfplumber是一款完全用python开…

HTTP 基本概念(计算机网络)

一、HTTP 是什么&#xff1f; HTTP(HyperText Transfer Protocol) &#xff1a;超文本传输协议。 HTTP 是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」。 「HTTP 是用于从互联网服务器传输超文本到本地浏览器的协议…

检测判断IP合法性API接口

检测判断IP合法性API接口 一、检测判断IP合法性API接口二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例 三、 如何获取appKey和uid1、申请appKey:2、获取appKey和uid 四、重要说明 一、检测判断IP合法性API接口 一款免费的帮助你检测判断IP合法性API接口 二、…

基于算能的国产AI边缘计算盒子,内置强悍TPU | 32TOPS INT8算力

边缘计算盒子 内置强悍TPU | 32TOPS INT8算力 ● 支持浮点运算的TPU平台盒子&#xff0c;支持32TOPSINT8&#xff0c;16TFLOPSFP16&#xff0c;2TFLOPSFP32高算力 ● 单芯片最高支持32路H.264 & H.265的实时解码能力 ● 支持国产算法框架Paddle飞桨&#xff0c;适配Caf…

【开源存储】glusterfs分布式文件系统部署实践

文章目录 一、前言1、介绍说明2、术语说明3、冗余模式3.1、复制卷&#xff08;Replication&#xff09;3.2、纠删卷&#xff08;Erasure Code&#xff09; 二、部署说明1、软件安装2、集群部署2.1、前置准备2.2、部署过程a、添加节点b、配置存储c、创建glusterfs卷d、客户端挂载…

外包搞了6年,技术退步明显......

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

k8s中pod的hostport端口突然无法访问故障处理

故障背景&#xff1a; 租户告知生产环境的sftp突然无法访问了&#xff0c;登录环境查看sftp服务运行都是正常的&#xff0c;访问sftp的hostport端口确实不通。 故障处理过程 既然访问不通那就先给服务做个全面检查&#xff0c;看看哪里出了问题&#xff0c;看下sftp日志&#…

进程间通信 管道

在Linux中&#xff0c;管道是一种通信机制&#xff0c;用于将一个程序的输出直接连接到另一个程序的输入。从本质上说&#xff0c;管道也是一种文件&#xff0c;但它又和一般的文件有所不同&#xff0c;它可以克服使用文件进行通信的两个问题&#xff0c;具体表现为限制管道的大…

自动驾驶学习笔记(十一)——高精地图

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo Beta宣讲和线下沙龙》免费报名—>传送门 文章目录 前言 高精地图 地图采集 底图制作 地图…

SpringCloudSleuth+Zipkin 整合及关键包汇总

背景 整合了一下 SpringCloudSleuth Zipkin&#xff0c;本来是很简单的东西&#xff0c;但是最终导出依赖包时没注意&#xff0c;导致目标服务始终没有被纳入 Zipkin 的链路追踪中&#xff0c;本文记录这个过程及关键依赖包。 部署zipkin 官网下载最新的 zipkin 可执行包&a…

使用trigger-forward跨流水线传递参数

参考文档&#xff1a;https://docs.gitlab.com/ee/ci/yaml/#triggerforward 今天给大家介绍一个gitlab CI/CD的关键字 - forward&#xff0c;该关键字是一个比较偏的功能&#xff0c;但同时也是一个很实用的功能&#xff0c;我们通过在gitlab的ci文件中使用forward关键字&#…

软件测试人员掌握哪些技术可以立马跳槽涨薪?

1、文档能力&#xff1a;各种文档的编写能力 因为不管是功能测试工程师还是自动化测试工程师都必须要跟各种文档打交道&#xff0c;所以最基本的需要掌握一些常用的文档编辑的使用&#xff0c;比如说 常用编写测试用例的工具&#xff1a;excel表格或者wps等 编写需求分析需要…