当我在 tomcat 的 web.xml 中的过滤器之前配置一个 servlet 时会发生什么?

what happens when I configure a servlet before a filter in tomcat's web.xml?

在 tomcat 中,对于某个 url,我想跳过所有过滤器并执行一个 servlet,我认为将 servlet 放在过滤器之前会如我所料,但过滤器仍然落后servlet 映射正在执行。我做错了什么吗?

例如,这是我的 web.xml


  <servlet>
        <servlet-name>APIRedirection</servlet-name>
        <servlet-class>com.test.APIRedirection</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>APIRedirection</servlet-name>
        <url-pattern>/abc/*</url-pattern>
    </servlet-mapping>

<filter>
        <filter-name>filter</filter-name>
        <filter-class>com.test.filter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

因此,当传入的 url 包含“/abc/”时,我希望我的 servlet 执行并跳过过滤器。我将我的 servlet 放在所有过滤器之前,但当传入的 url 包含“/abc/”时,过滤器仍然会被执行。

filter之前没有servlet的概念

如果 servlet url 映射限定过滤器 url 映射则过滤器在 servlet 之前执行。
我收到了您的要求,您只是不想点击某些 url 的过滤器。
一种。如果您的应用程序还处于起步阶段,您可以按如下配置

<servlet-mapping>
   <servlet-name>Servlet1</servlet-name>
   <url-pattern>/filtered/servlet1</url-pattern>
</servlet-mapping>

<servlet-mapping>
   <servlet-name>Servlet1</servlet-name>
   <url-pattern>/filtered/servlet2</url-pattern>
</servlet-mapping>

...
<filter-mapping>
    <filter-name>filter</filter-name>
    <url-pattern>/filtered/*</url-pattern>
</filter-mapping>

以及您要为其绕过过滤器的 servlet url

<servlet-mapping>
   <servlet-name>Servlet1</servlet-name>
   <url-pattern>/unfiltered/servlet1</url-pattern>
</servlet-mapping>

2。如果您的应用程序已经开发,并且您已经使用映射 /* 配置了过滤器,那么您不能跳过正在执行的过滤器。但是您可以在该过滤器之前再添加一个过滤器。此处过滤器顺序起着重要作用,(reference for filter order) 您可以执行您期望从 servlet 获得的相同功能。在您的过滤器中,您只需打破过滤器链并发送响应,如下所示

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,ServletException 
{
    //your business logic
    // construct responseToSend
    response.getOutputStream().write(responseToSend);
    return;
}

For more information of breaking filter chain refer this question