转载请说明出处:

前言:我相信现在很多人都在用OKhttp作为网络请求库,为什么OKhttp会受到这么多人的青睐呢,谷歌也不例外(据我了解到它是唯一一个被谷歌认可的第三方网络请求库),

原因有很多,对于我来说,OKhttp对我最受用的是它的拦截器机制

拦截器的分类:

1.网络拦截器

2.应用拦截器

借鉴文章: http://www.jianshu.com/p/2710ed1e6b48,对两种拦截器的详细介绍

终于开始文章的主题了:

原理:利用应用拦截器对请求进行拦截,重定向

步骤:1.发起一个网络请求,拦截到响应结果

2.判断响应结果是否为token失效

3.如果token失效,获取新的token

4.携带新的token,重新请求

好了大概步骤已经梳理好了,判断token失效的方法是什么呢?

大概有两种:

1.http code 标记一个不为200的code(与服务器商定好的:比如当返回的code值为201则表示token失效)

2.在响应数据的data里面例如:{"requestStatus":{"code":42441,"msg":"token失效请重新登录","timestamp":1492847318460},"data":""}

到了这里那我们开始吧:

第一种的验证方法:

public static void tokenInterceptor1(){
new Interceptor() {@Overridepublic Response intercept(Chain chain) throws IOException {//拿到请求体,并添加header携带上tokenRequest mRequest = chain.request().newBuilder().addHeader("Token", Token).build();//拿到响应体Response mResponse = chain.proceed(mRequest);//假设返回的code为201时表示token失效
if (mResponse.code()==201){//重新获取新token//这用了一个特殊接口来获取新的TokenCall<String> call = RetrofitFactory.getInstence().API().loginByToken("123456", Token);//拿到请求体Request tokenRequest = call.request();//获取响应体Response tokenResponse = chain.proceed(tokenRequest);//我这假设新的token是在header里返回的//我们拿到新的token头List<String> listHeader = tokenResponse.headers().values("Token");if (listHeader != null) {//重新赋值到新的tokenToken = listHeader.get(0);}//这是只需要替换掉之前的token重新请求接口就行了Request newRequest = mRequest.newBuilder().header("Token", Token).build();return chain.proceed(newRequest);}return mResponse;}};}

第二种的方法

    public static Interceptor tokeInterceptor2() {return new Interceptor() {@Overridepublic Response intercept(Chain chain) throws IOException {/*** 1.拦截到返回的数据* 2.判断token是否失效* 3.失效获取新的token* 4.重新请求接口*///拿到请求体,并添加header携带上tokenRequest mRequest = chain.request().newBuilder().addHeader("Token", Token).build();//拿到响应体Response mResponse = chain.proceed(mRequest);ResponseBody responseBody = mResponse.body();//得到缓冲源BufferedSource source = responseBody.source();//请求全部source.request(Long.MAX_VALUE); // Buffer the entire body.Buffer buffer = source.buffer();Charset charset = UTF8;MediaType contentType = responseBody.contentType();if (contentType != null) {charset = contentType.charset(UTF8);}//读取返回数据String bodyString = buffer.clone().readString(charset);if (bodyString != null) {//处理返回的数据我这创建了一个BaseEntity来将数据转化为对象BaseEntity bean = JSON.parseObject(bodyString, BaseEntity.class);//假设当返回的code为42444时token失效if (bean.getCode() == 42444) {//重新获取新token//这用了一个特殊接口来获取新的TokenCall<String> call = RetrofitFactory.getInstence().API().loginByToken("123456", Token);//拿到请求体Request tokenRequest = call.request();//获取响应体Response tokenResponse = chain.proceed(tokenRequest);//我这假设新的token是在header里返回的//我们拿到新的token头List<String> listHeader = tokenResponse.headers().values("Token");if (listHeader != null) {//重新赋值到新的tokenToken = listHeader.get(0);}//这是只需要替换掉之前的token重新请求接口就行了Request newRequest = mRequest.newBuilder().header("Token", Token).build();return chain.proceed(newRequest);}}return chain.proceed(mRequest);}};}

最后贴一个实体类BaseEntity

public class BaseEntity<T> {private static int SUCCESS_CODE=42440;//成功的codeprivate int code;private String msg;private T data;public boolean isSuccess(){return getCode()==SUCCESS_CODE;}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public T getData() {return data;}public void setData(T data) {this.data = data;}}

OKhttp 拦截器Intercept token失效验证相关推荐

  1. vue ajax拦截器,Vue-resource拦截器判断token失效跳转详解

    本文主要为大家带来一篇Vue-resource拦截器判断token失效跳转的实例.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧,希望能帮助到大家. 在拦截器中设置全局的 ...

  2. angular4 使用HttpClient拦截器 检查token失效,返回登录页面

    1.首先创建一个拦截器服务:InterceptorService.ts 2.在app.module.ts文件里引入拦截器 import {InterceptorService} from './Int ...

  3. OkHttp协议介绍以及文件下载和上传+OkHttp协议封装+OkHttp拦截器____SpringBoot——集成Okhttp3

    OkHttp协议 okhttp是一个第三方类库,用于android中请求网络 这是一个开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献(该公司还贡献了Picasso和LeakCan ...

  4. 面试宝典三 --学科管理模块(拦截器,token,统一异常处理)

    面试宝典 需求分析 涉及到的表,实体类,页面 学科管理页面跳转 新增学科 分析 前端统一设置拦截器 后台登录拦截配置 统一异常处理 RequestException: 前端新增学科 后端逻辑 Cour ...

  5. 前端学习(2708):重读vue电商网站28之通过axios请求拦截器添加 token

    通过axios请求拦截器添加 token,保证拥有获取数据的权限. 原因是,后台那边除开登录的 api,其它都需要进行授权 . 因此,我们可以利用 axios 中interceptors属性,其中有一 ...

  6. 前端学习(2707):重读vue电商网站27之通过axios请求拦截器添加 token

    通过axios请求拦截器添加 token,保证拥有获取数据的权限. 原因是,后台那边除开登录的 api,其它都需要进行授权 . 因此,我们可以利用 axios 中interceptors属性,其中有一 ...

  7. JWT的API鉴权,基于拦截器的token与鉴权

    基于JWT的API鉴权 基于拦截器的token与鉴权 如果我们每个方法都去写一段代码,冗余度太高,不利于维护,那如何做使我们的代码看起来更清爽呢?我们可以  将这段代码放入拦截器去实现 Spring中 ...

  8. dio拦截器 flutter_Flutter开发 Dio拦截器实现token验证过期的功能

    前言: 之前分享过在Android中使用Retrofit实现token失效刷新的处理方案,现在Flutter项目也有"token验证过期"的需求,所以接下来我简单总结一下在Flut ...

  9. SpringBoot项目使用JWT+拦截器实现token验证

    利用token进行用户身份验证 流程 客户端使用用户名和密码请求登录 服务端收到登录请求,验证用户名和密码 验证成功后,服务端会签发一个token,再把这个token返回给客户端 客户端收到token ...

最新文章

  1. Linux命令学习总结:hexdump
  2. iOS js oc相互调用(JavaScriptCore)
  3. 可视化太酷辽!一文了解排序和搜索算法在前端中的应用
  4. Android学习笔记——Handler(二)
  5. linux 为什么要安装gcc和gcc-c++(又叫做g++)
  6. python 编写简单网页服务器
  7. c语言读入图片matlab,将数据从matlab文件读入C语言
  8. layui如何存在多个弹窗_layer重复弹出(layui弹层同时存在多个)的解决方法_心善_前端开发者...
  9. linux 有趣的命令
  10. python异常处理知识点_一文掌握 Python 异常处理的所有知识点
  11. 红米android怎么开机画面,开机画面顶端出现 kernel is not seandroid enforcing 怎么解决...
  12. java 序列化 serialVersionUID 的作用 和 两种添加方式
  13. 南理工计算机学院宋杰,周骏 - 计算机与信息科学学院 - Powered by 西南大学
  14. 英语四级——常考语法【不断更新中】
  15. office 2007 word空格消失的问题
  16. 华为交换机配置(一)
  17. elementPlus使用icon图标不显示解决方法
  18. 苹果8黑屏无法强制开机_iphonexr突然黑屏无法开机怎么解决?
  19. 带你入门多目标跟踪(一)领域概述
  20. easypr最新Linux,EasyPR的基本使用

热门文章

  1. 66亡灵app隐私政策
  2. linux文件系统lv是什么意思,Linux LVM系列(二)lv缩容
  3. 小程序 ios 全面屏底部留出安全距离
  4. 使用wacom数位板配套的笔无法利用按键实现滚动的问题
  5. 勇者斗恶龙UVa 11292
  6. 中南大学计算机学院的辅导员,我院田生伟院长一行访问中南大学计算机学院
  7. 计算机键盘无线遥控器实现方法,利用红外遥控器实现单片机键盘无线式操作
  8. 美观又实用,纯 CSS 悬浮菜单让网站更加出色
  9. 一个失职妈妈的悔过书
  10. win7忘记密码,启动恢复