JavaFx WebView使用研究
2021-12-19 17:46
841 查看
原文: JavaFx WebView使用研究 | Stars-One的杂货小窝
本篇是基于TornadoFx框架的基础研究的,示例代码都是Kotlin版本,各位可以看着参考下
WebView中比较重要的是其内置的engine对象,后续的相关操作都是通过这个对象进行管理
加载网页
使用
WebView内置的
engine对象的
load()方法进行网页的加载
class TestView : View("My View") { var webView by singleAssign<WebView>() override val root = vbox { setPrefSize(600.0,500.0) webView = webview { } webView.engine.load("https://stars-one.site") } }
获取页面地址
获取当前页面地址直接获取location属性值即可
val currentUrl = engine.location
上述是直接获取页面地址,除此之外,engine还提供了一个页面地址变化的监听器,如下代码:
engine.locationProperty().addListener { observable, oldValue, newValue -> println("之前的网址: ${oldValue}") println("新加载网址: ${newValue}") }
获取页面内容
val htmlStr = webView.engine.document.ownerDocument.textContent
也可以设置个监听器,每次页面发生跳转的时候,会触发监听的回调,来获取新的页面内容数据,代码如下:
engine.documentProperty().addListener { observable, oldValue, newValue -> //页面Document val htmlStr = oldValue.ownerDocument.textContent //这里如果Html是有动态加载iframe,是没法拿到iframe加载的数据内容的,即使你再网页上已经看到加载完毕了!! }
PS:需要注意的是,如果html中的使用js去动态加载iframe的内容,使用上述方法并不能获取iframe内加载的文档内容
cook 56c ie的读写
WebView中,有个cookie处理器,默认是
com.sun.webkit.network.CookieManager,这个我们可以拿到cookie的字符串,但是没法去设置cookie
研究的时候全网找了下方法,算是曲线救国解决了(也不知道合不合理,具体就没过多研究了)
在webview加载网址url之前,我们得先使用
CookieManager.setDefault()方法去设置一个我们定义好的对象
CookieManager(java.net包中)
之后,想要获取Cookie即可调用
CookieHandler.getDefault()方法获取
获取cookie
val cookieManager = CookieHandler.getDefault() as CookieManager val cookieStore = cookieManager.cookieStore val map = mutableMapOf<URI, List<HttpCookie>>() //根据域名去找域名下的cookie cookieStore.urIs.forEach { //如果想要获取指定域名,建议在这里加个判断条件,过滤一下域名 val httpCookieList = cookieStore[it] map[it] = httpCookieList }
关于cookie保存和设置
fun saveCookie() { val cookieManager = CookieHandler.getDefault() as CookieManager val cookieStore = cookieManager.cookieStore val map = mutableMapOf<URI, List<HttpCookie>>() cookieStore.urIs.forEach { val httpCook ad8 ieList = cookieStore[it] map[it] = httpCookieList } val localCookie = LocalCookie(map) //将实体类的数据转为json字符串进行存储 val cookieManagerStr = Gson().toJson(localCookie) //下面是用了tornadofx内置的存储,将字符串写入了指定的配置文件中,可以替换成实现的步骤 //之后首次进来需要读取该文件,将cookie设置即可 config["cookieManagerStr"] = cookieManagerStr config.save() } //实体类 data class LocalCookie(val map: Map<URI, List<HttpCookie>>)
进来时候cookie的设置:
fun loadCookie() { //1.读文件将json字符串读取 val buffer = StringBuffer() val json = config.string("cookieManagerStr", "") //2.创建一个CookieManager(这里要导入java.net包中) val myCookie = CookieManager() if (json.isNotBlank()) { //3. 循环将数据重新写入到CookieManager中 val localCookie = Gson().fromJson(json, LocalCookie::class.java) localCookie.map.forEach { key, list -> list.forEach { //注意:这里是判断cookie是否过期,过期就不添加到里面了 if (!it.hasExpired()) { myCookie.cookieStore.add(key, it) } } } } //4.设置cookie(如果没有cookie的话,这样设置也没事) CookieManager.setDefault(myCookie) }
cookie的妙用:
某些网站中某些页面需要登录才能访问的的,其实本质上就是在访问网页前添加了cookie的参数
我们可以先使用webview访问其网页,让用户扫码进行登录,之后获取cookie的数值,拼接成字符串,然后访问那些需要才能访问的网页
访问网页的时候请求头的header中带上
cookie属性(具体设置可参照你使用的网络框架),之后即可绕过登录的限制
相关文章推荐
- phonegap使用的初步研究(一)cordovaWebView不能加载外网的页面
- Android WebView的使用
- Android的webview研究
- Android WebView的使用
- RSS Reader实例开发之解析XML和使用WebView
- 让python在android系统上飞一会儿:第四节 使用WebView制作程序界面
- Android WebView使用
- 继承ViewGroup研究(2)--在XML中使用ViewGroup初探
- WebView组件的使用详解
- webView控件基本使用
- 在本地UI使用webview,在html页面用js与android通信方法。
- Android 3.X中WebView使用ZOOM崩溃的问题
- 在WebView中点击链接使用自身打开
- 如何使用WebView访问https的url——处理SslError
- Android-----WebView使用
- webview使用入门(2)
- 在app里使用webview
- Android中使用WebView, WebChromeClient和WebViewClient加载网页
- WebView添加Title使用隐藏函数setEmbeddedTitleBar的方法
- Android中webview的使用