当前位置: 首页 > 知识库问答 >
问题:

OkHttp拦截器链在获取令牌时中断

秦英发
2023-03-14

我有一个OkHttp拦截器,当请求得到401 HTTP错误时,它应该请求一个令牌。现在,登录服务的请求完成了,但随后链路中断,原始请求不再重试。下面是我的拦截器的拦截方法:

override fun intercept(chain: Interceptor.Chain): Response {
        logger.d("AuthenticationServiceHolder $authenticationServiceHolder")

        val originalRequest = chain.request()
        logger.d("Intercepting call to ${originalRequest.method()} ${originalRequest.url()}")

        val response: Response = chain.proceed(originalRequest)
        val successful = response.isSuccessful
        val code = response.code()
        logger.d("Response successful: $successful - code: $code")

        if (!successful && code == HttpURLConnection.HTTP_UNAUTHORIZED) {
            logger.d("Token is $token")

            val deviceUuid = deviceIdentificationManager.deviceUuid().blockingGet()
            logger.d("Device uuid $deviceUuid")
            if (deviceUuid != null) {
                val authenticationService = authenticationServiceHolder.get()
                if (authenticationService != null) {
                    token = reLogin(authenticationService, deviceUuid)
                    if (token != null) {
                        val headersBuilder = originalRequest.headers().newBuilder()
                        headersBuilder.removeAll(AUTHORIZATION_HEADER)
                        headersBuilder.add(AUTHORIZATION_HEADER, token!!)

                        val requestBuilder = originalRequest.newBuilder()
                        val request = requestBuilder.headers(headersBuilder.build()).build()
                        return chain.proceed(request)
                    } else {
                        logger.e("Token was not retrieved")
                    }
                } else {
                    logger.e("Authentication service is null!")
                }
            }
        }
        return response
}

reLogin()方法是:

private fun reLogin(authenticationService: AuthenticationService, deviceUuid: UUID): String? {
        logger.d("reLogin() - authenticationService $authenticationService")
        val blockingGet = authenticationService?.login(LoginRequest(deviceUuid, clock.currentTime()))?.blockingGet()
        logger.d("reLogin() - response $blockingGet")
        val response = blockingGet ?: return null
        logger.d("reLogin() - token ${response.token}")
        return response.token
}

新:正如Mitesh Machhoya所说,我尝试了两个不同的改型实例,一个带有拦截器的okhttp客户端,另一个没有。现在登录调用没有被拦截,但是拦截器的执行被中断了,我的意思是这个类的日志跟踪是:

 - AuthenticationServiceHolder XXXmypackageXXX.AuthenticationServiceHolder... 
 - Intercepting call to GET XXXmyInterceptedCallXXX 
 - Response successful: false - code: 401 
 - Token is null 
 - Device uuid XXX 
 - reLogin() - authenticationService retrofit2.Retrofit$1@a5c0a25 

仅此而已。我的意思是relogin()-response.....不打印。我确信登录调用正在工作,因为我在okhttp日志中看到了登录响应。

共有1个答案

容柏
2023-03-14

用其他httpClient发出重新登录请求,而不附加拦截器,那么它就会像您预期的那样工作得很好。

如果您使用相同的httpClient发出重新登录请求,那么它将通过拦截器,并且每次都覆盖请求,所以尝试使用另一个httpClient发出请求

 类似资料:
  • 我有一个使用express api的react应用程序。我正在尝试在访问令牌过期时刷新令牌。我正在使用axios拦截器来实现这一成就。 它卡在某个地方了。我使用console.log来调试它。从控制台; 发布http://localhost:5000/api/auth/token?null 401(未经授权) 之后什么都没发生。我该怎么办?谢谢你的帮助

  • 问题内容: 我有以下动作映射 我可以使用Interceptor中的以下行获取参数映射 就像上面一样, 有什么方法可以获取 以下映射中定义的 拦截器参数 。 动作参数按以下方式定义,动作参数和拦截器参数应分别可访问。 请注意,我不想在拦截器中将参数字段声明为 在Dev Blanked的攻击之后,我实现了他的技术。它没有用,所以我在这里共享我的代码。我正在使用Struts 2.3.1.2。 图书馆 a

  • 问题内容: 我有带有不同(HTML和JSON)结果类型的Struts2操作。他们使用通用拦截器。 如果需要拦截请求,如何根据给定的操作结果类型返回结果? 例如,我转发到JSP页面。如果操作是JSON类型,我想转发JSON错误。 问题答案: 我有带有不同(HTML和JSON)结果类型的Struts2操作。他们使用通用拦截器。如果需要拦截请求,如何根据给定的动作结果类型返回结果? 例如,我的Actio

  • D/OKHTTP:主机:www.appido.ir D/OKHTTP:Connection:Keep-Alive d/okhttp:accept-encoding:gzip 1048576------WebKitFormBoundaryJDHM3Si8Enjzaba内容-配置:表单-数据;name=“FlowCurrentChunkSize” 23016-----WebKitFormBoundar

  • 我需要(在拦截器类中)对403禁止的HTTP状态(获取/刷新)JWT令牌作出反应,并使用新令牌重试请求。 在下面的代码中,当服务器返回错误响应时,它将转到成功回调(而不是像我预期的那样进入错误回调),事件是typeof object(这在错误响应的反应中是无用的)。事件对象如下所示:{type:0}。 问题: -当我需要刷新accessToken并重试http请求时,如何在HttpIntercep

  • 我有一个Spring 3 Web应用程序,它实现了两个拦截器。我正在使用一个带有@Configuration注释的配置类。代码如下: 无论我将拦截器添加到注册表的顺序是什么,allIntericetor的preHandle函数总是在home Intericetor的preHandle之前调用。有人知道如何控制拦截器调用的顺序吗? 谢谢