【发布时间】:2018-06-03 16:54:01
【问题描述】:
我正在 Android 上使用 jwt 实现代码。
在使用刷新令牌时,我不确定我的代码是否正确。
这是我的流程的顺序图。
服务器发出访问令牌和刷新令牌。这些过期时间为 1 小时 3 天。这些令牌被保存到 sharedpreferences。
这是上图的描述。
访问令牌过期后,http 调用将失败并返回 401 错误。
所以我实现了getAccessToken() 来更新访问令牌。
(1):一个 AsyncTask 用于整个 http 调用步骤。
- 我的 AsyncTask 太大,我想重构它。
(2) : (1) 的 AynsTask 有重新获取访问令牌的逻辑。
- 这个逻辑重复了我所有的 HTTP 调用函数。
(3):更新访问令牌后,我的应用重新尝试调用 /api/foo
- 要重试,递归调用 AsyncTask 的doBackground() 函数。
这是我的代码 sn-p。
class ApplyCheck extends AsyncTask<String, Void, ResponseTypeEnum> {
private List<ApplyEntity> applyEntityList = null;
@Override
protected ResponseTypeEnum doInBackground(String... strings) {
try {
response = restManager.getApplyList(strings[0],"","",""); // call /api/foo
} catch (RestRuntimeException e) {
return ResponseTypeEnum.SERVER_ERROR;
}
switch (response.code()) {
case 200:
//set applyEntityList
....
return ResponseTypeEnum.SUCCESS;
case 401:
//<-- This routine is duplcated all my AsyncTasks
if(getAccessToken()) {
//<-- recursive call to re-call api
return doInBackground(strings);
} else {
return ResponseTypeEnum.TOKEN_EXPIRE;
}
}
}
//re-issue new access token
private boolean getAccessToken() {
Response response = restManager.getAccessToken(); // call /auth/issue-token
if(response.code() == 200) {
String tokens = response.body().string();
JSONObject jsonObject = new JSONObject(tokens);
sharedPreferences.edit().putString("accessToken", jsonObject.getString("accessToken"));
sharedPreferences.edit().putString("refreshToken", jsonObject.getString("refreshToken"));
return true;
} else {
return false;
}
我的问题
1.我的方法正确吗?如果没有,请告诉我好的做法。
2. 如果是,为我重复的 AsyncTasks 提取常用功能有什么好的做法吗?
【问题讨论】:
标签: android android-asynctask jwt