waw*_*los 5 android kotlin retrofit retrofit2
这是一个 Retrofit Interceptor,用于在请求中自动注入令牌。我正在尝试从中获取此令牌,sharedPreferences但getSharedPreferences在那里不可用。
我如何从这个拦截器内的共享首选项中检索我的令牌?
import android.preference.PreferenceManager
import okhttp3.Interceptor
import okhttp3.Response
class ServiceInterceptor: Interceptor {
var token : String = "";
override fun intercept(chain: Interceptor.Chain): Response {
var request = chain.request()
if(request.header("No-Authentication") == null){
if (request.url.toString().contains("/user/signin") === false) {
// Add Authorization header only if it's not the user signin request.
// Get token from shared preferences
val sharedPreference = PreferenceManager.getSharedPreferences()
token = sharedPreference.getString("token")
if (!token.isNullOrEmpty()) {
val finalToken = "Bearer " + token
request = request.newBuilder()
.addHeader("Authorization", finalToken)
.build()
}
}
}
return chain.proceed(request)
}
}
Run Code Online (Sandbox Code Playgroud)
您可以创建一个singleton classfor SharedPreference,然后您可以从任何class您想要的地方访问它。
例子
class SessionManager private constructor(context:Context) {
private val prefs:SharedPreferences
private val editor:SharedPreferences.Editor
var token:String
get() {
return prefs.getString("token", "")
}
set(token) {
editor.putString("token", token)
editor.apply()
}
init{
prefs = context.getSharedPreferences("Your_Preference_name", Context.MODE_PRIVATE)
editor = prefs.edit()
}
companion object {
private val jInstance:SessionManager
@Synchronized fun getInstance(context:Context):SessionManager {
if (jInstance != null)
{
return jInstance
}
else
{
jInstance = SessionManager(context)
return jInstance
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在你必须传入contextof并且可以像 constructor 下面这样访问。ServiceInterceptorSharedPreference
val token = SessionManager.getInstance(context).token;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2233 次 |
| 最近记录: |