- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我尝试在域包中的 repositoryImpl 中注入(inject)这一行时:
private val userUseCase: UserUseCase by inject()
java.lang.StackOverflowError: stack size 1040KB
/**
* provide HttpLoggingInterceptor for dependency injection with *Koin*
*
* @return the HttpLoggingInterceptor object <HttpLoggingInterceptor>
*
* @see HttpLoggingInterceptor
*/
fun provideLoggingInterceptor(): HttpLoggingInterceptor {
val logger = HttpLoggingInterceptor()
logger.level = HttpLoggingInterceptor.Level.BASIC
return logger
}
/**
* provide OkHttpClient for dependency injection with *Koin*
*
* @param loggingInterceptor: a HttpLoggingInterceptor object, injected
* @param cache: a Cache object, injected
* @param hostnameVerifier: a HostnameVerifier object, injected
*
* @return the OkHttpClient built object <OkHttpClient>
*
* @see HttpLoggingInterceptor
* @see Cache
* @see HostnameVerifier
*/
fun provideOkHttpClient(
loggingInterceptor: HttpLoggingInterceptor,
cache: Cache,
hostnameVerifier: HostnameVerifier
): OkHttpClient {
val clientBuilder = OkHttpClient()
.newBuilder()
.followRedirects(true)
.followSslRedirects(true)
.retryOnConnectionFailure(true)
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.hostnameVerifier(hostnameVerifier)
.addInterceptor(loggingInterceptor)
.cache(cache)
return clientBuilder.build()
}
/**
* provide provideOkHttpClientForRefresh for dependency injection with *Koin*
*
* @param loggingInterceptor: a HttpLoggingInterceptor object, injected
* @param cache: a Cache object, injected
* @param hostnameVerifier: a HostnameVerifier object, injected
*
* @return the OkHttpClient built object <OkHttpClient>
*
* @see HttpLoggingInterceptor
* @see Cache
* @see HostnameVerifier
*/
fun provideOkHttpClientForRefresh(
loggingInterceptor: HttpLoggingInterceptor,
refreshTokenInterceptor: RefreshTokenInterceptor,
cache: Cache,
hostnameVerifier: HostnameVerifier
): OkHttpClient {
val clientBuilder = OkHttpClient()
.newBuilder()
.followRedirects(true)
.followSslRedirects(true)
.retryOnConnectionFailure(true)
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.hostnameVerifier(hostnameVerifier)
.addInterceptor(loggingInterceptor)
.addInterceptor(refreshTokenInterceptor)
.cache(cache)
return clientBuilder.build()
}
/**
* provide OkHttpClient for dependency injection with *Koin*
*
* @param loggingInterceptor: a HttpLoggingInterceptor object, injected
* @param accessTokenInterceptor: a AccessTokenInterceptor object, injected
* @param accessTokenAuthenticator: a AccessTokenAuthenticator object, injected
* @param cache: a Cache object, injected
* @param hostnameVerifier: a HostnameVerifier object, injected
*
* @return the OkHttpClient built object <OkHttpClient>
*
* @see HttpLoggingInterceptor
* @see AccessTokenInterceptor
* @see AccessTokenAuthenticator
* @see Cache
* @see HostnameVerifier
*/
fun provideOkHttpClientForAuth(
loggingInterceptor: HttpLoggingInterceptor,
accessTokenInterceptor: AccessTokenInterceptor,
accessTokenAuthenticator: AccessTokenAuthenticator,
cache: Cache,
hostnameVerifier: HostnameVerifier
): OkHttpClient {
val clientBuilder = OkHttpClient()
.newBuilder()
.followRedirects(true)
.followSslRedirects(true)
.retryOnConnectionFailure(true)
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.hostnameVerifier(hostnameVerifier)
.authenticator(accessTokenAuthenticator)
.addInterceptor(accessTokenInterceptor)
.addInterceptor(loggingInterceptor)
.cache(cache)
return clientBuilder.build()
}
/**
* provide Cache for dependency injection with *Koin*
*
* @param cacheDirection: a CacheDirection object, injected
*
* @return the Cache object <Cache>
*
* @see CacheDirection
* @see Cache
*/
fun provideCache(cacheDirection: CacheDirection): Cache {
val cacheFile = createDefaultCacheDir(cacheDirection.path, "api_cache")
return Cache(cacheFile, calculateDiskCacheSize(cacheFile))
}
/**
* provide HostnameVerifier for dependency injection with *Koin*
*
* @return the HostnameVerifier object <HostnameVerifier>
*
* @see HostnameVerifier
*/
fun provideHostnameVerifier(): HostnameVerifier {
return HostnameVerifier { hostname, _ ->
return@HostnameVerifier BuildConfig.API_URL_V1.contains(hostname)
}
}
/**
* provide Retrofit for dependency injection with *Koin*
*
* @param okHttpClient: a OkHttpClient object, injected
*
* @return the Retrofit built object <Retrofit>
*
* @see OkHttpClient
* @see Retrofit
*/
fun provideRetrofitForAuth(okHttpClient: OkHttpClient): Retrofit {
return Retrofit.Builder().baseUrl(BuildConfig.API_URL_V1).client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create()).build()
}
/**
* provide Retrofit for dependency injection with *Koin*
*
* @param okHttpClient: a OkHttpClient object, injected
*
* @return the Retrofit built object <Retrofit>
*
* @see OkHttpClient
* @see Retrofit
*/
fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit {
return Retrofit.Builder().baseUrl(BuildConfig.API_URL_V1).client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create()).build()
}
/**
* provide Retrofit for dependency injection with *Koin*
*
* @param okHttpClient: a OkHttpClient object, injected
*
* @return the Retrofit built object <Retrofit>
*
* @see OkHttpClient
* @see Retrofit
*/
fun provideOkHttpClientForRefresh(okHttpClient: OkHttpClient): Retrofit {
return Retrofit.Builder().baseUrl(BuildConfig.API_URL_V1).client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create()).build()
}
/**
* provide AuthApi for dependency injection with *Koin*
*
* @param retrofit: a Retrofit object, injected
*
* @return object created retrofit from retrofit's interface <AuthApi>
*
* @see Retrofit
* @see AuthApi
*/
fun provideAuthApi(retrofit: Retrofit): AuthApi = retrofit.create(AuthApi::class.java)
/**
* provide CheckTokenApi for dependency injection with *Koin*
*
* @param retrofit: a Retrofit object, injected
*
* @return object created retrofit from retrofit's interface <AuthApi>
*
* @see Retrofit
* @see CheckTokenApi
*/
fun provideCheckTokenApi(retrofit: Retrofit): CheckTokenApi =
retrofit.create(CheckTokenApi::class.java)
/**
* provide AuthApi for dependency injection with *Koin*
*
* @param retrofit: a Retrofit object, injected
*
* @return object created retrofit from retrofit's interface <AuthApi>
*
* @see Retrofit
* @see AuthApi
*/
fun provideUserApi(retrofit: Retrofit): UserApi = retrofit.create(UserApi::class.java)
/**
* Create network provider module for dependency injection with *Koin*
*
* @see provideRetrofit
* @see provideOkHttpClient
* @see provideLoggingInterceptor
* @see provideAuthApi
* @see ResponseHandler
* @see AccessTokenInterceptor
* @see AccessTokenAuthenticator
*/
val networkModule = module {
factory { provideLoggingInterceptor() }
factory { provideCache(get()) }
factory { provideHostnameVerifier() }
factory { ResponseHandler() }
factory { AccessTokenInterceptor(get()) }
factory { AccessTokenAuthenticator(get(), get()) }
factory { RefreshTokenInterceptor(get(), get()) }
factory(named("allRequestOkHttpClient")) {
provideOkHttpClient(
get(),
get(),
get()
)
}
factory(named("refreshTokenRequestOkHttpClient")) {
provideOkHttpClientForRefresh(
get(),
get(),
get(),
get()
)
}
factory(named("authRequestOkHttpClient")) {
provideOkHttpClientForAuth(
get(), get(), get(), get(), get()
)
}
single(named("allRequestRetrofit")) { provideRetrofit(get(named("allRequestOkHttpClient"))) }
single(named("refreshTokenRequestRetrofit")) { provideOkHttpClientForRefresh(get(named("refreshTokenRequestOkHttpClient"))) }
single(named("authRequestRetrofit")) { provideRetrofitForAuth(get(named("authRequestOkHttpClient"))) }
factory { provideAuthApi(get(named("allRequestRetrofit"))) }
factory { provideCheckTokenApi(get(named("refreshTokenRequestRetrofit"))) }
factory { provideUserApi(get(named("authRequestRetrofit"))) }
}
/**
* a Authenticator class for add *Authorization* header into *okhttp* request
* implement from Authenticator (okhttp3.Authenticator) and KoinComponent (org.koin.core.KoinComponent)
*/
class AccessTokenAuthenticator(
private val checkTokenApi: CheckTokenApi,
private val userPreferences: UserPreferences
) : Authenticator {
/**
* override function for handle add *Authorization* into *okhttp* request
*
* @param route
* @param response
*
* @return Request
*/
@Nullable
override fun authenticate(route: Route?, response: Response): Request? {
synchronized(this) {
val newAccessToken =
checkTokenApi.checkToken().execute().body()
return if (userPreferences.token != newAccessToken?.apiObjects?.user?.token) {
if (newAccessToken?.apiObjects?.user?.token?.isNotEmpty() == true) {
userPreferences.token = newAccessToken.apiObjects.user.token
}
newRequestWithAccessToken(
response.request(),
newAccessToken?.apiObjects?.user?.token ?: ""
)
} else {
newRequestWithAccessToken(response.request(), userPreferences.token)
}
}
}
/**
* create request with custom header(Device-Id, Device-Token)
*
* @param request request for add header <Request>
* @param accessToken for add Uer-Token header provided from server <String>
*
* @return a Request with custom header(auth)
*/
private fun newRequestWithAccessToken(
request: Request,
newToken: String
): Request {
val req = request.newBuilder()
if (userPreferences.isLogin()) {
req.header("auth", newToken)
}
return req.build()
}
/**
* a Interceptor class for handel or add *Authorization* header into *okhttp* request after get response
* implement from Interceptor (okhttp3.Interceptor) and KoinComponent (org.koin.core.KoinComponent)
*/
class AccessTokenInterceptor(
private val userPreferences: UserPreferences
) : Interceptor {
/**
* override function for handle or add *Authorization* into *okhttp* request after get response
*
* @param chain intercept's chain <Interceptor.Chain>
*
* @return Response
*/
override fun intercept(chain: Interceptor.Chain): Response {
/* if (userPreferences.isLogin()) {
if (response.code() == HttpURLConnection.HTTP_UNAUTHORIZED) {
response = getToken(chain, userPreferences.token)
}*/
return when (userPreferences.isLogin()) {
true -> {
val request = newRequestWithAccessToken(chain.request(), userPreferences.token)
chain.proceed(request)
}
else -> {
val request = newRequestWithoutAccessToken(chain.request())
chain.proceed(request)
}
}
}
/**
* create synchronized Api call for get device token and add into header and add into devicePreferences
*
* @param chain intercept's chain <Interceptor.Chain>
*
* @return a Response with custom header(Device-Id, Device-Token)
*/
/* private fun getToken(chain: Interceptor.Chain, previousToken: String): Response {
synchronized(this) {
val refreshTokenWithPreviousToken = chain.request().newBuilder()
refreshTokenWithPreviousToken.header("auth", previousToken)
val newAccessToken =
userApi.checkToken().execute().body()
if (userPreferences.token != newAccessToken?.apiObjects?.user?.token) {
if (newAccessToken?.apiObjects?.user?.token?.isNotEmpty() == true) {
userPreferences.token = newAccessToken.apiObjects.user.token
}
}
return chain.proceed(
newRequestWithAccessToken(
refreshTokenWithPreviousToken.build(),
newAccessToken?.apiObjects?.user?.token ?: ""
)
)
}
}*/
/**
* create request with custom header(Device-Id, Device-Token)
*
* @param request request for add header <Request>
* @param accessToken for add Device-Token header provided from server <String>
*
* @return a Request with custom header(Device-Id, Device-Token)
*/
private fun newRequestWithAccessToken(
request: Request,
accessToken: String
): Request {
val req = request.newBuilder()
if (userPreferences.isLogin()) {
req.header("auth", accessToken)
}
return req.build()
}
private fun newRequestWithoutAccessToken(
request: Request
): Request {
val req = request.newBuilder()
return req.build()
}
}
/**
* a Interceptor class for handel or add *Authorization* header into *okhttp* request after get response
* implement from Interceptor (okhttp3.Interceptor) and KoinComponent (org.koin.core.KoinComponent)
*/
class RefreshTokenInterceptor(
private val checkTokenApi: CheckTokenApi,
private val userPreferences: UserPreferences
) : Interceptor {
/**
* override function for handle or add *Authorization* into *okhttp* request after get response
*
* @param chain intercept's chain <Interceptor.Chain>
*
* @return Response
*/
override fun intercept(chain: Interceptor.Chain): Response {
var response: Response
response = when (userPreferences.isLogin()) {
true -> {
val request = newRequestWithAccessToken(chain.request(), userPreferences.token)
chain.proceed(request)
}
else -> {
val request = newRequestWithoutAccessToken(chain.request())
chain.proceed(request)
}
}
if (userPreferences.isLogin()) {
if (response.code() == HttpURLConnection.HTTP_UNAUTHORIZED) {
response = getToken(chain, userPreferences.token)
}
}
return response
}
/**
* create synchronized Api call for get device token and add into header and add into devicePreferences
*
* @param chain intercept's chain <Interceptor.Chain>
*
* @return a Response with custom header(Device-Id, Device-Token)
*/
private fun getToken(chain: Interceptor.Chain, previousToken: String): Response {
synchronized(this) {
val refreshTokenWithPreviousToken = chain.request().newBuilder()
refreshTokenWithPreviousToken.header("auth", previousToken)
val newAccessToken =
checkTokenApi.checkToken().execute().body()
if (userPreferences.token != newAccessToken?.apiObjects?.user?.token) {
if (newAccessToken?.apiObjects?.user?.token?.isNotEmpty() == true) {
userPreferences.token = newAccessToken.apiObjects.user.token
}
}
return chain.proceed(
newRequestWithAccessToken(
refreshTokenWithPreviousToken.build(),
newAccessToken?.apiObjects?.user?.token ?: ""
)
)
}
}
/**
* create request with custom header(Device-Id, Device-Token)
*
* @param request request for add header <Request>
* @param accessToken for add Device-Token header provided from server <String>
*
* @return a Request with custom header(Device-Id, Device-Token)
*/
private fun newRequestWithAccessToken(
request: Request,
accessToken: String
): Request {
val req = request.newBuilder()
if (userPreferences.isLogin()) {
req.header("auth", accessToken)
}
return req.build()
}
private fun newRequestWithoutAccessToken(
request: Request
): Request {
val req = request.newBuilder()
return req.build()
}
}
最佳答案
我改变了这个类,现在一切正常:
AccessTokenAuthenticator:
/**
* a Authenticator class for add *Authorization* header into *okhttp* request
* implement from Authenticator (okhttp3.Authenticator) and KoinComponent (org.koin.core.KoinComponent)
*/
class AccessTokenAuthenticator(
private val checkTokenApi: CheckTokenApi,
private val userPreferences: UserPreferences
) : Authenticator {
/**
* override function for handle add *Authorization* into *okhttp* request
*
* @param route
* @param response
*
* @return Request
*/
@Nullable
override fun authenticate(route: Route?, response: Response): Request? {
if (response.code() == 401) {
try {
val sendCall = checkTokenApi.refreshToken()
val refreshResult = sendCall.execute()
if (refreshResult.isSuccessful) {
//save Token
userPreferences.token = refreshResult.body()?.apiObjects?.user?.token ?: ""
//Replace Token
return response.request().newBuilder()
.header(
"auth",
refreshResult.body()?.apiObjects?.user?.token ?: ""
)
.build()
}
} catch (ex: Exception) {
// todo :: handle error
println(ex)
}
}
return null
}
}
/**
* a Interceptor class for handel or add *Authorization* header into *okhttp* request after get response
* implement from Interceptor (okhttp3.Interceptor) and KoinComponent (org.koin.core.KoinComponent)
*/
class AccessTokenInterceptor(
private val userPreferences: UserPreferences
) : Interceptor {
/**
* override function for handle or add *Authorization* into *okhttp* request after get response
*
* @param chain intercept's chain <Interceptor.Chain>
*
* @return Response
*/
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
val newRequest: Request
newRequest = request.newBuilder()
.addHeader("auth", userPreferences.token)
.build()
return chain.proceed(newRequest)
}
}
/**
* a Interceptor class for handel or add *Authorization* header into *okhttp* request after get response
* implement from Interceptor (okhttp3.Interceptor) and KoinComponent (org.koin.core.KoinComponent)
*/
class RefreshTokenInterceptor(
private val userPreferences: UserPreferences
) : Interceptor {
/**
* override function for handle or add *Authorization* into *okhttp* request after get response
*
* @param chain intercept's chain <Interceptor.Chain>
*
* @return Response
*/
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
val newRequest: Request
newRequest = request.newBuilder()
.addHeader("auth", userPreferences.token)
.build()
return chain.proceed(newRequest)
}
}
关于android - 使用 koin 注入(inject) UseCase 时,方法在 android 中引发 'java.lang.StackOverflowError' 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61983056/
我正在尝试测试依赖于其他服务 authService 的服务 documentViewer angular .module('someModule') .service('docu
如果我的网站上线(不要认为它会,目前它只是一个学习练习)。 我一直在使用 mysql_real_escape_string();来自 POST、SERVER 和 GET 的数据。另外,我一直在使用 i
我有以下代码,它容易受到 SQL 注入(inject)的攻击(我认为?): $IDquery = mysqli_query($connection, "SELECT `ID` FROM users W
我一直在自学如何创建扩展,以期将它们用于 CSS 注入(inject)(以及最终以 CSS 为载体的 SVG 注入(inject),但那是以后的问题)。 这是我当前的代码: list .json {
这个简单的代码应该通过 Java Spring 实现一个简单的工厂。然而结果是空指针,因为 Human 对象没有被注入(inject)对象(所以它保持空)。 我做错了什么? 谢谢 配置 @Config
我正在编写一个 ASP.NET MVC4 应用程序,它最终会动态构建一个 SQL SELECT 语句,以便稍后存储和执行。动态 SQL 的结构由用户配置以用户友好的方式确定,具有标准复选框、下拉列表和
首先让我说我是我为确保 SQL 注入(inject)攻击失败而采取的措施的知己。所有 SQL 查询值都是通过事件记录准备语句完成的,所有运算符(如果不是硬编码)都是通过数字白名单系统完成的。这意味着如
这是 SQL 映射声称可注入(inject)的负载: user=-5305' UNION ALL SELECT NULL,CONCAT(0x716b6b7071,0x4f5577454f76734
我正在使用 Kotlin 和 Android 架构组件(ViewModel、LiveData)构建一个新的 Android 应用程序的架构,并且我还使用 Koin 作为我的依赖注入(inject)提供
假设 RequestScope 处于 Activity 状态(使用 cdi-unit 的 @InRequestScope) 给定 package at.joma.stackoverflow.cdi;
我有一个搜索表单,可以在不同的提供商中搜索。 我从拥有一个基本 Controller 开始 public SearchController : Controller { protected r
SQLite 注入 如果您的站点允许用户通过网页输入,并将输入内容插入到 SQLite 数据库中,这个时候您就面临着一个被称为 SQL 注入的安全问题。本章节将向您讲解如何防止这种情况的发生,确保脚
我可以从什么 dll 中获得 Intercept 的扩展?我从 http://github.com/danielmarbach/ninject.extensions.interception 添加了
使用 NInject 解析具有多个构造函数的类似乎不起作用。 public class Class1 : IClass { public Class1(int param) {...} public
我有一个 MetaManager 类: @Injectable() export class MetaManager{ constructor(private handlers:Handler
我是 Angular 的新手,我不太清楚依赖注入(inject)是如何工作的。我的问题是我有依赖于服务 B 的服务 A,但是当我将服务 A 注入(inject)我的测试服务 B 时,服务 B 变得未定
我正在为我的项目使用 android 应用程序启动、刀柄和空间。我在尝试排队工作时遇到错误: com.test E/WM-WorkerFactory: Could not instantiate co
我不确定这是什么糖语法,但让我向您展示问题所在。 def factors num (1..num).select {|n| num % n == 0} end def mutual_factors
简单的问题,我已经看过这个了:Managing imports in Scalaz7 ,但我不知道如何最小化注入(inject) right和 left方法到我的对象中以构造 \/ 的实例. 我确实尝
在我的 Aurelia SPA 中,我有一些我想在不同模块中使用的功能。它依赖于调用时给出的参数和单例的参数。有没有办法创建一个导出函数,我可以将我的 Auth 单例注入(inject)其中,而不必在
我是一名优秀的程序员,十分优秀!