问题

一次面试遇到的一个问题,其实也是实际开发中很容易遇到的问题,特此记录一下。

当请求某个接口的时候,我们会在请求的header中携带token消息,但是发现token失效,接口请求报错,怎么马上刷新token,然后重复请求方才那个接口呢?这个过程应该说对用户来说是无感的。

这个过程用流程图可以这样表示:

自动更新token流程

要实现上述需求的话,大家会如何实现呢?

首先讲一下Token和Cookie吧

- cookie

cookie是保存在本地终端的数据。cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。由于cookie是存在客户端上的,所以浏览器加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的cookie数量是有限的。

cookie的组成有:名称(key)、值(value)、有效域(domain)、路径(域的路径,一般设置为全局:"")、失效时间、安全标志(指定后,cookie只有在使用SSL连接时才发送到服务器(https))。

- token

token的意思是“令牌”,是用户身份的验证方式,最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。还可以把不变的参数也放进token,避免多次查库。

解决方案

通过拦截器,获取返回的数据

判断token是否过期

如果token过期则刷新token

使用最新的token,重新请求网络数据

自定义自动刷新token的拦截器

import android.util.Log;

import java.io.IOException;

import okhttp3.Interceptor;

import okhttp3.Request;

import okhttp3.Response;

/**

* 自动刷新token的拦截器

*

* @author shijiacheng

* @version 1.0

*/

public class TokenInterceptor implements Interceptor {

private static final String TAG = "TokenInterceptor";

@Override

public Response intercept(Chain chain) throws IOException {

Request request = chain.request();

Response response = chain.proceed(request);

Log.d(TAG, "response.code=" + response.code());

//根据和服务端的约定判断token过期

if (isTokenExpired(response)) {

Log.d(TAG, "自动刷新Token,然后重新请求数据");

//同步请求方式,获取最新的Token

String newToken = getNewToken();

//使用新的Token,创建新的请求

Request newRequest = chain.request()

.newBuilder()

.header("Authorization", "Basic " + newToken)

.build();

//重新请求

return chain.proceed(newRequest);

}

return response;

}

/**

* 根据Response,判断Token是否失效

*

* @param response

* @return

*/

private boolean isTokenExpired(Response response) {

if (response.code() == 301) {

return true;

}

return false;

}

/**

* 同步请求方式,获取最新的Token

*

* @return

*/

private String getNewToken() throws IOException {

// 通过获取token的接口,同步请求接口

String newToken = "";

return newToken;

}

}

配置下OkHttpUtils

/**

* 初始化OkHttpUtils

*/

public OkHttpUtils(){

/**

* 配置OkHttpClient

*/

OkHttpClient client = new OkHttpClient.Builder()

.connectTimeout(15, TimeUnit.SECONDS)

.readTimeout(3000, TimeUnit.SECONDS)

.writeTimeout(3000, TimeUnit.SECONDS)

// .cache(new Cache())

// .addInterceptor(interceptor)//这里可以继续添加多种拦截器

.addInterceptor(new TokenInterceptor())//添加获取token的拦截器

.build();

}

本文作者:shijiacheng

本文链接: http://shijiacheng.studio/2018/03/28/okhttp-interceptor/

版权声明:本博客所有文章除特别声明外,均为原创文章。请尊重劳动成果,转载注明出处!

