15

生のリクエストを取得し、それらを処理するか、別のバックエンド サーバーに転送するかを決定するサーブレットを実装しようとしています。これは、受信したリクエストが宛先の 1 つ (私の場合は 2 つ) に転送されるロードバランサーに似ています。宛先の 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に配信され、すべてがelse (例: /、/bar/...、/myservlet/...) を「myservlet」に変更します。以前の投稿 (たとえば、ここここのルート マッピング、またはここの URL 書き換え) を見て、私はそれを理解したと思いましたが、機能しません。

ここに私の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 を使用しています。

4

2 に答える 2

35

これはあなたに役立つはずです。

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

第12章 サーブレットへのリクエストのマッピング

12.2 マッピングの仕様

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

  • パス マッピングには、文字で始まりサフィックス /で終わる文字列が使用されます。 /*

  • *.プレフィックスで始まる文字列は、拡張マッピングとして使用されます。

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

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

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


さらに、 Head First Servlets & JSP: Passing the Sun Certified Web Component Developer Exam (2nd edition) (引用) という本からの短い例を含むこの素晴らしい説明をお読みください。

3種類の<url-pattern>要素

1) 完全一致

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

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

2) ディレクトリマッチ

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

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

3) 延長戦

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

  • アスタリスク ( *) で始まらなければなりません (決してスラッシュを使用しないでください)。
  • アスタリスクの後には、ドット拡張子 (.do、.jsp など) が必要です。


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


アップデート

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

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

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

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

上記リンクより引用:

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

于 2013-01-08T22:59:59.390 に答える
1

あなたが何を望んでいるのか理解できたかどうかはわかりませんが、おそらく404をインターセプトして、必要な場所にリダイレクトします。

Tomcat 7 に奇妙な問題があるため、フォーラムに来ました。

これは、root、EMPTY を取得する方法の 1 つにすぎません

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

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

<servlet-mapping>
    <servlet-name>Default</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
于 2013-07-10T08:03:47.077 に答える