• JavaFx WebView使用研究 Stars


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


    提问之前,请先看提问须知 点击右侧图标发起提问 联系我 或者加入QQ群一起学习 Stars-One安卓学习交流群 TornadoFx学习交流群:1071184701
  • 相关阅读:
    [jni]Getting Started
    USB接口程序编写
    mysql
    learn 学习 试错 练习 SSL
    svn
    第三方支付链接
    错误信息
    app 推广
    xcode 配置等
    .net wordpress 服务器类
  • 原文地址:https://www.cnblogs.com/stars-one/p/15707988.html
Copyright © 2020-2023  润新知