当我在 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
在 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