WebView自定义header loadUrl/additionalHttpHeaders

如题所述

第1个回答  2022-06-03
用户在登录后获取了token值并保存在本地,应用内WebView加载网页时,前端处理token先读取header的该字段,再存到LocalStrorage里,也就是要求客户端在loadUrl的时候,要把token先放到header里,传递给web做登录校验。

通过查看API可用loadUrl(String url, Map<String, String> additionalHttpHeaders)

实际测试时,该方案并不生效,无论authorization大小写均不生效。

和前端联调的结果显示我们没有传这个值,甚至自定义的值都没有写进去。

最终反应出来的效果是没有认证,也就无法进行数据渲染。

但使用Charles抓包显示,在load网页的时候确实在header里有token字段,包括diy字段。

最初的以为是没有LocalStroage的读写权限,随即打开webview的存储开关:
https://yq.aliyun.com/ziliao/150552

测试结果,仍然不行。

查看stackoverflow碰到了差不多的情况
https://stackoverflow.com/questions/7610790/add-custom-headers-to-webview-resource-requests-android

其中有给到解决方案,就是在WebViewClient()的回调方法shouldInterceptRequest里自行处理所有的web渲染

测试结果,该方案能正常渲染,但是问题又来了,在里面点击跳转(非跨域访问),无法正常渲染下一界面。

按照前端同事的说法,他们也是读取header里的值,把token取出来放到LocalStorage里,之后就去拿LocalStorage的值,直接setHeader的方案不行,那么我们就直接帮他们放到存储里。

这里采用java调用js方案
https://www.v2ex.com/t/377333

js注入的时机有很多,比如以下

最终是选择在onReceivedTitle 的回调里注入js

测试通过,跳转也正常。

目前怀疑是authorization不让被复写,具体原因未来得及验证。