当我在 tomcat 的 web.xml 中的过滤器之前配置 servlet 时会发生什么? [英] what happens when I configure a servlet before a filter in tomcat's web.xml?

查看:47
本文介绍了当我在 tomcat 的 web.xml 中的过滤器之前配置 servlet 时会发生什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在某个 url 的 tomcat 中,我想跳过所有过滤器并执行一个 servlet,我认为将 servlet 放在过滤器之前会按照我的预期,但仍然在 servlet 映射后面的过滤器正在执行.我做错了什么吗?

In tomcat for a certain url, I want to skip all the filters and execute a servlet and I thought placing the servlet before the filter will to as I expected but still the filters behind the servlet mappings are executing. Am I doing anything wrong?

例如,这是我的 web.xml

For instance, this is my 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/"时,过滤器仍然会被执行.

So when the incoming url contains "/abc/" I want my servlet to execute and skip the filters. I placed my servlet before all the filters but still the filters are getting executed when the incoming url contains '/abc/'.

推荐答案

过滤器之前没有servlet的概念.

There is no concept of servlet before filter.

如果 servlet 的 url 映射符合过滤器 url 映射,则过滤器在 servlet 之前执行.
我得到了您的要求,您只是不想点击某些网址的过滤器.
一种.如果您的应用程序仍处于启动阶段,您可以如下进行配置

If servlets url mapping qualify filters url mapping then filter is executed before servlet.
I got your requirement you just don't want to hit Filters for certain urls.
a. If your application is still in starting phase, you can configure as given below

<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

And the servlet url for which you want to bypass filter

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

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

2. If your application is already developed, and you configured a filter already with mapping /* then you can not skip that filter being executed. But you can add one more filter before that filter. Here filter order plays an important role,(reference for filter order) you can perform same functionality which you expected from a servlet. In your filter you just have to break filter chain and send response as given below

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

有关破坏过滤器链的更多信息,请参阅此问题

这篇关于当我在 tomcat 的 web.xml 中的过滤器之前配置 servlet 时会发生什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