0

要求しているクライアントのロケールに基づいて、Jetty のサーバー側の URL をリダイレクトしたいと考えています。

すなわち

  1. クライアントがhost:port/help/index.html を要求します(「help」は webapp war です)
  2. サーバー側 ' GB ' などのクライアントのロケールを読み取り、*host:port/help_GB/index.html* などの別の Web アプリケーションにリダイレクトします。

これは、Jetty サーバーを実行するサーバー側のコードと同じくらい簡単だと思いました:-

    String i18nID = Locale.getDefault().getCountry();

    RewriteHandler rewrite = new RewriteHandler();
    rewrite.setRewriteRequestURI(true);
    rewrite.setRewritePathInfo(false);
    rewrite.setOriginalPathAttribute("requestedPath");

    RedirectRegexRule r = new RedirectRegexRule();
    r.setRegex("/help/(.*)");
    r.setReplacement("/help_" + i18nID + "/$1");
    rewrite.addRule(r);

    server.setHandler(rewrite);

しかし、これは機能しません。すべての「host:port/*」アドレスに対して 404 が返されます。とにかく、ロケールサーバー側を取得していることに気付き、クライアント側が必要なので、独自のハンドラーを作成しました:-

  private class MyHandler extends RewriteHandler
  {
    @Override 
    public void handle(String target, 
                       Request baseRequest, 
                       HttpServletRequest request, 
                       HttpServletResponse response)
    {
      try
      {
        String country = baseRequest.getLocale().getCountry();
        String newTarget = target.replace("/help/", "/help_" + country + "/");

        if (target.contains("/help/") /*TODO And not GB locale */)
        {
          response.sendRedirect(newTarget);
        }
        else
        {
          super.handle(target, baseRequest, request, response);
        }

      }
      catch(Exception e)
      {
        /*DEBUG*/System.out.println(e.getClass() + ": " + e.getMessage());
        e.printStackTrace();
      }
    }
  }

...そして、RewriteHandler の代わりにそれを使用しました。これは、「/help/」リクエストを受け入れ、リダイレクトせず、一部のページ要素を含まず、ヘルプを含まない他のすべての URI で 404 を返します。

私は何か間違ったことをしているのですか、それとも使用されるべきではない方法で書き換え/リダイレクトハンドラーを使用していますか?!

4

1 に答える 1

0

別の webapp へのリダイレクトは、おそらく次のようなフィルターで行う必要があります

于 2013-10-18T07:54:07.080 に答える