应用场景
- 应用启动时检测当前 token 是否失效
- 调用api时需要登录权限时,token 失效怎么进行拦截
账号管理类
我们设计一个管理者的实现,用来记录 token、当前是否在线状态。类似代码如下
public class AccountManager{
private boolean isOnline;
private String token;
public void setOnline(boolean isOnline){
this.isOnline = isOnline;
}
public void setToken(String token){
this.token = token;
}
public boolean isOnline(){
return isOnline && !TextUtils.isEmpty(token);
}
public String getToken(){
return this.token;
}
public void logout(){
this.isOnline = false;
this.token = null;
}
}
这个管理类要设计成单例模式。如果 token 需要缓存到本地,可直接在本类中去实现,比如在方法 setToken() 方法中
流程设计
应用启动时,可通过 AccountManager 类获取 token,用此 token 去请求接口校验是否失效,如果有效,就调用方法 setOnline(true) 设置在线状态;如果失效,就调用方法 logout() 方法,清除在线信息。
那么在具体操作的时候,怎么去拦截并打开登录页面了?
- 在操作到需要登录权限的业务时,通过 AccountManager.isOnline() 方法判断当前是否在线,如果不在线,那么就打开登录页面,成功后返回。一般建议采用 startActivityForResult() 方法去打开登录页面,然后登录成功回来时,可在 onActivityResult() 方法中去判断 requestCode 来区分要做的操作,这样就实现了登录成功后自动执行用户之前的操作
- 利用后台接口返回的错误码。当用户操作时,不做任何判断,直接执行,待后端接口返回错误码,通过判断错误码,然后在去打开登录页面,登录成功后回来通过 requestCode 继续请求接口进行操作
两种方法可分具体产景去采用
上代码
AccountManager.java
public final class AccountManager {
private static AccountManager instance;
private final SharedPreferences mSharedPreferences;
private boolean isOnline;
private String token;
private AccountManager(Application context) {
mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
isOnline = mSharedPreferences.getBoolean("isOnline", false);
token = mSharedPreferences.getString("token", null);
}
public static AccountManager getInstance(Application application) {
if (instance == null) {
instance = new AccountManager(application);
}
return instance;
}
public void setOnline(boolean isOnline) {
this.isOnline = isOnline;
mSharedPreferences.edit().putBoolean("isOnline", isOnline).apply();
}
public void setToken(String token) {
this.token = token;
mSharedPreferences.edit().putString("token", token).apply();
}
public boolean isOnline() {
return isOnline && !TextUtils.isEmpty(token);
}
public String getToken() {
return token;
}
public void logout() {
setOnline(false);
setToken(null);
}
}
***Activity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
......
requestApi();
}
/**
* 某一个操作
*/
public void actionA() {
if (AccountManager.getInstance(getApplication()).isOnline()) {
// 正常操作
}else{
startActivityForResult(new Intent(this,LoginActivity.class),100);
}
}
/**
* 请求 api
*/
public void requestApi(){
}
/**
* api 返回结果
*/
public void onApiResponse(int code) {
if (code == 999) {
startActivityForResult(new Intent(this,LoginActivity.class),200);
}else{
// 正常操作
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 100 && resultCode == Activity.RESULT_OK) {
actionA();
} else if (requestCode == 200 && resultCode == Activity.RESULT_OK) {
requestApi();
}
}
}
LoginActivity.java
public class LoginActivity extends AppCompatActivity {
/**
* 登录成功
*/
public void onLoginSuccess() {
setResult(Activity.RESULT_OK);
finish();
}
}
END
此方法如果对你有用,请收藏;如果你有更好的方法设计,希望能得到留言指点,谢谢。