2012-01-17 2 views
2

クライアントのブラウザに過去のレコードとして表示されているのと同じように、サーバー側の完全なWebページのコピーを保持する必要があります。これらのレコードは再訪されます。完全なWebページのコピーをクライアントブラウザでレンダリングするとすぐにサーバ側に保存する方法は?

レンダリングされたWebページのhtmlを保存しようとしています。 htmlは、javascript、css、imageなどのリソースをサーバ側で使用してレンダリングされます。これらのリソースは常に変化し続けています。したがって古いレコードはもはや完全にレンダリングされません。

上記の解決方法はありますか?また、ITextやApache FOP apiを使ってpdfに変換することも考えていますが、変換中にページ上でJavaScriptの効果は考慮されていません。これを実現するためにJavaで利用できるAPIはありますか?

今まで、完全に機能するアプローチはありません。提案してください。

編集: 要するに、サーバー側でレンダリングされたWebページの正確なコピーを作成して、そのページにユーザーのアクティビティを格納する必要があります。

+0

ページ内の情報、またはページの正確な外観をキャプチャしようとしていますか? – Dave

答えて

0

答えは、HTMLを書き込むために使用されているサーバーテクノロジによって異なります。 HTML /データをブラウザにプッシュするには、Java/JSPやサーブレット、またはある種のHTTPResponseオブジェクトを使用していますか?

CSS/JS/HTMLだけが変更されている場合は、クライアント側のコードベースのスナップショットをWebサイトのバージョンとして保存してください。

(XML/JSONのような)他のデータが含まれている場合は、そのスナップショットを撮ってください。次に、現時点でのデータのスナップショットと一緒に述べたクライアントコードベースのスナップショットは、その時点でのウェブサイトの正確なレンダリングを提供するはずです。

1

wkhtmltopdfこれはあなたにとって非常にうまくいくはずです。それはURLを取って、pdfを返すでしょう。

code.google.com/p/wkhtmltopdf

例:

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

私はこれをサポートするいくつかの有用なURLを見つけました: http://stackoverflow.com/questions/5688585/how-to-use-wkhtmltopdf-in-java-web-application http://stackoverflow.com/questions/5506275/launching-wkhtmltopdf-from-runtime-getruntime-exec-never-terminates 私は試してみましょう。ご協力いただきありがとうございます。 –

0

非常にリソースを消費する必要性はなく...

あなたが使用しているアプリケーションサーバー書かれており、どのような枠組みされていません。独自のコードでレスポンスを生成する場合は、生成中にレスポンスを保存するだけで済みます。

サーブレットのOutputStreamをラップし、書き込まれたすべてをログに記録するフィルタを作成することもできます。フィルタが階層の最上位にあることを確認するだけで済みます。

非常に強力で管理が簡単な汎用ソリューションですが、リソースを最も消費する可能性がありますが、ユーザーとアプリケーションサーバー間の通信を維持し、各呼び出しをアプリケーションサーバーにリダイレクトして正確な応答を返し、各要求と応答。

1

javascriptの洗練度にもよりますが、クライアントが見たものをいかに忠実にキャプチャしたいかによっては、不可能な作業を実行している可能性があります。

ハイレベルでは、次のオプションがあります。

  1. クライアントが
  2. あなたを構築し、レンダリングしている正確に何でも戻って取得するには、Getあなたがクライアント
  3. に送るすべてのコピーを保管してくださいブラウザのビューを再現する必要がある場合には、実際に構成リソースのすべての履歴バージョンをフェッチすることができます。

JSPフィルタなどを使用して#1を実行できますが、クライアントでのレンダリング中に動的HTMLコンテンツを取得するjavascriptのような問題には対処できません。

クライアントは、見ているもの(#2)を返すようにするのは手間がかかり、帯域幅が集中します。

だから私は#3を選ぶだろう。ダイナミックコンテンツをレンダリングするウェブサイトをバージョン管理するには、いくつかのことを行う必要があります。まず、すべてのデータソースをバージョン管理する必要があります。したがって、どのようなクエリでもバージョンを指定する必要があります。 「バージョン」は、タイムスタンプまたはあなたが維持している世代カウンタです。この方法をとっている場合は、クライアントに供給するjavascriptが外部リソースを直接取得しないようにする必要があります。むしろ、あなたのシステムからのすべてのリソースを要求する必要があります。システムは、外部コンテンツを取得します(またはキャッシュから再利用します)。

+0

あなたのアプローチに感謝します。また、フィルタを使用してHTMLコンテンツを取得しています。私はこのアプローチが嫌いです。より良いアイデアを楽しみにしています。 –

0

htmlページを保存している場合、js、css、およびイメージへの参照もどうしていいですか?

私はあなたの実装が何であるか分かりませんが、すべてのhtmlページとリソースを持つファイルシステムを作成し、db内の場所への参照を作成する必要があります。ファイルシステムを変更するたびに、ファイルシステムのリソースをバックアップする必要があります。

私はイメージアーカイブにこの実装を使用します。クライアントが私たちに画像のURLを渡したとき、私たちは戻ってきたいと思っていた画像をチェックしています(いつでも変更できるURLなので)。私は、URLを受け取るとすぐにイメージをダウンロードし、ファイルシステムに格納し、dbのファイルへのパスを他のさまざまな詳細とともに保存するスクリプトを用意しています。これはあなたが必要とするものに似ていますが、js、css、imagesのパスのためのテーブルのほうがほんの数行あります。

関連する問題