如何在android应用程序中显示时在网页中传递令牌(Jetpack撰写)

6pp0gazn  于 2023-06-27  发布在  Android
关注(0)|答案(1)|浏览(100)

我试图在我的Android应用程序中加载Training页面。只有授权用户才能访问Training页面,这意味着它需要令牌来加载此页面。
问题是,当我试图加载Training网址时,应用程序总是将我重定向到Login页面。
这是我的实现

val token = "zxcvffffgggh....."
val url = "https://abcd.com/training"

AndroidView(factory = {
    WebView(it).apply {
        layoutParams = ViewGroup.LayoutParams(
            ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.MATCH_PARENT
        )
        webViewClient = WebViewClient()
        settings.cacheMode = WebSettings.LOAD_NO_CACHE
        settings.domStorageEnabled = true
        settings.javaScriptEnabled = true

        loadUrl(url)

        // Inject the token using JavaScript
        val javascript = "window.token = '$token';"
        post {
            evaluateJavascript(javascript, null)
        }
        
    }
})

请帮助我,我已经花了很多时间,我也尝试了一些解决方案的从chatGPT和仍然无法解决这个问题。

tuwxkamq

tuwxkamq1#

一种可能的方法是创建自定义WebView。在该类的loadUrl方法的覆盖中,您可以拦截加载的URL,如果需要,您可以应用带有必要令牌的头部。

class WebViewWithTokenAuth @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null,
) : WebView(context, attrs) {

    init {
        clearCache(true)
        clearFormData()

        setInitialScale(1)

        settings.apply {
            @SuppressLint("SetJavaScriptEnabled")
            javaScriptEnabled = true
            loadWithOverviewMode = true
            useWideViewPort = true
            builtInZoomControls = true
            displayZoomControls = false
        }

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
            @Suppress("DEPRECATION")
            settings.saveFormData = false
        }

        if (BuildConfig.DEBUG) {
            setWebContentsDebuggingEnabled(true)
        }
    }

    override fun loadUrl(url: String) {

        val webViewBaseUrl = "https://abcd.com/training"

        if (url.startsWith(webViewBaseUrl)) {

            val token = App.getOauth().getStoredToken()

            val headers: Map<String, String> = mapOf(
                "Authorization" to "Bearer: ${token?.accessToken}"
            )

            super.loadUrl(url, headers)

        } else {
            super.loadUrl(url)
        }

    }

}

然后,自定义Web视图可以在可组合函数中使用,如下所示:

@Composable
fun MyWebViewScreen(url: String){

    var webView: WebView? = null
    ...

    AndroidView(
        modifier = Modifier.fillMaxSize(),
        factory = { context ->
            WebViewWithTokenAuth(context).apply {
                webViewClient = viewModel.createWebViewClient()
                loadUrl(url)
                webView = this
            }
        },
        update = {
            webView = it
        }
    )
    
    ...
    
}

相关问题