原文: 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. nginx反向代理出错:proxy_pass

    问题描述: 一台服务器代理访问另一台服务器,代码如下图所示: 重新加载nginx后不会跳到该域名,而是出现error的页面. 查看error.log日志为以下报错: 2021/03/09 23:07: ...

  2. oracle和mysql的拼接查询

    oracle的 SELECT * FROM sys_user a WHERE 1=1 AND a.company_id || a.login_name IN('3001rddb414') 196676 ...

  3. Python集合&字典

    Python集合&字典 @ 目录 字典 字典的几种定义方式 第一种 第二种 第三种 字典的一些基本操作 通过key得到value 增加字典键值对 删除字典键值对 格式化操作 清空字典 复制字典 ...

  4. Ubuntu 18.04.5 LTS Ceph集群之 cephx 认证及使用普通用户挂载RBD和CephFS

    1.cephx认证和授权 1.1 CephX认证机制 Ceph使用cephx协议对客户端进行身份认证: 1.每个MON都可以对客户端进行身份验正并分发密钥, 不存在单点故障和性能瓶颈 2. MON会返 ...

  5. 记一次使用 SelectMany 的经历

    最近在改造一个功能时为了减少循环的层数,于是想着将List列表映射为一个能直接使用颗粒大小的List列表,这样一层循环就可以解决问题.     public class ConflictWordIte ...

  6. Matlab矢量图图例函数quiverkey

    Matlab自带函数中不包含构造 quiver 函数注释过程,本文参照 matplotlib 中 quiverkey 函数,构造类似函数为 Matlab 中 quiver 矢量场进行标注. quive ...

  7. Python基础之流程控制while循环

    目录 1. 语法 2. while+break 3. while+continue 4. while+else 1. 语法 最简单的while循环如下: ''' while <条件>: & ...

  8. Excel-vlookup内部能不能用函数?(即内部嵌套函数)

    11.vlookup(查找值,目标区域,列序号,FALSE0/TRUE1)内部能不能用函数?(即内部嵌套函数) 总结:只能说有,但不是所有,目前还没有找到规律(唯一的规律是内嵌函数结果值得是符合vlo ...

  9. WebRTC网页打开摄像头并录制视频

    前面我们能打开本地摄像头,并且在网页上看到摄像头的预览图像. 本文我们使用MediaRecorder来录制视频.在网页上播放录制好的视频,并能提供下载功能. html 首先创建一个html界面,放上一 ...

  10. 大数据学习day29-----spark09-------1. 练习: 统计店铺按月份的销售额和累计到该月的总销售额(SQL, DSL,RDD) 2. 分组topN的实现(row_number(), rank(), dense_rank()方法的区别)3. spark自定义函数-UDF

    1. 练习 数据: (1)需求1:统计有过连续3天以上销售的店铺有哪些,并且计算出连续三天以上的销售额 第一步:将每天的金额求和(同一天可能会有多个订单) SELECT sid,dt,SUM(mone ...