誰も答えないようなので、自分の質問に段階的に答え始めます。
フィルターは私の問題に対する正しいアプローチです。これらは tomcat や jetty 固有のものではなく、Java Servlet 仕様バージョン 2.3 によって標準化されています。したがって、Tomcat、Jetty、または Java サーブレット仕様を実装するその他の Web サーバーの両方でフィルターを実行する必要があります。
フィルタのユース ケースの例として、この oracle/java の記事に「ユーザー ID に基づく認証ブロック リクエスト」がリストされています。
これはまさに私がやりたいことです。質問が十分に回答されていることがわかるまで、フィルターを使用してこの回答を更新していきます。
ステップ 1、フィルター開発の準備
独自のフィルターの作成を開始する前に、JavaEE 開発用に IDE をセットアップするか、ビルド ツールに必要なビルド ファイルを作成する必要があります。これについては、すでに多くのチュートリアルが説明されています。例:
Eclipse + Tomcat
Maven + Jetty
ステップ 2、最も単純な Hello World フィルターを作成する
package hello.world.filter;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class HelloWorldFilter implements Filter {
public void init(FilterConfig fConfig) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
PrintWriter out = response.getWriter();
out.print("hello World");
}
public void destroy() {
}
}
ステップ 3、実行中の solr サーバーにフィルターをデプロイする
このステップは、思ったほど簡単ではありません。認証フィルターを war ファイルにパッケージ化して、任意のサーブレット サーバーで実行している任意のアプリケーションに使用できると考えました。残念ながら、そのようには機能しないようです。すべての webapp は独自のコンテキストでサーバーにデプロイされ、他の webapps のコンテキストにアクセスできません (少なくとも私が知る限り、jetty では)。たとえば、Solr 自体は webapp であり、 context がありますhttp://localhost:8983/solr/
。コンテキストで webapp をデプロイした場合でも、http://localhost:8983/*
これhttp://localhost:8983/solr/*
が solr にまったく影響を与えず、誰もが solr サーバーにアクセスできるようになります。
解決策は、フィルターを solr webapp に統合することです。そのためには、最初に HelloWorldFilter.class を jar ファイルにパッケージ化する必要があります。次に、solr サーバーがあるディレクトリに移動し、solr.war ファイルを解凍します。(標準インストールでは、これは通常solr-4.1.0/example/webappsになります)。ここで、solr webapp のコンテキスト ファイルを変更する必要があります。これは、solr.war にパッケージ化されなくなり、代わりにディレクトリで構成されているためです。solr-4.1.0/example/contextsに移動し、 solr.xmlを開きます。<Set name="war"><SystemProperty name="jetty.home"/>/webapps/solr.war</Set>
行を に変更し<Set name="war"><SystemProperty name="jetty.home"/>/webapps/solr</Set>
ます。これで、フィルターを実際にデプロイできます。jar ファイルをフォルダーsolr-4.1.0/example/webapps/solr/WEB-INF/libにコピーします。. 最後のステップとして、solr の起動中にフィルターをデプロイする必要があることを solr に知らせる必要があります。これを行うには、 solr-4.1.0/example/webapps/solr/WEB-INF/web.xmlを開き、次の行を追加します。
<filter>
<filter-name>HelloWorldFilter</filter-name>
<filter-class>hello.world.filter.HelloWorldFilter</filter-class>
</filter>
行の前に
<filter>
<filter-name>SolrRequestFilter</filter-name>
...
また、広告:
<filter-mapping>
<filter-name>HelloWorldFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
ファイル内の他のフィルター マッピングの前。
すべてを安全にして、solr サーバーを再起動します。solr Web インターフェイスの代わりに、 の後に任意のコンテキストで「hello world」が表示されるはずhttp://localhost:8983/solr/
です。
これで交換を開始できます
PrintWriter out = response.getWriter();
out.print("hello World");
doFilterメソッド内で独自のカスタム認証を使用します。