不管是用Jcef还是JxBrowser,很多时候我们的目的并不是为公司开发应用,而是为了方便自己做些不太善良的事,比如说js脚本注入。

通过JS脚本注入,我们可以丰富已有的网页上的功能。

执行网页JS的代码也很简单:

browser.executeJavaScript("document.title ='My title';");

但是很多情况下,JS脚本是混淆过的,很难分析。分析完后,东来西去在代码的汪洋里找自己需要的,好不容易才写出一个注入脚本。

有时可能仅仅是为了在某个按钮点击完成后执行自己想要的操作,或者是获取解密后的数据。

其实,不是所有事情都得靠注入解决,如果注入实在是麻烦,我们可以换个思路:直接替换加载的源码不就好了。

将完整的JS文件下载到本地,将混淆后的代码格式化一下,分析源码,根据需要修改代码,再在JxBrowser开始请求加载JS的时候,把JS指向我们本地的JS。不管混淆得如何花里胡哨,只要找到了正确的插入点,它几乎是骚不起来的。

拥有强大力量的JxBrowser里面可以很方便的实现这样的操作。(请查阅帮助文档 文献资料(Documentation)>载入内容(Loading Content))

编写一个DefaultNetworkDelegate的子类TestNetworkDelegateTranslate,重写onBeforeURLRequest方法,通过browser.getBrowserContext().getNetworkService().setNetworkDelegate(new TestNetworkDelegateTranslate());

public class TestNetworkDelegateTranslate extends DefaultNetworkDelegate{/** 当即将发生请求时,将调用此方法。在建立任何TCP连接之前发送此事件,该事件可用于将请求重定向到另一个位置。* 该方法被同步调用。执行此方法时,URL请求将被阻止。如果此方法引发异常,则将使用默认行为-目标URL将不会更改。* params:提供有关请求URL和HTTP方法的信息(“ GET”,“ POST”等)。要覆盖目标URL,请使用  RequestParams.setURL(String)  方法。*/@Overridepublic void onBeforeURLRequest(BeforeURLRequestParams params) {System.out.println("可以被修改请求的URL:"+params.getURL());
//      params.setURL("");if(params.getURL().startsWith("https://xxx/xxx.js")) {params.setURL("file:///d:\xxx.js");}super.onBeforeURLRequest(params);}
}

有时候我们需要监听ajax数据,JxBrowser里面有提供此功能,还是使用DefaultNetworkDelegate。

public class XymNetworkDelegateTranslate extends DefaultNetworkDelegate{@Overridepublic void onDataReceived(DataReceivedParams params) {
//        System.out.println("数据到达...");String url=params.getURL();
//        System.out.println("URL:"+params.getURL());if(url.indexOf("xxxxxxxx")!=-1) {System.out.println("接收数据URL..."+url);String data = new String(params.getData(),Charset.forName("UTF-8"));System.out.println("data = " + data);}super.onDataReceived(params);}
}

这里的代码在数据量很大时会有问题(比如说获取JS文件内容),因为数据会分多次接收,可以使用onDataReceived和onCompleted组合。

然而这也会产生一个问题,DefaultNetworkDelegate这个类运行时间长了后,偶尔会出现问题,譬如先执行了onCompleted,再执行onDataReceived。所以最好还是用脚本注入的形式。

如果ajax获取的数据不是很大,只使用onDataReceived就行了。

public class XymNetworkDelegate extends DefaultNetworkDelegate{List < byte[] > blist=new ArrayList<byte[]>();@Overridepublic void onDataReceived(DataReceivedParams params) {
//        System.out.println("数据到达...");String url=params.getURL();
//        System.out.println("URL:"+params.getURL());if(url.indexOf("xxxx")!=-1) {System.out.println("接收数据...");blist.add(params.getData());}super.onDataReceived(params);}@Overridepublic void onCompleted(RequestCompletedParams params) {String url=params.getURL();if(url.indexOf("xxxx")!=-1) {System.out.println("数据接收完成...");try {saveByteList();}catch(Exception e) {e.printStackTrace();}blist.clear();}super.onCompleted(params);}public void saveByteList() {if(blist.isEmpty()) {return;}int length=0;for(int i=0;i<blist.size();i++) {length+=blist.get(i).length;}byte[] b1=new byte[length];length=0;for(int i=0;i<blist.size();i++) {System.arraycopy(blist.get(i), 0, b1,length, blist.get(i).length);length+=blist.get(i).length;}try {String data=new String(b1, "UTF-8");System.out.println(data);}catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

JxBrowser-JS调用和AJAX数据监听相关推荐

  1. vue笔记(二)Vue-class与style、事件、计算属性、数据监听、指令+自定义指令、过滤器

