android开发中,webview常用于显示网页或h5页面,一个遇到跨域方面的坑。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android开发中,webview常用于显示网页或h5页面,一个遇到跨域方面的坑。相关的知识,希望对你有一定的参考价值。

参考技术A 1.跨域cookie读取

什么是跨域,简单的说就是不同的域名,我们都知道在pc上我们用浏览器访问网址,不同的网址都会在本地存储一些cookie信息,这样就可以实现比如自动登录等功能,在pc上不同域名是不能相互读取其他域下的cookie信息的(非web专业开发人员,如果理解有误,欢迎指出)。

但是在 android 上在api 23之前,是可以跨域读取cookie的,比如A域写入一个userId的cookie,B域可以读取该值。但是在23时,系统将该值设置成了false,不再让跨域读取了。如果你的应用有跨域读取需求,怎么办?可以采用如下方式进行开启:

/*** 设置跨域cookie读取*/

public final void setAcceptThirdPartyCookies()

//target 23 default false, so manual set true

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)             CookieManager.getInstance().setAcceptThirdPartyCookies(webView,true);       

  



2.http/https混合加载

在现阶段,很多网站都改成了https进行访问,https可以提升访问网站的安全性,防止信息被窃取,如果所有的网页都是https且网页内的链接也是都是https,那就没有混合加载(文本区域https,图片文件http加载)的问题了。但是很多资源现阶段还没有改变成https访问,往往页面都嵌入了http的链接。这种混合网页如果不进行处理,直接加载是会出现错误的。怎么解决这个问题?

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)  

webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);



这也是一个分版本的函数,在api23之前,默认是可以混合加载的,但是在23时,默认值改成了MIXED_CONTENT_NEVER_ALLOW,因此如果你有混合加载的需求,设置setMixedContentMode为MIXED_CONTENT_ALWAYS_ALLOW。

3.无法解决跨域访问问题,可以尝试给webview设置如下配置,已解决该问题;

if (Build.VERSION.SDK_INT >= 16)

Class clazz =webView.getSettings().getClass();

Method method = clazz.getMethod("setAllowUniversalAccessFromFileURLs", boolean.class);

if (method != null)

method.invoke(webView.getSettings(), true);





catch (IllegalArgumentExceptione)

e.printStackTrace();

catch (NoSuchMethodException e)

e.printStackTrace();

catch (IllegalAccessException e)

e.printStackTrace();

catch (InvocationTargetException e)

e.printStackTrace();

安卓混合开发,使用WebView控件展示网页


页面使用webview控件来实现,WebView是Android系统提供能显示网页的系统控件,它是一个特殊的View,他的作用就是

  • 显示和渲染Web页面
  • 加载网络上或本地assets中的html文件
  • 与JavaScript交互调用

常用于同态变化比较大的页面时使用

第一步:

在AndroidManifest.xml下添加网络访问权限,如果需要外网访问的情况下

<!--网络权限-->
<uses-permission android:name="android.permission.INTERNET" />
<!--文件读写权限-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

第二步:

在xml下添加WebView控件

<WebView
    android:layout_width="match_parent"
    android:id="@+id/mywebview"
    android:layout_height="match_parent" />

第三步:

把 activity 中的内容复制过去,注意这里是本地加载:把 html 文件保存到了本地 asset 目录中,远程加载的话直接修改 loadUrl 即可

public class MainActivity extends AppCompatActivity 
    private WebView webv=null;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取到webview控件
        WebView webv=findViewById(R.id.mywebview);

        WebSettings webSettings = webv.getSettings();
        webSettings.setJavaScriptEnabled(true);//设置支持Javascript
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);//允许js弹出窗口

        //访问本地资源文件网页
        webv.loadUrl("file:///android_asset/index.html");

        //通过下面的代码阻止APP直接通过浏览器打开网页
        webv.setWebViewClient(new WebViewClient()
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) 
                //使用WebView加载URL内容
                view.loadUrl(url);
                return  true;
            
        );
        //如果要实习alert弹框,必须实现此监听事件
        webv.setWebChromeClient(new WebChromeClient() 
            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) 
                // TODO Auto-generated method stub
                return super.onJsAlert(view, url, message, result);
            
        );
    

第四步:

创建assets目录

右键【app】-【New】-【Folder】-【Assets Folder】-【finish】

把目录下 test 文件夹内文件全部复制到 assets 目录中

以上是关于android开发中,webview常用于显示网页或h5页面,一个遇到跨域方面的坑。的主要内容,如果未能解决你的问题,请参考以下文章

安卓混合开发,使用WebView控件展示网页

安卓混合开发,使用WebView控件展示网页

WebView 中 Java 与 JavaScript 的交互

android system webview是啥

Android系统 WebView是啥?有啥用?

在 Android 中预加载网页(使用 WebView?)