web-dev-qa-db-ja.com

特定のサーブレットをTomcatのデフォルトサーブレットにマッピングする

生のリクエストを取得するサーブレットを実装し、それらを処理するか、別のバックエンドサーバーに転送するかを決定しようとしています。これはロードバランサーに似ており、受信したリクエストは(私の場合は2)宛先の1つに転送されます。宛先の1つがリモートです(別のホスト上)。さらに、リクエストはルート( http://mycompany.com/ )に到達する可能性があります。

生のリクエストを取得したいので、独自のサーブレット(HttpServletをサブクラス化)を実装しました。私のサーブレットは次のようになります。

public class MyProxyServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
        processOrForward(req, resp);
    }
    // also doGet(), doHead(), ...
}

処理したいサービスがルートにリクエストを送信する可能性があるため、サーブレットをデフォルトのサーブレットにマップし、明示的なサーブレットマッピングを持たないリクエストを受信したいと考えています。私のサーブレットの名前が「myservlet」であり、別のサーブレット「foo」と一緒に実行されていると仮定すると、すべてのリクエストが http://mycompany.com/foo/ ... fooに配信され、その他すべて(たとえば、/、/ bar /...、/ myservlet/...)は "myservlet"に配信されます。以前の投稿(たとえば、ルートマッピング here および here 、またはURL書き換え here )を見て、私はそれを理解したと思ったが、それは動作しません。

これが私のweb.xmlです:

<web-app>
  <servlet>
    <servlet-name>ProxyServlet</servlet-name>
    <servlet-class>com.mycompany.MyProxyServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>ProxyServlet</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
</web-app>

上記web.xmlで、url-patternを試してみました

"/" and "/*" and empty (i.e., <url-pattern></url-pattern>), all behave the same -->
    Requests to root (/)goes to Tomcat's default servlet
    Requests to /myservlet/... are handled by "myservlet"
    Requests to /fubar/... are always 404

私のサーブレットをデフォルトにする方法はありますか?つまり、特にサーブレットにマッピングされていないリクエストはすべて私のものになります(このサーブレットを独自のコンテナにデプロイできるため、すべてのリクエストを受け取ることもできます)。問題がある場合は、Ubuntu 12.10でTomcat 7.0.30を使用しています。

14
Virtually Real

これは役に立ちます。

Java™サーブレット仕様バージョン3.1(JSR 340) から

第12章リクエストをサーブレットにマッピングする

12.2マッピングの仕様

Webアプリケーションデプロイメント記述子では、次の構文を使用してマッピングを定義します。

  • /文字で始まり/*サフィックスで終わる文字列は、path mappingに使用されます。

  • *.プレフィックスで始まる文字列は、extension mappingとして使用されます。

  • 空の文字列("")は、アプリケーションのコンテキストルートに正確にマップされる特殊なURLパターンです。つまり、http://Host:port/<contextroot>/の形式のリクエストです。この場合、パス情報は/であり、サーブレットのパスとコンテキストパスは空の文字列("")です。

  • /文字のみを含む文字列は、アプリケーションの"default"サーブレットを示します。この場合、サーブレットパスはリクエストURIからコンテキストパスを引いたものであり、パス情報はnullです。

  • 他のすべての文字列は、完全一致にのみ使用されます。


追加として、この素晴らしい説明と本の短い例をお読みください Head First Servlets&JSP:Passing the Sun Certified Web Component Developer Exam(2nd edition) (quote):

<url-pattern>要素の3つのタイプ

1)完全一致

例:
<url-pattern>/Beer/SelectBeer.do</url-pattern>

  • スラッシュ(/)で始める必要があります。
  • 拡張子(.doなど)を付けることができますが、必須ではありません。

2)ディレクトリ一致

例:
<url-pattern>/Beer/*</url-pattern>

  • スラッシュ(/)で始める必要があります。
  • 常にスラッシュ/アスタリスク(/*)で終わります。

3)拡張子の一致

例:
<url-pattern>*.do</url-pattern>

  • アスタリスク(*)で始める必要があります(スラッシュは使用しないでください)。
  • アスタリスクの後には、ドット拡張子(.do、.jspなど)が必要です。


重要な注意:
URLパターンは論理/仮想構造を表します。つまり、指定されたパターン(パス)は物理的に存在する必要はありません


[〜#〜]更新[〜#〜]

あなたが望むなら、あなたがコメントで言うように、

Host:portにデフォルトのTomcatサーブレットではなく、サーブレットをヒットさせたい

次に、ここの解決策を参照してください:
WebアプリケーションをTomcatのデフォルトアプリケーションにする方法

つまり、必要なのはパスwith application contextであり、これはTomcatのデフォルトアプリケーションのアプリケーションコンテキストを意味します。

上記のリンクからの引用:

標準のTomcatインストールでは、同じディレクトリ(CATALINA_BASE)/ webapps /の下に、[〜#〜] root [〜#〜]というディレクトリがあることに気づくでしょう。 /(Windowsでも大文字は重要です)。これは、現在のTomcatのデフォルトアプリケーションの常駐場所であり、ユーザーがhttp://myhost.company.com[:port]を呼び出すとすぐに呼び出されます。コツは、アプリケーションをその場所に置くことです。

33
informatik01

私はあなたが何をしたいのか理解していませんが、おそらくインターセプト404はあなたがしたいことです、そしてあなたが望む場所にリダイレクトします。

Tomcat 7で奇妙な問題が発生したため、私はフォーラムにここに来ました。

これは私がルートを持つことができる唯一の方法、空です

<servlet-mapping>
    <servlet-name>Default</servlet-name>
    <url-pattern></url-pattern>
</servlet-mapping>

その方法:画像などを含むすべてがこのサーブレットにリダイレクトされます。たとえば、別のページを開くと、この1つ、ルートが表示され、同じページへの4つのリクエストがさらに表示されます。CSSが3つ、画像が1つです。 。

<servlet-mapping>
    <servlet-name>Default</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
1
Dejan