移动互联网开发技术教学网站项目研究第八篇

2021@SDUSC

WebView介绍

现在很多APP里都内置了Web网页,比如说很多电商平台、淘宝、京东、聚划算等等,这些都是可以通过Android中的WebView组件实现的。WebView是一个基于webkit引擎、展现web页面的控件。WebView的使用主要包括:WebView类及其工具类(WebSettings类、WebViewClient类、WebChromeClient类)。WebView 类是 Android 的 View 类的扩展,可让将网页显示为 Activity 布局的一部分。它不会包含功能全面的网络浏览器的任何功能,例如导航控件或地址栏。WebView 默认只显示网页。
在这里插入图片描述

作用

1、在Android客户端上显示和渲染Web页面;
2、在本地与HTML页面实现交互和调用;
3、可以对url申请、页面加载、渲染、对话框等进行额外处理。

与JavaScript的交互方式

在WebView使用中会前端h5界面进行较为频繁的交互,Android与JavaScript通过Webview互相调用方法,实际上是Android 去调用JS的代码 + JS去调用Android的代码,二者交互的桥梁就是WebView。
在这里插入图片描述

存在的漏洞

WebView虽然功能强大,但是在使用过程中存在许多漏洞,容易造成用户数据泄露等等危险,导致APP被攻击者利用,加载恶意代码,窃取用户信息。主要漏洞有三类:任意代码执行漏洞密码明文存储漏洞域控制不严格漏洞,可以针对这些漏洞进行不同的修复。

WebView使用——根据项目代码分析

向应用中添加WebView

<uses-permission android:name="android.permission.INTERNET"/>

首先需要获取互联网访问权限,在清单文件中申请INTERNET权限。android.permission.INTERNET允许程序访问网络连接,可能产生GPRS流量。

<WebView
        android:id="@+id/id_tw"
        android:layout_width="match_parent"
        android:layout_height="590dp" />
<WebView
        android:id="@+id/webview_b"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:layout_editor_absoluteX="206dp"
        tools:layout_editor_absoluteY="267dp" />

要向应用中添加WebView,需要在Activity布局中添加<WebView>元素,或者在onCreate()中将整个Activity窗口设置为WebView。上面是在.xml文件中添加的<WebView>元素。

TextView textview1;
WebView webView;
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textview1 = (TextView) findViewById(R.id.id_refresh);
        webView = (WebView) findViewById(R.id.id_tw);
       
        webView.getSettings().setJavaScriptEnabled(true);
        
        webView.setWebViewClient(new WebViewClient(){
            @Override
            public void onPageFinished(WebView view,String url){
                webView.loadUrl("javascript:window.HTMLOUT.processHTML('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>');");
            }
        });
        webView.loadUrl("https://www.csdn.net/");
        webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        webView.getSettings().setMediaPlaybackRequiresUserGesture(false);        
        webView.getSettings().setBlockNetworkImage(false);
        webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);


    }

