5

Jetty サーバーによって提供されるヘルプ ファイルで満たされた 2 つの静的戦争と、ルート コンテキスト戦争があります。

  • help.war - 英語のヘルプ ファイル
  • help_CS.war - チェコ語のヘルプ ファイル
  • ROOT.戦争

    リクエストのロケールに基づいて、ユーザーを適切な言語に誘導したいと考えています。つまり、ユーザーが/help/index.htmを要求し、チェコ語ロケールから要求しているため、/help_CS/index.htmを取得します。アイデアは、言語パックを必要に応じて大騒ぎせずに追加できるということです。

    Requestからロケールを取得し、 handle()で転送またはリダイレクトするJetty.xml で参照されるカスタムRewriteHandlerを追加してました。この時点で応答コードが送信されているため、両方とも不平を言っています...どういうわけか?!

    ROOT.war の web.xml でカスタムフィルターを試してみましたが、これは、試したURL パターンのバリエーションに関係なく、*/help/** に一致するものではありませんでした。

    次に、 WEB-INF/web.xmlへの最後の試行と同じフィルターへの参照をhelp.war に追加しました。これは一致し、URL を生成できましたが、この時点で URL を書き換えることはできません。/help/によるため、 help_CS に置き換えられた help を含む URL はdomain/help/help_CS/index.htmになります。

    だから私の質問。これはどのように行うべきですか?

4

1 に答える 1

1

そう!これをいじって数日後、少しハッキーに感じるものを見つけましたが、うまくいきます。

カスタムフィルターを使用し、各 war ファイルに対して個別のサーブレット マッピング(ただし、それ以外は同一) を使用して、 help_XX.warごとにWEB_INF/web.xmlに配置します。

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/help_CS</url-pattern>
</servlet-mapping>

次に、フィルター内で、必要な戦争のServletContextを取得し、それを使用して転送し、要求アドレスから/helpを手動で削除します。

  @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
                                throws IOException, ServletException
  {
    HttpServletRequest request = (HttpServletRequest) req;
    String requestAddress = request.getRequestURI();
    String country_code = req.getLocale().getCountry();

    if (requestAddress.contains("/help/")) 
    {
        ServletContext forwardContext = config.getServletContext().getContext("/help_" + country_code);

        forwardContext.getRequestDispatcher(requestAddress.replace("/help", "")).forward(req, res);
    } 
    else 
    {
        chain.doFilter(req, res);
    }
  }
于 2013-10-17T11:14:03.263 に答える