【问题标题】:Get values of parameters of javascript function from Java?从Java获取javascript函数的参数值?
【发布时间】:2018-05-23 11:34:48
【问题描述】:

对于我的 Java 应用程序,我需要能够在给定一个 JavaScript 字符串的情况下确定传递给函数调用的实际参数。

例如,给定这个 JavaScript 字符串:

const url = "http://foo.bar?q=" + location.href
const method = "GET"
const isAjax = true

let xmlhttp = new XMLHttpRequest();
xmlhttp.open(method, url, isAjax);

我想评估这个 JavaScript 以获得这个:

xmlhttp.open("GET", "http://foo.bar?q=someurl", true);

现在我正在使用正则表达式来查找我感兴趣的 JavaScript 部分(在此示例中,它将是 XMLHttpRequest 对象的 open 方法),但我需要能够计算实际的传递给函数的参数值,如果它们不是从调用端硬编码的。

我一直在这里搜索,但我发现更多与实际执行 JavaScript 代码有关,而不是查看其表达式值(更像是评估它,获取 AST 或类似的东西)。

关于如何实现这一点的任何想法?

【问题讨论】:

  • 在示例情况下不可能,因为除非您实际在客户端浏览器一侧运行此脚本,否则您不会知道 location.href 的值。您可以尝试使用 Nashorn 引擎运行脚本,但我怀疑它会按照您的预期进行,因为要求非常模糊。
  • 是的,这是真的。实际上,这些 JavaScript 文件来自实际网页,我从爬虫下载它们然后处理它们
  • 在你的问题的这个定义中,你需要以一种非常具体的方式重写你下载的所有javascript,然后运行它来获取参数。不会有任何通用的解决方案可以做出好的 SO 答案。我假设您已经知道如何运行脚本引擎的无头浏览器,因为您正在抓取 JS。

标签: javascript java parsing evaluation expression-evaluation


【解决方案1】:

我的想法是添加一些像sinon 这样的javascript 模拟库并执行这个javascript。 特别看看fake XMLHttpRequest

Javascript 代码如下:

let sinon = require('sinon');
let xhr = sinon.useFakeXMLHttpRequest();
let requests = [];
xhr.onCreate = function (xhr) {
        requests.push(xhr);
    }
const url = "http://foo.bar?q=" + location.href
const method = "GET"
const isAjax = true

let xmlhttp = new XMLHttpRequest();
xmlhttp.open(method, url, isAjax);

console.log(requests[0].url)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 2019-02-19
    • 2014-06-06
    相关资源
    最近更新 更多