原文: 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内加载的文档内容

cookie的读写

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 httpCookieList = 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属性(具体设置可参照你使用的网络框架),之后即可绕过登录的限制

JavaFx WebView使用研究的更多相关文章

  1. Atitit 桌面软件跨平台gui解决方案 javafx webview

    Atitit 桌面软件跨平台gui解决方案 javafx webview 1.1. 双向js交互1 1.2. 新弹出窗口解决1 1.3. 3.文档对象入口dom解析1 1.4. 所以果断JavaFX, ...

  2. JavaFX WebView and WebEngine Tutorial教程

    JavaFX WebView JavaFX WebView is a mini browser that is called as an embedded browser in JavaFX appl ...

  3. 用javafx webview 打造自己的浏览器

    背景 项目需要做一个客户端的壳,内置浏览器,访问指定 的url 采用技术 java 1.8 开始吧! java环境配置略 hello world import javafx.application.A ...

  4. web端生成的带有echarts图表的html页面,嵌入在(javaFx)webview中显示错位问题

    web项目需要嵌入到手机APP的webview里面以及 windows客户端应用(JavaFx)的webview里面,这个时候就出现了问题. echarts渲染的时候根据浏览器不同的内核显示是有区别的 ...

  5. Xamarin.Forms——WebView技术研究

    在Xamarin中有一些Forms原生不太好实现的内容可以考虑使用HTML.Javascript.CSS那一套前端技术来实现,使用WebView来承载显示本地或网络上的HTML文件.不像OpenUri ...

  6. 对webview的研究--------引用

    简要的说,webview能够在移动应用中开辟出一个窗口,在里面显示html页面,css以及js代码也可以被解析执行,它使用的是我们熟悉的webkit内核.android和ios都有相应的API,所以写 ...

  7. 【WP8.1】WebView笔记

    之前在WP8的时候做过WebBrowser相关的笔记,在WP8.1的WebView和WebBrowser有些不一样,在这里做一些笔记 下面分为几个部分 1.禁止缩放 2.JS通知后台C#代码(noti ...

  8. Atitit s2018.2 s2 doc list on home ntpc.docx  \Atiitt uke制度体系 法律 法规 规章 条例 国王诏书.docx \Atiitt 手写文字识别 讯飞科大 语音云.docx \Atitit 代码托管与虚拟主机.docx \Atitit 企业文化 每日心灵 鸡汤 值班 发布.docx \Atitit 几大研发体系对比 Stage-Gat

    Atitit s2018.2 s2 doc list on home ntpc.docx \Atiitt uke制度体系  法律 法规 规章 条例 国王诏书.docx \Atiitt 手写文字识别   ...

  9. Atitit s2018 s4 doc list dvchomepc dvccompc.docx .docx \s2018 s4 doc compc dtS44 \s2018 s4 doc dvcCompc dtS420 \s2018 s4f doc homepc \s2018 s4 doc compc dtS44\(5 封私信 _ 44 条消息)WebSocket 有没有可能取代 AJAX

    Atitit s2018 s4 doc list dvchomepc dvccompc.docx .docx \s2018 s4 doc compc dtS44 \s2018 s4 doc dvcCo ...

随机推荐

  1. 使用apt安装docker

    使用apt安装docker # 更新数据源 apt-get update # 安装所需依赖 apt-get -y install apt-transport-https ca-certificates ...

  2. 应用程序池自动停止,事件查看器报错6D000780

    20210913 今天中午网站突然报错,后台程序无法访问,503错误. 调查发现"应用程序池"被关闭,但是手动开启后不久,又被关闭. 本地调试没问题,所以一开始怀疑是服务器或者Ng ...

  3. System类的常用方法(currentTimeMillis与arraycopy)

    System类的常用方法 currentTimeMillis与arraycopy import java.util.Arrays; /* java.lang.System类中提供了大量的静态方法,可以 ...

  4. Go语言核心36讲(Go语言实战与应用十九)--学习笔记

    41 | io包中的接口和工具 (下) 上一篇文章中,我主要讲到了io.Reader的扩展接口和实现类型.当然,io代码包中的核心接口不止io.Reader一个. 我们基于它引出的一条主线,只是io包 ...

  5. 贪心/构造/DP 杂题选做

    本博客将会收录一些贪心/构造的我认为较有价值的题目,这样可以有效的避免日后碰到 P7115 或者 P7915 这样的题就束手无策进而垫底的情况/dk 某些题目虽然跟贪心关系不大,但是在 CF 上有个 ...

  6. 2021.9.30 Codeforces 中档题四道

    Codeforces 1528D It's a bird! No, it's a plane! No, it's AaParsa!(*2500) 考虑以每个点为源点跑一遍最短路,每次取出当前距离最小的 ...

  7. 洛谷 P7718 -「EZEC-10」Equalization(差分转化+状压 dp)

    洛谷题面传送门 一道挺有意思的题,现场切掉还是挺有成就感的. 首先看到区间操作我们可以想到差分转换,将区间操作转化为差分序列上的一个或两个单点操作,具体来说我们设 \(b_i=a_{i+1}-a_i\ ...

  8. Linux三剑客之老三grep

    说明: Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来.工作中我们常常用它来过滤出我们想要的数据. 格式: grep [OPTIONS] 基本参 ...

  9. Scrapy-Splash的安装和使用

    Scrapy-Splash是一个Scrapy中支持JavaScript渲染的工具. Scrapy-Splash的安装分为两部分.一个是Splash服务的安装,具体是通过Docker,安装之后,会启动一 ...

  10. A Child's History of England.20

    CHAPTER 7 ENGLAND UNDER HAROLD THE SECOND, AND CONQUERED BY THE NORMANS Harold was crowned King of E ...