0

私は最初の 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 に直接ヒットしたかのようになりますか?

4

1 に答える 1

1

デフォルトでは、フィルタは転送に適用されません。転送の申請も明示的に指定する必要があります

そのため、受信アプリ (ここでは app2) の WEB-INF/web.xml で、転送要求に適用する必要があるすべてのフィルターに対して、次を追加します。

<filter-mapping>
...
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
...
<filter-mapping>

その後、 /app2 で必要なすべてのフィルターも実行を開始しました

于 2015-12-09T13:33:06.713 に答える