然后在Activity中onCreate()中添加WebView。首先要生成一个WebView组件,有两种方式。一个是直接在Activity中生成WebView webView = new WebView(this),另一种是和项目中所写在Activity的layout文件里添加Webview控件webView = (WebView) findViewById(R.id.id_tw);
然后利用WebSettings子类对Webview进行配置和管理。WebSettings用于管理WebView状态配置,当WebView第一次被创建时,WebView包含着一个默认的配置,这些默认的配置将通过get方法返回,通过WebView中的getSettings方法获得一个WebSettings对象,如果一个WebView被销毁,在WebSettings中所有回调方法将抛出IllegalStateException异常。
webView.getSettings().setJavaScriptEnabled(true);如果访问的页面中要与Javascript交互,则webview必须设置支持Javascript,使用如上方法。WebSettings对象方法如下:
setPluginsEnabled(true)支持插件;
setUseWideViewPort(true)将图片调整到适合WebView的大小;
setLoadWithOverviewMode(true)缩放至屏幕大小,与上面两者合用可以设置自适应屏幕;setSupportZoom(true)设置支持缩放,默认为true;
setBuiltInZoomControls(true)设置内置的缩放控件,前面为true该方法才有用;setDisplayZoomControls(false)可以隐藏原生的缩放控件;
setAllowFileAccess(true)设置可以访问文件;
setJavaScriptCanOpenWindowsAutomatically(true)支持通过JS打开新窗口;setLoadsImagesAutomatically(true)支持自动加载图片;
setDefaultTextEncodingName("utf-8")设置编码格式;
setMediaPlaybackRequiresUserGesture(false)该方式是设置WebView是否需要用户手势才能播放媒体,默认true;
setBlockNetworkImage(false)设置WebView是否不应从网络加载图像资源,主要指通过http和https URI方案访问的资源,同时,除非getLoadsImagesAutomatically()加载图片方法返回true,否则此方法不起作用,默认false;
setJavaScriptEnabled(false)设置WebView是否允许执行JavaScript脚本,默认false,不允许;
setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW)设置当一个安全站点企图加载来自一个不安全站点资源时WebView的行为;

MIXED_CONTENT_ALWAYS_ALLOW:允许从任何来源加载内容,即使起源是不安全的;
MIXED_CONTENT_NEVER_ALLOW:不允许Https加载Http的内容,即不允许从安全的起源去加载一个不安全的资源;
MIXED_CONTENT_COMPATIBILITY_MODE:当涉及到混合式内容时,WebView 会尝试去兼容最新Web浏览器的风格。

还有一个重要的方法用以设置WebView缓存方式setCacheMode()。当加载 html 页面时,WebView会在/data/data/包名目录下生成 database 与 cache 两个文件夹,而请求的 URL记录保存在 WebViewCache.db,而URL的内容是保存在 WebViewCache 文件夹下。设置缓存的语句如下:

//优先使用缓存:
webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
//缓存模式如下:
//LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
//LOAD_DEFAULT: 根据cache-control决定是否从网络上取数据,是默认方式。
//LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
//LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。
//LOAD_CACHE_NORMAL //API level 17中已经废弃, 从API level 11开始作用同LOAD_DEFAULT模式
//不使用缓存:

webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
webView.getSettings().setAppCachePath(cacheDirPath); //设置 Application Caches 缓存目录,每个Application 只调用一次 setAppCachePath()。
项目中设置为webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

webView.setWebViewClient(new WebViewClient());的作用是当从一个网页跳转到另外一个网页时,可以使目标网页仍然在当前的WebView中显示,而不是在浏览器中打开,这样设置后,点击网页中的链接时,就不会将事件交由系统处理,而是将新的点击事件交由WebViewClient类处理。
WebViewClient是一个事件接口。通过提供自己的WebViewClient实现,可以响应呈现事件。例如,可以检测渲染程序何时开始从特定URL加载图像,或决定是否向服务器重新提交POST请求。
可以重写接口中的方法,实现自己想要的效果。比如,项目中所重写的onPageFinished()方法,该方法在页面加载结束时调用,可以关闭加载条,切换程序动作。常用的还有onPageStarted()方法,开始载入页面调用时使用,可以设置加载界面,告诉用户程序在等待网络响应。onLoadResource()方法在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次。onReceivedError()在加载页面的服务器出现错误时调用,可以自己设置本地的错误提示页面,而不是默认的提示页面。
webView.LoadUrl(String url);是加载网页的一种方法:

webView.loadUrl("https://www.csdn.net/");//通过访问网络地址获取
webView.loadUrl("file://"+ Environment.getExternalStorageDirectory().getPath()+"/1/index.heml");//通过手机SD卡获取(Environment.getExternalStorageDirectory().getPath()是获取手机SD卡根目录的,后面就是目录的地址)
webView.loadUrl("file:///android_asset/index.html");// //通过项目本地资源获取
webView.loadUrl("http://192.168.252.164:8080");//访问本地html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值