2012-01-17 28 views
2

要求將服務器端的完整網頁副本保留爲與客戶端瀏覽器上的過去記錄相同的副本。這些記錄將被重新訪問。如何在客戶端瀏覽器呈現完整網頁後立即在服務器端存儲完整網頁的副本?

我們試圖存儲呈現的網頁的HTML。然後使用JavaScript,CSS和圖像等資源呈現在服務器端。這些資源不斷變化。因此,舊記錄不再完美呈現。

有沒有其他解決方法?我們也在考慮使用IText或apache FOP api將其轉換爲pdf,但他們在轉換時不會考慮頁面上的javascript效果。有沒有在Java中可用的API來實現這一目標?

直到現在,沒有辦法完美工作。請建議。

編輯: 總之,要求是在服務器端創建渲染網頁的精確副本,以在該頁面上存儲用戶活動。

+0

您是試圖捕獲頁面中的信息還是頁面的確切外觀? – Dave 2012-01-17 20:07:34

回答

0

答案將取決於用於編寫HTML的服務器技術。您是使用Java/JSP或Servlet還是某種HTTPResponse對象將HTML /數據推送到瀏覽器?

如果只有CSS/JS/HTML發生變化,爲什麼不直接拍攝客戶端代碼庫的快照並將它們存儲爲網站版本?

如果涉及其他數據(如XML/JSON),請同時拍攝這些數據和版本的快照。然後,上面提到的客戶端代碼庫的快照和數據的當前快照應該一起給你在那個時間點的網站的精確呈現。

1

wkhtmltopdf應該爲你做得很好。它將採用URL並返回pdf。

code.google.com/p/wkhtmltopdf

例子:

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

我發現了一些有用的網址支持: http://stackoverflow.com/questions/5688585/how-to-use-wkhtmltopdf-in-java-web-application http://stackoverflow.com/questions/5506275/launch-wkhtmltopdf-from-runtime-getruntime-exec-never-terminates 讓我試一試。謝謝你的幫助。 – 2012-01-19 17:54:13

0

一個非常消耗資源的要求,但...

你還沒有寫你使用的是何種應用程序服務器和什麼框架。如果您在自己的代碼中生成響應,則可以在生成時將其存儲。

另一種可能性是編寫一個過濾器,它會封裝servlet的OutputStream並記錄寫入的所有內容,您必須確保您的過濾器位於層次結構的頂部。

另一個非常強大,最易於管理和通用的解決方案,但可能是最耗費資源的:編寫透明的代理服務器,保留在用戶和應用程序服務器之間,將每個調用重定向到應用程序服務器並返回確切的響應,每個請求和響應。

1

取決於你的javascript是多麼的複雜,取決於你如何忠實地捕捉客戶看到的東西,你可能正在承擔一個不可能完成的任務。

在高層次上,你有以下幾種選擇:

  1. 保持所有內容的副本發送到客戶端
  2. 獲取客戶端即可返回究竟什麼它已使
  3. 建立你的系統,以便您可以在需要重現瀏覽器視圖時真正獲取組成資源的所有歷史版本。

您可以使用JSP過濾器等來執行#1,但它不能解決在客戶端上呈現期間javascript提取動態html內容的問題。

讓客戶返回他們看到的(#2)是棘手的,並且帶寬密集。

所以我會選擇#3。爲了打開一個呈現動態內容版本的網站,你必須做幾件事情。首先,所有數據源也需要進行版本管理。所以任何查詢都需要指定版本。 「版本」可以是您維護的時間戳或一代生成計數器。如果您正在採用這種方法,則還需要確保您提供給客戶端的任何JavaScript都不會直接獲取外部資源。相反,它應該從系統請求任何資源。您的系統將依次獲取外部內容(或從緩存重新使用)。

+0

感謝您的方法。我們也使用過濾器來獲取html內容。我不喜歡這種方法。期待更好的主意。 – 2012-01-19 17:00:19

0

如果您要存儲html頁面,爲什麼不引用js,css和圖片呢?

我不知道你現在的實現是什麼,但是你應該創建一個包含所有html頁面和資源的文件系統,並創建對db中位置的引用。每次更改文件系統時,應該備份文件系統中的資源!

我將此實現用於圖像存檔。當客戶端傳遞給我們一個圖像的url時,我們希望能夠返回並檢查圖像當時是什麼發送的(因爲它是一個隨時可以更改的url)。我有一個腳本,它會在我們收到url後立即下載圖像,將其存儲在文件系統中,然後將其路徑與其他各種細節一起存儲在db中。這與你需要的類似,只需要在表格中爲js,css,images路徑添加更多行。

相關問題