当前位置: 首页 > 知识库问答 >
问题:

当我在tomcat的过滤器前配置servlet时会发生web.xml?

戚阳曜
2023-03-14

在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/”时,过滤器仍然会被执行

共有1个答案

胡星汉
2023-03-14

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

如果servlets url映射限定过滤器url映射,则过滤器在servlet之前执行
我收到了你的要求,你只是不想点击某些URL的过滤器
a.如果您的应用程序仍处于启动阶段,您可以按照下面的说明进行配置

<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

xml prettyprint-override"><servlet-mapping>
   <servlet-name>Servlet1</servlet-name>
   <url-pattern>/unfiltered/servlet1</url-pattern>
</servlet-mapping>

2.如果您的应用程序已经开发,并且您已经使用映射/*配置了过滤器,那么您不能跳过正在执行的过滤器。但是你可以在这个过滤器之前再添加一个过滤器。在这里,过滤器顺序扮演着重要的角色(过滤器顺序的参考),您可以执行与servlet相同的功能。在你的过滤器中,你只需断开过滤器链并发送如下所示的响应

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

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

 类似资料:
  • 我是Java企业版新手。我开始从一些YouTube视频学习,最近开始阅读http://docs.oracle.com/javaee/6/tutorial/doc/我读完了第15章。 我试着做我自己的过滤器。 我没有使用JavaServlet类。因为我想使用JSF页面,而且据我所知,只有在JSF页面中才能使用托管Beans,而Servlet类可以使用JSP。它是确定的。 据我所知登录过滤器的用处:h

  • (对不起我的英语,我说法语) 在我正在编写的过滤器中,我需要知道用户询问的servlet的名称。它将允许我检查 servlet 是否与我的数据库条目匹配。事实上,我正在编写一个限制过滤器。这是它的工作原理: 用户尝试获取链接到userListe Servlet的URL /users/liste 第一个过滤器(SimpleConnexion)检查用户对象是否在http会话中定义(=用户是否连接?)。

  • 我将在一个已经存在的网站中介绍Spring Web Security。现在出现了一个问题: 我希望我的自定义筛选器在Spring Security筛选器链之前在Tomcat筛选器链中执行。我不想让他们成为这个Spring安全过滤器链的一部分。 我所找到的只是Spring Boot中的一个解决方案(请参见“Spring-How to insert a filter before SpringSecu

  • 如果任何< code>J2EE应用程序直接命中servlet,然后servlet将相同的请求转发给某个< code >。jsp页面。 我有一个带有以下url模式的servlet过滤器 因此,转发的请求是否也会进行过滤。 在我的情况下,它不会到来,这是一个预期的行为。只是想了解这一点。

  • 我使用Atmosphere 1.0.15在Tomcat下处理推送通知,几年来一直运行良好。最近,我在Tomcat中添加了一个简单的过滤器作为测试,它(目前)只记录传入的URL并继续。问题在于,Tomcat似乎根本不会对my Atmosphere处理的任何servlet路径调用过滤器,但对任何其他servlet路径调用过滤器都很好。 以下是我网站的相关部分。xml: 这就是我的氛围。xml: 奇怪的

  • 问题内容: Servlet和Filter有什么区别?您建议使用什么来授权页面? 问题答案: 当你要根据特定条件过滤和/或修改请求时,请使用。使用时要控制,预处理和/或后处理请求。 在Java EE的教程中提到有关筛选如下: 筛选器是可以转换请求或响应的标头和内容(或两者)的对象。过滤器与Web组件的不同之处在于,过滤器本身通常不会创建响应。相反,过滤器提供的功能可以“附加”到任何类型的Web资源。