token 过期刷新令牌_OkHttp实现全局过期token自动刷新相关推荐

  1. layui让当前页面刷新_layui点击按钮页面会自动刷新的解决方案

    问题: Title 输入框 test layui.use(['laytpl','jquery','layer','form'],function () { var laytpl = layui.lay ...

  2. connect time out 获取token失败_Power Query之获取钉钉日志自动刷新Power BI报告

    焦棚子的文章目录 请点击下载附件 一.背景 最近在玩钉钉日志,企业填写简单数据后方便汇总到一起比较实用的工具,但数据填写以后还是需要下载日志报表,比较麻烦. 在做BI的时候,可不可以用pq(power ...

  3. idea项目启动时刷新_[转]springboot+idea热部署(自动刷新)

    近来在使用idea做springboot的项目,但是发现每次修改之后我都需要重新将项目关闭再开启,这样比较繁琐,发现通过热部署的方式让我们可以一边修改我们的项目,然后在页面中直接通过刷新展示出来 sp ...

  4. 关于OAuth 协议中刷新令牌存活时间的讨论

    OAuth 2.0 协议里,刷新令牌用于在当前访问令牌到期时获取新的访问令牌. 有关更多信息,请参阅 OAuth 2.0 RFC. 以 LinkedIn 提供的 API 为例. LinkedIn 提供 ...

  5. 13 令牌颁发方式 之 刷新令牌

    Refresh Token(刷新令牌) 上一篇 授权码模式 就说了,在授权码模式颁发令牌时,当发现该客户端支持 REFRESH_TOKEN 模式时,还会返回刷新令牌. 客户端可以使用刷新令牌(refr ...

  6. 用js刷新当前页面的几种方法,包括reload方法、replace方法、自动刷新方法等。

    如何实现刷新当前页面呢?借助js你将无所不能. 1,reload 方法,该方法强迫浏览器刷新当前页面. 语法:location.reload([bForceGet])    参数: bForceGet ...

  7. 在HTML中,实现每隔60秒自动刷新页面的功能

    一.简介 在 html 元素 < head > 头部区域内的 meta 标签中有个属性是 http-equiv="Refresh" ,该属性被所有主流浏览器支持. 其用 ...

  8. 【PowerQuery】Excel 自动刷新PowerQuery连接

    Excel集成的PowerQuery提供了数据的手动刷新功能之外,也提供了数据的自动刷新功能.需要注意的是,PowerQuery提供的自动刷新功能是针对连接的,也就是说在PowerQuery自动刷新功 ...

  9. Express结合Webpack的全栈自动刷新

    在以前的一篇文章BrowserSync,迅捷从免F5开始中,我介绍了BrowserSync这样一个出色的开发工具.通过BrowserSync我感受到了这样一个理念:如果在一次ctrl + s保存后可以 ...

最新文章

  1. R语言使用pwr包的pwr.r.test函数对相关信息分析(Correlations)进行效用分析(power analysis)的语法
  2. 鸟哥的Linux私房菜(基础篇)- 第十七章、程序管理与 SELinux 初探
  3. HDU6184【Counting Stars】(三元环计数)
  4. [转]Python 获取Windows管理员权限
  5. 字符串表示形式—字符数组和字符指针的区别
  6. 国庆宅家又羡慕别人的旅游美拍,教你一招轻松穿梭各大景点
  7. Java input char_java.util.regex.Pattern.matcher(CharSequence input)方法
  8. Http和RPC区别
  9. 动态添加SqlParameter
  10. 【架构师面试-大厂内部面试题-4】-MySQL 运维基础知识面试题汇总50题
  11. 使用Tor绕过防火墙进行远程匿名访问
  12. 拥有超过1200个PNG格式图标的免费图标集 - Cosmo Mini
  13. MT【306】圆与椭圆公切线段
  14. css实现标题左右横线
  15. PHP中preg_match详解
  16. 利用jsdelivr+github使用免费又好用的全球节点CDN
  17. 制作Linux登录欢迎界面
  18. PHP strtotime()函数
  19. Pycharm 解决 Backend TkAgg is interactive backend. Turning interactive mode on.提示
  20. 从零开始建网站,新手小白建站必知的十大忠告

热门文章

  1. 哪个瞬间你对科研圈彻底失望了?
  2. waf可以查看post请求吗_WAF是如何被绕过的?
  3. iphone已停用解锁大概多少钱_【待办清单工具之三】微软To Do amp; iPhone提醒事项-来自大厂的时间管理系统...
  4. c语言 函数多个参数,C语言函数可变参数
  5. python游戏代码示例_练习项目20:使用python制作游戏(中)
  6. java接口等待几秒再返回_怎样才能在UI线程中等待okhttp返回结果才进行下一步
  7. 树形结构:二叉树,分治,合并子树,递归
  8. [JSOI2010] 满汉全席
  9. mysql允许远程访问
  10. 树分治树链剖分相关题目讨论