如何在客户端浏览器上呈现完整网页的副本?

时间:2012-01-17 19:51:01

标签: java javascript

要求是在服务器端保留完整网页的副本,与在客户端浏览器上呈现的相同,作为过去的记录。重新访问这些记录。

我们正在尝试存储渲染网页的html。然后使用服务器端存在的javascript,css和image等资源呈现html。这些资源不断变化。因此,旧记录不再完美呈现。

还有其他方法可以解决上述问题吗?我们也在考虑使用IText或apache FOP api将其转换为pdf,但他们在转换时不会考虑页面上的javascript效果。 java中是否有可用的API来实现这一目标?

直到现在,没有办法完美运作。请建议。

编辑: 总之,要求是在服务器端创建呈现的网页的精确副本,以在该页面上存储用户活动。

5 个答案:

答案 0 :(得分:1)

wkhtmltopdf 应该为您做得非常好。它将采用一个URL,并返回一个pdf。

code.google.com/p/wkhtmltopdf

示例:

wkhtmltopdf http://www.google.com google.pdf

答案 1 :(得分:1)

取决于您的javascript有多复杂,并且取决于您想要捕捉客户看到的内容的忠实程度,您可能正在执行一项不可能完成的任务。

在较高级别,您有以下选择:

  1. 保留您发送给客户的所有内容的副本
  2. 让客户端完全返回已呈现的内容
  3. 构建系统,以便在需要重现浏览器视图时实际获取组成资源的所有历史版本。
  4. 您可以使用JSP过滤器等执行#1,但它不会解决在客户端上呈现期间javascript获取动态html内容等问题。

    让客户端返回他们所看到的内容(#2)是棘手的,并且带宽密集。

    所以我会选择#3。为了转换呈现动态内容版本的网站,您必须做几件事。首先,所有数据源也需要进行版本控制。因此,任何查询都需要指定版本。 “版本”可以是您维护的时间戳或某个生成计数器。如果您采用这种方法,您还需要确保您提供给客户端的任何JavaScript都不会直接获取外部资源。相反,它应该从您的系统中请求任何资源。您的系统将依次获取外部内容(或从缓存中重用)。

答案 2 :(得分:0)

答案取决于用于编写HTML的服务器技术。您是使用Java / JSP或Servlet还是某种HTTPResponse对象将HTML /数据推送到浏览器?

如果只有CSS / JS / HTML正在发生变化,为什么不直接拍摄客户端代码库的快照并将它们存储为网站版本?

如果涉及其他数据(如XML / JSON),也要拍摄那些和版本的快照。然后,如上所述的客户端代码库的快照与数据的当前快照应该一起为您提供当时网站​​的精确呈现。

答案 3 :(得分:0)

非常耗费资源的要求,但......

您还没有编写正在使用的应用程序服务器和框架。如果您在自己的代码中生成响应,则可以在生成时存储它。

另一种可能性是编写一个过滤器,它将包装servlet的OutputStream并记录写入它的所有内容,你必须确保你的过滤器位于层次结构的顶层。

另一个非常强大,最容易管理和通用的解决方案,但可能是最耗费资源的:写入透明代理服务器停留在用户和应用程序服务器之间,这会将每个调用重定向到应用服务器并返回确切的响应,另外保存每个请求和回复。

答案 4 :(得分:0)

如果您要存储html页面,为什么不对js,css和图像进行引用呢?

我现在不知道你的实现是什么,但你应该创建一个包含所有html页面和资源的文件系统,并创建对db中位置的引用。每次更改文件时,都应该备份文件系统中的资源!

我将此实现用于图像存档。当客户向我们传递图像的网址时,我们希望能够返回并确切地检查他们当时发送的图像(因为它是一个可以随时更改的网址)。我有一个脚本,一旦我们收到url就会下载图像,将其存储在文件系统中,然后将数据库中的文件路径与其他各种细节一起存储。这与你需要的类似,你的表中只有几行用于js,css,images路径。