【问题标题】:Manipulating Javascript with Java用 Java 操作 Javascript
【发布时间】:2011-06-10 21:50:40
【问题描述】:

我有一个复杂的、生成的 Javascript 文件(它由 GWT 编译器生成),我需要能够以编程方式对此进行更改并输出文件的“清理”版本。特别是,我有:

function bookmark(){
    // lots-o-javascript
    var M=Vb+s+I+Wb;n.write(Xb+Yb+Zb+$b+_b+ac+bc+$b+_b+cc+dc+ec+M+fc+gc+hc+ic)
}
bookmark();

未混淆,函数内部如下:

var compiledScriptTag = '"<script src=\\"' + base + strongName + '.cache.js\\"><\/scr" + "ipt>"';
$doc_0.write('<scr' + 'ipt><!-' + '-\n' + 'blah blah blah' + 'document.write(' + compiledScriptTag + ');' + '\n-' + '-><\/scr' + 'ipt>');

所以我需要做的是在一个Java servlet中,将上面两行转换成等价于:

eval('blah blah blah');
document.body.appendChild(document.createElement('script')).src=base + strongName + ".cache.js";

解析和重新排列这个 Javascript 文件的最佳选择是什么?我应该研究一下 Rhino,它是否能够为这些提供句柄(以及使用 $doc.write 编写的嵌套 Javascript)?任何想法将不胜感激。

【问题讨论】:

  • 在 GWT 编译成 JavaScript 之前,将函数包含到 Java 代码中不是更容易吗?
  • 我认为您指的是 GWT 中的内联原生 JS 函数?我认为这行不通,此代码位于 Javascript 加载程序中,而不是已编译的应用程序中。如果您知道如何使这项工作发挥作用,请告诉我。

标签: java javascript gwt serverside-javascript


【解决方案1】:

您可以在 GWT 编译器中添加 -style PRETTY 以获得未混淆的 JavaScript。

要使用 Rhino 评估您的 JavaScript,您需要提供浏览器特定的对象,例如文档、窗口、... 在任何情况下 document.write 都会让一切变得非常复杂。

您还可以使用提供的 ECMAScript 语法使用 ANTLRv3 解析 JavaScript,但我不确定这是否会对您有所帮助。

【讨论】:

    【解决方案2】:

    由于您需要进行的转换非常具体,因此我能看到的最简单的解决方案是将 js 作为纯文本使用,而不是将其视为一种语言。

    您可以在 + 上拆分,然后获取相关的数组值。

    【讨论】:

    • 我想过这一点,特别是因为我的目标是文件的最后,但是正则表达式会变得非常疯狂,我正在尝试做一些对 PRETTY 和 OBFUSCATED 输出都有效的事情所以我虽然解析JS是要走的路......
    • 但是你需要正则表达式吗?有时字符串拆分要简单得多,而且启动时性能几乎总是更好:)
    • 我知道你打算这样做,这不是一个坏主意。我会试一试,看看它是否有效
    【解决方案3】:

    您可以在 Java 中使用 RegEx,但我建议使用常规字符串搜索函数并在新的 StringBuilder 对象中重新构建 JavaScript 代码。

    【讨论】:

      【解决方案4】:

      也许更优雅和更少蛮力的选项是修改 iframe 链接器以更改您需要的内容,或者我认为您可以创建辅助链接器并在加载程序被混淆之前更改行。链接器是我还没有玩过的一件事,但我知道它们可能是做你想做的事情的最佳场所。

      【讨论】:

      • 那将是理想的解决方案,我实际上正在使用跨站点链接器 (xs)。我找不到任何关于如何做到这一点的文档/示例。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多