重写WEBViewClient 的 shouldInterceptRequest(),拦截请求,实现特殊处理(跨域处理)。 例如:拦截旧的url,替换域名,替换参数等,然后使用新url重新发起请求。
重写WEBViewClient 的 shouldInterceptRequest(),拦截请求,实现特殊处理(跨域处理)。
例如:拦截旧的url,替换域名,替换参数等,然后使用新url重新发起请求。
@Requiresapi(Build.VERSioN_CODES.LOLLIPOP) override fun shouldInterceptRequest( view: WebView, request: WebResourceRequest ): WebResourceResponse? { request.url.toString().let { // 判断该请求是否需要拦截处理 if (it.contains("xxx")) { return assembleResponse(view, request) } } //此处代表拦截器不处理该请求,直接原路请求器处理 return super.shouldInterceptRequest(view, request) }
组装WebResourceResponse:
@RequiresApi(Build.VERSION_CODES.LOLLIPOP) private fun assembleResponse( view: WebView, request: WebResourceRequest ): WebResourceResponse? { try { val originUrl = request.url.toString() val realUrl = getRealUrl(originUrl) // val headers = request.requestHeaders val response = doGet(realPath, null).execute() if (response.isSuccessful && response.code() == 200) { return response.body()?.run { WebResourceResponse( response.header("Content-Type"), response.header("Content-Encoding"), response.body()?.byteStream() ) } } } catch (e: Exception) { e.printStackTrace() } }
网络请求–Get:
private fun addHeader(builder: Request.Builder, headers: JSONObject?) { if (headers != null) { val keys = headers.keys() while (keys.hasNext()) { val key = keys.next() val value = headers.optString(key, "") builder.addHeader(key, value) } } } fun doGet(url: String?, headers: jsONObject?): Call? { var client: OkHttpClient? = null val trustManager = HttpUtils.getX509TrustManager() val okhttpBuilder = OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS) .writeTimeout(60, TimeUnit.SECONDS) // okhttp 已经有RetryAndFollowUpInterceptor .hostnameVerifier(HttpUtils.TrustAllHostnameVerifier()) .addNetworkInterceptor(RemoveDirtyConnIntercepter()) .sslSocketFactory(SSLSocketFactoryCompat(trustManager), trustManager) client = okhttpBuilder.build() val builder = Request.Builder().url(url) addHeader(builder, headers) val request = builder.get() .build() return client.newCall(request) }
来源地址:https://blog.csdn.net/zhijiandedaima/article/details/127903455
--结束END--
本文标题: Android webview拦截请求,实现跨域处理
本文链接: https://www.lsjlt.com/news/413029.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-01-21
2023-10-28
2023-10-28
2023-10-27
2023-10-27
2023-10-27
2023-10-27
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0