私は最初の Web アプリを試していました。Tomcat 7 を使用しています。
いくつかの投稿データと認証ヘッダーを含む host:port/app1/x/y から、同じ投稿データとヘッダーを含む host:port/app2/x/y に転送したいと考えています。両方のアプリケーションが同じホスト上にあります。
/app2 には基本認証があります。クライアント側では、コードは次のようになります
method.addRequestHeader("Authorization",
"Basic " + new String(Base64.encodeBase64(userNPasswd.getBytes())));
次のようにして、/app1 から /app2 に転送できます。
1) フィルターを実装し、/app1 の doFilter でこれを行う
ServletContext othercontext = filterConfig.getServletContext().getContext("/app2");
RequestDispatcher dispatcher = othercontext.getRequestDispatcher(req.getRequestURI().replace("/app1", ""));
dispatcher.forward(request, response);
2) app1.. の WEB-INF/web.xml で、すべての (/*) URL マッピングを転送します
<filter>
<filter-name>ForwardFilter</filter-name>
<filter-class><my.package.filter.ForwardFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ForwardFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3) conf/server.xml の tomcat で..同じホストの下で /app1 と /app2 の両方のコンテキストを定義し、unpack war などをオフにし、crossContext = true を設定します。
<Context path="/app1" docBase="app1" crossContext="true" />
<Context path="/app2" docBase="app2" crossContext="false" />
app1.war は非常にシンプルで、1 つのフィルター クラスと、転送要求にマップされる web.xml のみで構成されています。
app2.war は、Spring 対応の Web アプリです
間違ったパスワードで /app2 に直接リクエストすると、エラーが発生します
現在転送している方法(/app1から/app2へ)を転送すると、/app2配下の認証とリクエスト開始処理をスキップしています。/app2.. のどこかで、セキュリティ コンテキストからユーザー名を読み取ろうとすると、npe で失敗します (Spring が起動してこれを設定することが期待されていました)。
SecurityContextHolder.getContext().getAuthentication().getName();
/app2 の下のコードを変更できません
/app1 を非常に単純なリクエスト フォワードにしたいと考えて
います。Tomcat の前でリダイレクトを使用したり、Apache ルールの書き換えを使用したりすることはできません
さらに情報を共有する必要がある場合はお知らせください
転送はすべての認証ヘッダーも転送するので、リクエストが /app2 に直接ヒットしたかのようになりますか?