`
esteem
  • 浏览: 156612 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

filter的执行顺序

    博客分类:
  • J2EE
阅读更多

一直没有仔细去研究下filter ,最近系统的测试了下:

先看代码吧

FirstFilter.java
==================
package com.test.filter;

import java.io.IOException;

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 FirstFilter implements Filter {

	@Override
	public void destroy() {

	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		System.out.println("before invoke firstFilter's chain.doFilter() ..");
		chain.doFilter(request, response);
		System.out.println("after invoke firstFilter's chain.doFilter() ..");
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		System.out.println("firstFilter init()...");

	}

}


============

SecondFilter.java
==============

package com.test.filter;

import java.io.IOException;

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 SecondFilter implements Filter {

	@Override
	public void destroy() {

	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		System.out.println("before invoke secondFilter's chain.doFilter() ..");
		chain.doFilter(request, response);
		System.out.println("after invoke secondFilter's chain.doFilter() ..");
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("secondFilter init()...");
	}

}
==========

FirstServlet.java
=============
package com.test.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FirstServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		System.out.println("servlet doGet be invoked...");
		req.getRequestDispatcher("test.jsp").forward(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(req, resp);
	}
	
}

=========

web.xml

===========
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
	<filter>
		<filter-name>firstFilter</filter-name>
		<filter-class>com.test.filter.FirstFilter</filter-class>
	</filter>
	<filter>
		<filter-name>secondFilter</filter-name>
		<filter-class>com.test.filter.SecondFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>secondFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>firstFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<servlet>
		<servlet-name>firstServlet</servlet-name>
		<servlet-class>com.alimama.servlet.FirstServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>firstServlet</servlet-name>
		<url-pattern>/firstServlet</url-pattern>
	</servlet-mapping>
</web-app>

============


 然后发布,发现打印的日志如下:

。。。

firstFilter init()...
secondFilter init()...

。。。

2008-10-23 11:36:43 org.apache.catalina.startup.Catalina start
信息: Server startup in 3665 ms

 

这里过滤器初始化好了。

当我们访问我们的 应用:http://127.0.0.1:8080/appName

发现打印日记如下:

before invoke secondFilter's chain.doFilter() ..
before invoke firstFilter's chain.doFilter() ..
after invoke firstFilter's chain.doFilter() ..
after invoke secondFilter's chain.doFilter() ..

 

当我们将web.xml中filter的位置进行调整后:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
	<filter>
		<filter-name>firstFilter</filter-name>
		<filter-class>com.test.filter.FirstFilter</filter-class>
	</filter>
	<filter>
		<filter-name>secondFilter</filter-name>
		<filter-class>com.test.filter.SecondFilter</filter-class>
	</filter>
             <filter-mapping>
		<filter-name>firstFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<filter-mapping>
		<filter-name>secondFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	
	<servlet>
		<servlet-name>firstServlet</servlet-name>
		<servlet-class>com.alimama.servlet.FirstServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>firstServlet</servlet-name>
		<url-pattern>/firstServlet</url-pattern>
	</servlet-mapping>
</web-app>

  然后在启动应用,会看到打印:

before invoke firstFilter's chain.doFilter() ..

before invoke secondFilter's chain.doFilter() ..
after invoke secondFilter's chain.doFilter() ..

after invoke firstFilter's chain.doFilter() ..

总结:

filter的执行顺序是按照web.xml中定义的顺序进行执行的(当多个filter都匹配的时候),执行顺序如下图表示。(PS图取自http://hi.baidu.com/cathy_200182/blog/item/1f686238df10eb22b8998fe3.html  感谢之)

 

  • 大小: 14 KB
分享到:
评论

相关推荐

    web.xml 中的listener、 filter、servlet 加载顺序及其详解.doc

    Web.xml 中的 listener、filter、servlet 加载顺序及其详解 在 Web 应用程序中,web.xml 文件扮演着非常重要的角色,它定义了 Web 应用的结构和配置。其中,listener、filter、servlet 是三个非常重要的概念,它们...

    web.xml文件中配置(servlet, spring, filter, listenr)的加载顺序

    需要注意的是,虽然`CharacterEncodingFilter`被映射了两次,但实际执行顺序是由`filter-mapping`标签的出现顺序决定的。因此,在请求到达`.do`路径前,会先执行`SecurityFilter`,然后再执行`...

    过滤器文档过滤器使用中的方法过滤器.pdf

    **Filter执行顺序** 过滤器的执行顺序由它们在`web.xml`中的配置顺序决定。如果存在多个过滤器,它们会按照注册的映射顺序依次处理请求。如果一个过滤器决定阻止请求,那么后续的过滤器和目标Servlet都不会收到这个...

    java filter 执行过程例子

    过滤链是Filter的执行顺序,先声明的Filter先执行。 3. **请求处理**: - **Chain.doFilter()**:当客户端发起请求时,Servlet容器首先调用第一个Filter的`doFilter()`方法。在这个方法内部,Filter可以选择处理...

    shiro_demo.zip

    然后,创建一个过滤器链定义,指定Shiro的Filter执行顺序。在SpringBoot的Web配置类中,添加以下代码: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private ...

    过滤器、拦截器、AOP、ControllerAdvcie的使用对比、执行顺序及代码教程的示例代码【0积分免费下载】

    过滤器、拦截器、AOP、ControllerAdvcie的使用对比、执行顺序及代码教程的文章内的示例代码,文章...通过文章和这份代码,你可以学到过滤器、拦截器、AOP、ControllerAdvcie的基本使用方式,并了解到他们的执行顺序。

    web.xmllistener、filter、servlet加载顺序.pdf

    你可以通过调整这些标签的位置来控制过滤器的执行顺序。 3. **Servlet(服务程序)** Servlet是实现了`javax.servlet.Servlet`或其子接口的类,它们负责处理HTTP请求和生成响应。在`web.xml`中,Servlet通过`...

    超级注意复杂整合环境中的Filter-Mapping的顺序--配置单点登陆及UrlRewrite有感

    Filter-Mapping则定义了Filter与Servlet之间的关联关系,决定了Filter的执行顺序。在多个Filter存在的情况下,Filter的执行顺序至关重要,因为它可能直接影响到SSO的实现和URL重写的逻辑。 单点登录(SSO)是一种...

    简单理解Struts2中拦截器与过滤器的区别及执行顺序

    Struts2 中的拦截器(Interceptor)和过滤器(Filter)是两个不同的概念,虽然它们都可以影响请求的处理过程,但它们的作用域、执行顺序和实现机制都有所不同。 拦截器(Interceptor) 拦截器是 Struts2 框架中的...

    Interceptor与Filter的区别

    - Filter的执行顺序更加固定,而Interceptor的执行顺序更加灵活可控。 - Filter主要用于做一些预处理工作,而Interceptor更多地用于处理与业务逻辑相关的请求拦截需求。 总之,在实际开发过程中,应根据具体的需求...

    详解Java Web项目启动执行顺序

    Java Web项目启动执行顺序详解 Java Web项目启动执行顺序是指在 Java Web 项目中,从服务器启动到项目启动的整个过程。该过程涉及到多个配置节点、监听器、过滤器、Servlet 等组件的协作执行。下面将对 Java Web ...

    J2EE之filter的应用

    1. **配置顺序**:在 web.xml 中,Filter 的配置顺序决定了它们的执行顺序。可以通过调整 `&lt;filter-mapping&gt;` 元素的位置来调整 Filter 的优先级。 2. **多个 Filter**:一个请求可以经过多个 Filter,每个 Filter ...

    Filter以及Interceptor的区别

    4. **执行顺序**:多个Filter的执行顺序是由`web.xml`中的配置决定的。 5. **使用场景**:Filter常用于跨域资源共享(CORS)处理、登录验证、编码设置等。 #### 二、Interceptor概述 **Interceptor**(拦截器)是...

    ASP.NET MVC:Filter和Action的执行介绍

    在执行动作方法之前,ActionInvoker会获取过滤器信息,并在必要时按照定义好的顺序调用过滤器方法。 综上所述,*** MVC的Filter和Action是构建Web应用程序的基础组件,它们共同协调,确保应用程序能够高效且灵活地...

    java 中如何使用filter过滤器

    - **Filter链**:多个Filter可以串联,形成一个链,请求会按顺序通过每个Filter。 - **Filter参数**:在`web.xml`中可以通过`init-param`为Filter提供配置参数,以便在Filter中使用。 - **异步Filter**:Java ...

    web.xml中servlet, bean, filter, listenr 加载顺序_动力节点Java学院整理

    本文将详细介绍web.xml中的Servlet、Bean、Filter、Listener加载顺序,并探讨其内部执行顺序。 首先,我们需要了解web.xml文件的基本结构。web.xml文件主要包含了四个部分:Servlet、Bean、Filter、Listener。其中...

    NDIS Filter Drivers指南

    4. **动态配置和插入**:NDIS 使用配置信息来确定 Filter Module 在适配器栈上的排列顺序,并且能够在不完全移除整个驱动程序栈的情况下动态地插入或删除 Filter Module。这种动态性极大地提高了系统的灵活性和适应...

    简单使用Filter模拟Servlet中的过滤器

    Filter的执行顺序是由它们在web.xml中的顺序决定的。如果多个Filter匹配同一个请求,它们将按照在web.xml中声明的顺序依次执行。 Filter的生命周期包括初始化(init)、过滤(doFilter)和销毁(destroy)三个阶段...

Global site tag (gtag.js) - Google Analytics