10

ユーザーが添付ファイルをアップロードできるようにする Web アプリケーションに取り組んでいます。これらの添付ファイルは、Web アプリケーションとは別のドライブに保存されます。ユーザーがこれらの添付ファイルをダウンロードできるように、このドライブにエイリアス (Apache HTTP サーバーのエイリアスと同等) を作成するにはどうすればよいですか?

現在、コンテキスト ファイルを作成して CATALINA_HOME/conf/Catalina/localhost にダンプしていますが、頻繁にランダムに削除されます。コンテキスト ファイルの名前は attachments.xml で、内容は次のとおりです。仮想ホストについても読んだことがありますが、正しく理解していれば、仮想ホストは探しているものではありません。Apache Tomcat のバージョン 6.0.18 を使用しています。

添付ファイル.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Context docBase    = "e:\uploads\attachments"
     reloadable = "true"
     crossContext   = "true">
</Context>
4

3 に答える 3

9

私はこれを調査するために多くの時間を費やし、コンテキスト ファイルのランダムな削除を解決する解決策を見つけました。ホスト構成セクションの下にあるApacheのWebサイトで、この抜粋を見つけました。

この Host 要素内に 1 つ以上の Context 要素をネストでき、それぞれがこの仮想ホストに関連付けられた異なる Web アプリケーションを表します。

仮想ホストは、 CATALINA_HOME\confにあるserver.xmlファイルに格納されます。Tomcat はデフォルトのホストとしてlocalhostで構成されています。したがって、最初の投稿のattachments.xmlの内容を追加すると、次のようになります。

<Host name="localhost"  appBase="webapps"
    unpackWARs="true" autoDeploy="true"
    xmlValidation="false" xmlNamespaceAware="false">

    <Context path="/attachments"
             docBase="e:\uploads\attachments"
             reloadable="true"
             crossContext="true" />
</Host>

これは、Apache の HTTP サーバーに似たエイリアスの定義に最も近いものだと思います。

于 2008-12-09T13:36:04.940 に答える
7

複数のオプションがあります。

  1. フロントエンドとしてApacheを使用し、mod_jkまたはmod_proxyによってtomcatに委任します
  2. 独自のアプリケーションにダウンロードサーブレットを提供し、要求されたファイルを提供します
  3. tomcatがWebアプリケーションを配信するディレクトリを作成します

それぞれにいくつかの欠点といくつかの利点があります。私は複数の理由で最初の解決策を強く好みます:

  • 私の主な理由は、明らかにあなたが話していないユニクソイドシステムに当てはまります:ルートのみが1024未満のポート、たとえば80をバインドできます。そのため、tomcatはルートとして実行する必要があります(ユーザーがローにバインドできるようにするメカニズムがあることを知っていますポートが、私はそれらを使用するようになったことがありません)。Apacheは通常rootとして起動されますが、ポート80がバインドされるとすぐにこれらの特権を削除します。
  • Apacheは、Tomcatよりも静的リソースの提供にはるかに優れていると言われています(私はそれを測定したことはありませんが、反対を信じることは難しいと思います)
  • あなたは明らかにapacheでエイリアスを作成する方法を知っています-そうするのは簡単でしょう。

ダウンロードサーブレットについて:

このようにして、静的リソースを提供するサーブレットを作成し、URL「/ download / *」にバインドすることができます(たとえば、ファイルのアップロードも処理するアプリケーションで)。

  • ファイルが1回だけ保存されるディレクトリを構成する必要があります
  • 必要に応じて、権限チェックを簡単に実装できます(ダウンロードにはログインが必要です)。
  • 完全に自己完結型のアプリケーションを1つだけデプロイする必要があります。
  • ダウンロードサーブレットは簡単です。ファイルを見つけ、その名前とファイルタイプを出力ストリームに設定し、バイトごとにストリーミングしてから、出力ストリームを閉じます(「/download/../../」のような攻撃的なファイル名を処理するようにしてください)。 ../../etc/passwd"または"/download/C:/WINDOWS/someimportantfile.xxx")、たとえば、ベースディレクトリを個別のパラメータとして取得するjava.io.Fileコンストラクタを使用します。

3番目のオプションにはいくつかの重大な欠点があり、特別な注意を払わないと攻撃を受ける可能性があります。

  • Tomcatはディレクトリを提供しませんが、webappsを提供します。そのため、「E:/ upload / attachments」には、少なくとも「web.xml」を含む「WEB-INF」という名前のディレクトリが必要です。アップロードするWebアプリケーションからこのディレクトリとファイルへの書き込みアクセスを提供しないように注意してください。このプロビジョニングを使用すると、tomcatにディレクトリを提供させることができます。
  • ただし、含まれているweb.xmlを「*。jsp」をjspとして提供しないように構成します。そうしないと、tomcatはjspファイルを配信するだけでなく、それらを実行します。誰かが「index.jsp」をアップロードしている、<% System.exit(0); %>またはそれ以上の悪意のあるコンテンツを想像してみてください。

もう1つの考え:余分なものは必要ありませんcrosscontext="true"。これは、ファイルを提供するためだけにデプロイするWebアプリケーションが、他のWebアプリケーションにアクセスできることを意味します。たとえば、それらを管理したり、それらのプライベートデータにアクセスしたりできます。通常、それはまったく必要ありません。質問の場合は、絶対に必要ありません。

于 2008-12-14T10:35:15.727 に答える
2

context.xmlファイルを編集してこれを行う方法については、新しい質問の最初の部分を参照してください。Java でサーブレットコンテキストにエイリアスを追加するにはどうすればよいですか。。現在、何人かの人々によると、静的コンテンツを提供するために、Tomcatよりもパフォーマンス上の理由からApacheを使用する必要はなくなりました(2012:Tomcat 6または7)。

于 2012-10-03T19:26:18.583 に答える