原文: 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. Centos8上安装Nginx

    一.Nginx下载 官网:http://nginx.org/ 选择稳定版下载:直接右键复制下载地址即可 命令: wget http://nginx.org/download/nginx-1.20.2. ...

  2. idea内存配置

     找到IDEA安装的bin目录 打开idea.exe.vmoptions 文件 如果嫌麻烦还打开了idea 那么就可以点击这个.. 关键的三个参数的说明 1. -Xms 是最小启动内存参数 2. -X ...

  3. Codeforces 611H - New Year and Forgotten Tree(二分图多重匹配)

    Codeforces 题目传送门 & 洛谷题目传送门 首先我们将所有十进制下位数相同的点看作一种颜色,这样题目转化为,给定 \(m\le 6\) 种颜色.每种颜色的点的个数 \(b_i\) 以 ...

  4. R语言与医学统计图形-【20】ggplot2图例

    ggplot2绘图系统--图例:guide函数.标度函数.overrides.aes参数 图例调整函数guide_legend也属于标度函数,但不能单独作为对象使用,即不能如p+guide_legen ...

  5. Hosts文件详解

    一.缘由 关于我们工作室项目配置过程中,有一个重要但却容易被忽略的环节 - hosts文件的修改. 之前配置hosts文件的时候,只知道那么做就可以了,但并不知道其中的原因,由于开发任务的急迫,也就未 ...

  6. 脱离Editor、VS等IDE如何编译UE4工程

    在Windows平台下,我们从.uproject文件生成VS解决方案.sln文件 .uproject文件用于打开Editor .sln文件用于打开VS工程 对于有增加C++代码的工程,Editor中和 ...

  7. 一个简单的BypassUAC编写

    什么是UAC? UAC是微软为提高系统安全而在Windows Vista中引入的新技术,它要求用户在执行可能会影响计算机运行的操作或执行更改影响其他用户的设置的操作之前,提供权限或管理员‌密码.通过在 ...

  8. 云原生PaaS平台通过插件整合SkyWalking,实现APM即插即用

    一. 简介 SkyWalking 是一个开源可观察性平台,用于收集.分析.聚合和可视化来自服务和云原生基础设施的数据.支持分布式追踪.性能指标分析.应用和服务依赖分析等:它是一种现代 APM,专为云原 ...

  9. Leetcode中的SQL题目练习(一)

    595. Big Countries https://leetcode.com/problems/big-countries/description/ Description name contine ...

  10. Maven打包及场景

    场景一 对当前项目打包并指定主类. <build> <plugins> <plugin> <artifactId>maven-compiler-plug ...