JavaFx WebView使用研究
原文: 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使用研究的更多相关文章
- Atitit 桌面软件跨平台gui解决方案 javafx webview
Atitit 桌面软件跨平台gui解决方案 javafx webview 1.1. 双向js交互1 1.2. 新弹出窗口解决1 1.3. 3.文档对象入口dom解析1 1.4. 所以果断JavaFX, ...
- JavaFX WebView and WebEngine Tutorial教程
JavaFX WebView JavaFX WebView is a mini browser that is called as an embedded browser in JavaFX appl ...
- 用javafx webview 打造自己的浏览器
背景 项目需要做一个客户端的壳,内置浏览器,访问指定 的url 采用技术 java 1.8 开始吧! java环境配置略 hello world import javafx.application.A ...
- web端生成的带有echarts图表的html页面,嵌入在(javaFx)webview中显示错位问题
web项目需要嵌入到手机APP的webview里面以及 windows客户端应用(JavaFx)的webview里面,这个时候就出现了问题. echarts渲染的时候根据浏览器不同的内核显示是有区别的 ...
- Xamarin.Forms——WebView技术研究
在Xamarin中有一些Forms原生不太好实现的内容可以考虑使用HTML.Javascript.CSS那一套前端技术来实现,使用WebView来承载显示本地或网络上的HTML文件.不像OpenUri ...
- 对webview的研究--------引用
简要的说,webview能够在移动应用中开辟出一个窗口,在里面显示html页面,css以及js代码也可以被解析执行,它使用的是我们熟悉的webkit内核.android和ios都有相应的API,所以写 ...
- 【WP8.1】WebView笔记
之前在WP8的时候做过WebBrowser相关的笔记,在WP8.1的WebView和WebBrowser有些不一样,在这里做一些笔记 下面分为几个部分 1.禁止缩放 2.JS通知后台C#代码(noti ...
- 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 手写文字识别 ...
- 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 ...
随机推荐
- 使用apt安装docker
使用apt安装docker # 更新数据源 apt-get update # 安装所需依赖 apt-get -y install apt-transport-https ca-certificates ...
- 应用程序池自动停止,事件查看器报错6D000780
20210913 今天中午网站突然报错,后台程序无法访问,503错误. 调查发现"应用程序池"被关闭,但是手动开启后不久,又被关闭. 本地调试没问题,所以一开始怀疑是服务器或者Ng ...
- System类的常用方法(currentTimeMillis与arraycopy)
System类的常用方法 currentTimeMillis与arraycopy import java.util.Arrays; /* java.lang.System类中提供了大量的静态方法,可以 ...
- Go语言核心36讲(Go语言实战与应用十九)--学习笔记
41 | io包中的接口和工具 (下) 上一篇文章中,我主要讲到了io.Reader的扩展接口和实现类型.当然,io代码包中的核心接口不止io.Reader一个. 我们基于它引出的一条主线,只是io包 ...
- 贪心/构造/DP 杂题选做
本博客将会收录一些贪心/构造的我认为较有价值的题目,这样可以有效的避免日后碰到 P7115 或者 P7915 这样的题就束手无策进而垫底的情况/dk 某些题目虽然跟贪心关系不大,但是在 CF 上有个 ...
- 2021.9.30 Codeforces 中档题四道
Codeforces 1528D It's a bird! No, it's a plane! No, it's AaParsa!(*2500) 考虑以每个点为源点跑一遍最短路,每次取出当前距离最小的 ...
- 洛谷 P7718 -「EZEC-10」Equalization(差分转化+状压 dp)
洛谷题面传送门 一道挺有意思的题,现场切掉还是挺有成就感的. 首先看到区间操作我们可以想到差分转换,将区间操作转化为差分序列上的一个或两个单点操作,具体来说我们设 \(b_i=a_{i+1}-a_i\ ...
- Linux三剑客之老三grep
说明: Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来.工作中我们常常用它来过滤出我们想要的数据. 格式: grep [OPTIONS] 基本参 ...
- Scrapy-Splash的安装和使用
Scrapy-Splash是一个Scrapy中支持JavaScript渲染的工具. Scrapy-Splash的安装分为两部分.一个是Splash服务的安装,具体是通过Docker,安装之后,会启动一 ...
- 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 ...