好吧,似乎没有人回答,所以我将开始逐步回答我自己的问题。
过滤器是解决我的问题的正确方法。它们不是特定于 tomcat 或 jetty 的东西,而是由 Java Servlet 规范 2.3 版标准化。因此,tomcat 或 jetty 或任何其他实现 Java Servlet 规范的网络服务器都应该运行过滤器。
作为过滤器用例的示例,这篇 oracle/java 文章列出了:“基于用户身份的身份验证阻止请求”。
这正是我想要做的。我将尝试使用过滤器并根据我的进度更新此答案,直到我发现问题已得到充分回答。
第 1 步,过滤器开发的准备工作
在开始编写自己的过滤器之前,您必须为 JavaEE 开发设置 IDE 或为构建工具编写所需的构建文件。有很多教程已经解释了这一点。例如:
Eclipse + Tomcat
Maven + 码头
第二步,编写最简单的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文件中,然后将它用于我在任何servlet服务器上运行的任何应用程序。可悲的是,它似乎不像那样工作。每个 webapp 都在自己的上下文中部署在您的服务器上,无法访问其他 webapps 的上下文(据我所知,至少在码头上)。例如,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 服务器。现在,您应该在http://localhost:8983/solr/
.
现在您可以开始更换
PrintWriter out = response.getWriter();
out.print("hello World");
在doFilter方法中使用您自己的自定义身份验证。