    vue官网 一 .class.style操作 二.事件 三.计算属性 四.数据监听.观测 五.指令+自定义指令 六.过滤器 一 .class.style操作 官网 1. class使用: (1)v-b ...

  2. Python黑客编程基础3网络数据监听和过滤

    Python黑客编程3网络数据监听和过滤 课程的实验环境如下: •      操作系统:kali Linux 2.0 •      编程工具:Wing IDE •      Python版本:2.7. ...

  3. Python黑客编程3网络数据监听和过滤

    课程的实验环境以下: •      操作系统:kali Linux 2.0 •      编程工具:Wing IDE •      Python版本:2.7.9 •      触及到的主要python ...

  4. 你值得拥有!更省钱地完成数据监听

    作者 | 梁唐 来源 | TechFlow(ID:techflow2019) 大家好,今天一起来了解一个新的设计模式--观察者模式. 观察者模式的思路很简单,它被广泛地应用在各种数据监控上. 很多时候 ...

  5. Object.defineProperty与双向绑定、数据监听

    一.对象赋值的两种方式 一是"="赋值,一是Object.defineProperty方法,而当下流行框架中广泛应用的双向绑定和数据监听等,就是利用的第二种方式,关于此方法不多讲, ...

  6. 使用 JS 关闭警告框及监听自定义事件(amaze ui)

    使用 JS 关闭警告框及监听自定义事件(amaze ui) 一.总结 1.jquery匿名函数:第8行,jquery匿名函数,$(function(){});,有没有很简单,只是少了jquery的前面 ...

  7. vue,watch监听数据,数据监听

    vue,watch监听数据,数据监听 三个值: 1.第一个handler:其值是一个回调函数.即监听到变化时应该执行的函数. 2.第二个是deep:其值是true或false:确认是否深入监听.(一般 ...

  8. 我的Vu啊(vue 2.0,数据监听,计算属性,组件传参)

    提示:个人Vue学习工作总结  (持续更新中如果有不对的地方还请前辈多多指点) 文章目录 vue 计算属性 computed vue  数据监听 wacth 提示:以下是本篇文章正文内容,下面案例可供 ...

  9. 【angular-实践】数据监听并渲染到界面上

    背景 为了做一个面包屑的样式 思路 三个界面: 根页面: index(展示面包屑) 资金页面: fund(展示收入.支出,属于同一个页面) 步骤: 在index服务中存BehaviorSubject类 ...

  10. JS赋值隐藏input并监听值变化

    JS赋值隐藏input并监听值变化 <!DOCTYPE html> <html lang="en"> <head><meta charse ...

最新文章

  1. .Net开发时有没有好的页面开发框架?
  2. Codeforces 479【E】div3
  3. 文章 图片 PHP保存,关于文章图片储存
  4. 【资源共享】休眠唤醒 开发指南
  5. 洛谷 P1044 栈 [卡特兰数]
  6. Java笔记-Spring Boot使用外部Tomcat及解决Tomcat乱码
  7. 如何在vs中创建r树索引代码_线段树详解与实现
  8. 【Elasticsearch】Elasticsearch 索引策略
  9. 契税申报期限_纳税申报的5个小常识,会计不知道,真不适合干会计
  10. easy2game使用教程_Easy2game什么用
  11. 解析OA系统易用性的价值和意义
  12. 鸿蒙os beta3.0怎么升级,鸿蒙系统 2.0 Beta3.0版本更新详解
  13. CentOS 7 虚拟机网卡失效问题:ens33:<NO-CARRIER,BROADCAST,MULTICAST,UP>mtu 1508 gdisc pf ifo_fast state DOWN
  14. 鸿蒙系统可以微信吗,微信鸿蒙版下载-微信华为鸿蒙操作系统版 v7.0.21-91优手机网...
  15. maven相关(1)
  16. 基于OpenCV的火焰检测(二)——RGB颜色判据
  17. ubantu + anaconda + TensorFlow 1.13.1
  18. pyecharts 在地图上根据经纬度和量值,画出散点图/热力图
  19. RecyclerView(一)最简单的recyclerview
  20. 这可能是我使用百度网盘以来最好用的高速下载器了

热门文章

  1. 计算机电缆yjv,WDZN-YJV是什么电缆|yjv电缆
  2. 超实用的XRD数据定性分析方法,三分钟上手,科研小白变大神!
  3. 物料编码的制定(资料收集)
  4. TOGAF9.2第I部分 第2章核心概念
  5. 原来TOGAF标准第10版是个活力生态圈
  6. 基于nodejs,tinypng的压缩图片工具
  7. 数学之美:余弦定理和新闻分类
  8. 汉王人脸通正式亮相 让十三亿张脸生动起来
  9. ZendStudio 安装
  10. cmd查看所有数据库 db2_DB2常用命令