Java 如何在android中调用实现验证器的类
我已经创建了一个子类,它是从Java 如何在android中调用实现验证器的类,java,android,Java,Android,我已经创建了一个子类,它是从Authenticator类扩展而来的。我正在从该验证器类中的AsyncTask调用doInBackground方法。代码如下 TokenAuthenticator.java 未调用此类(未打印日志)。这里的AWSInitiator是一个类,它扩展了AsyncTask我使用的是下面的类,它包含验证器和拦截器。如果只需要验证器代码,则可以删除拦截器代码 注意:-我在下面的代码中与GSON一起使用改装 class SupportInterceptor(contex
Authenticator
类扩展而来的。我正在从该验证器类中的AsyncTask
调用doInBackground
方法。代码如下
TokenAuthenticator.java
未调用此类(未打印日志)。这里的
AWSInitiator
是一个类,它扩展了AsyncTask我使用的是下面的类,它包含验证器和拦截器。如果只需要验证器代码,则可以删除拦截器代码
注意:-我在下面的代码中与GSON一起使用改装
class SupportInterceptor(context: Context) : Interceptor, Authenticator {
var ctx: Context = context
var prefManager: PrefManager
init {
prefManager = PrefManager.getInstance(ctx)
}
/**
* Interceptor class for setting of the headers for every request
*/
override fun intercept(chain: Interceptor.Chain): Response {
var request = chain.request()
request =
request.newBuilder().addHeader("Content-Type", "application/json")
.addHeader("Accept", "application/json")
.addHeader(
"Authorization",
"Bearer " + prefManager.getString(PreferenceConstants.ACCESS_TOKEN)
)
.build()
return chain.proceed(request)
}
/**
* Authenticator for when the authToken need to be refresh and updated
* everytime we get a 401 error code
*/
@Throws(IOException::class)
override fun authenticate(route: Route?, response: Response): Request? {
if (response.code == 401) {
val client = OkHttpClient()
val jsonObject = JSONObject()
val dataObject = JSONObject()
dataObject.accumulate("userCode", prefManager.getString(PreferenceConstants.USER_ID))
dataObject.accumulate("password", prefManager.getString(PreferenceConstants.PASSWORD))
jsonObject.accumulate("Data", dataObject)
val json = "application/json; charset=utf-8".toMediaTypeOrNull()
val body = RequestBody.create(json, jsonObject.toString())
val request = Request.Builder()
.url(APIClient.COMPLETE_URL + "API ENDPOINTS")
.post(body)
.build()
val res = client.newCall(request).execute()
if (res.isSuccessful) {
try {
val jsonObj = JSONObject(res.body?.string())
val accessToken = jsonObj.opt("accessToken")
val statusCode = jsonObj.opt("statusCode")
if (statusCode.toString().equals("-1") || accessToken == null || accessToken.toString().equals(
"null"
)
) {
userLogout()
return null
} else {
prefManager.putString(
PreferenceConstants.ACCESS_TOKEN,
accessToken as String
)
return response.request.newBuilder()
.header("Authorization", "Bearer " + accessToken as String)
.build();
}
} catch (e: Exception) {
return null
}
} else {
return null
}
}
return null
}
fun userLogout() {
prefManager?.putBoolean(PreferenceConstants.IS_LOGGED_IN, false)
val intent = Intent(ctx!!, LoginActivity::class.java)
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
ctx.startActivity(intent)
///ctx?.finishAffinity()
}
}
这就是如何将其添加到http客户端的方法
httpClient.authenticator(supportInterceptor)
我对科特林不熟悉。你能给我提供一个类似的java版本吗?你的验证器java方法看起来不错,但似乎你还没有将它添加到你的http客户端
OkHttpClient.Builder client=new OkHttpClient.Builder();TokenAuthenticator TokenAuthenticator=新的TokenAuthenticator();客户端验证器(令牌验证器)
我这样做了,我认为您也需要为authenticator向workWill添加拦截器.addHeader()
而不是。header()
在我的TokenAuthenticator的返回语句中有任何意义
httpClient.authenticator(supportInterceptor)