`
leeleeleelee
  • 浏览: 21230 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

filter和拦截器的区别和执行顺序

阅读更多

1.Filter过滤器只过滤jsp文件不过滤action请求解决方案

解决办法:在web.xml中将filter的配置放在struts2配置的前面。


2.拦截器与Filter的区别 
Spring的拦截器与Servlet的Filter有相似之处,比如二者都是AOP编程思想的体现,都能实现权限检查、日志记录等。不同的是:

使用范围不同:Filter是Servlet规范规定的,只能用于Web程序中。而拦截器既可以用于Web程序,也可以用于Application、Swing程序中。

规范不同:Filter是在Servlet规范中定义的,是Servlet容器支持的。而拦截器是在Spring容器内的,是Spring框架支持的。

使用的资源不同:同其他的代码块一样,拦截器也是一个Spring的组件,归Spring管理,配置在Spring文件中,因此能使用Spring里的任何资源、对象,例如Service对象、数据源、事务管理等,通过IoC注入到拦截器即可;而Filter则不能。

深度不同:Filter在只在Servlet前后起作用。而拦截器能够深入到方法前后、异常抛出前后等,因此拦截器的使用具有更大的弹性。所以在Spring构架的程序中,要优先使用拦截器。

本文出自 http://90songjian.blog.51cto.com/2264714/649596

 

实际上Filter和Servlet极其相似,区别只是Filter不能直接对用户生成响应。实际上Filter里doFilter()方法里的代码就是从多个Servlet的service()方法里抽取的通用代码,通过使用Filter可以实现更好的复用。 

filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响 应,它只是修改对某一资源的请求,或者修改从某一的响应。  

JSR中说明的是,按照多个匹配的Filter,是按照其在web.xml中配置的顺序 来执行的。 

所以这也就是,把自己的Filter或者其他的Filter(比如UrlRewrite的Filter)放在Struts的 DispatcherFilter的前面的原因。因为,它们需要在请求被Struts2框架处理之前,做一些前置的工作。 

当Filter被调用,并且进入了Struts2的DispatcherFilter中 后,Struts2会按照在Action中配置的Interceptor Stack中的Interceptor的顺序,来调用Interceptor。
 
http://www.cnblogs.com/Fskjb/archive/2010/03/27/1698448.html 



3.servlet、filter、interceptor的执行顺序



    Filter代码:

@Override
	public void doFilter(ServletRequest servletrequest,
			ServletResponse servletresponse, FilterChain filterchain)
			throws IOException, ServletException {
		System.out.println("in  filter 1.");
		filterchain.doFilter(servletrequest, servletresponse);
		System.out.println("outing filter 1");
	}

 

 

   interceptor代码:
    @Override

	public String intercept(ActionInvocation actioninvocation) throws Exception {
		System.out.println("in logininterceptor");
		String result=actioninvocation.invoke();
		System.out.println("outing logininterceptor");
		return result;
	}

 
    action代码:

 @Override  
    public String execute() throws Exception {  
        System.out.println("in loginaciton");
        ActionContext context=ActionContext.getContext();
        Map<String, Object> session=context.getSession(); 
        session.put("userName", userName);  
        
       /* HttpServletRequest request = ServletActionContext. getRequest();
        HttpSession session = request.getSession();
        session.putValue("userName", userName);*/
        System.out.println("outing loginaciton");
        return SUCCESS;  
    } 

 
     

   jsp代码:

 <script type="text/javascript">	  
 function submitForm(){
	      document.getElementById("form1").submit(); 
	   }
	</script>

  </head>
  
  <body>
    This is Login page. <br>
    <form action="<%=path %>/login2.action" method="post" id="form1" name="form1">
       UserName:<input type="text" id="userName" name="userName"/><input type="button" value="submit" onclick="submitForm()" id="submit1" />
    </form>
  </body>
 


   struts.xml

    <struts>
<package name="default" extends="struts-default" namespace="/">  
    	 
    	 <interceptors>
			<interceptor name="MyInterceptor" class="Login.LoginInterceptor"></interceptor>
				<interceptor-stack name="myInterceptorStack">
					<interceptor-ref name="MyInterceptor"/>
					<interceptor-ref name="defaultStack"/>
				</interceptor-stack>
		</interceptors>
    	 
			<action name="login2" class="Login.LoginAction">  
	            <result name="success">  
	               /Login/success.jsp  
	            </result>
	            <interceptor-ref name="myInterceptorStack"></interceptor-ref>
	        </action>  
 
    	</package>
    </struts>

 
    
console:
in  filter 1.
in logininterceptor
in loginaciton
outing loginaciton
outing logininterceptor
outing filter 1

 

3.servlet、filter的执行顺序

servlet代码:

 public void init() throws ServletException { 
	    System.out.println("servlet初始化");
	  } 
  
public void doPost(HttpServletRequest request, HttpServletResponse response) 	     
 throws ServletException, IOException { 
		  System.out.println("in servlet");
	    response.setContentType("text/html"); 
	    PrintWriter out = response.getWriter(); 
	    out 
	        .println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); 
	    out.println("<HTML>"); 
	    out.println("    <HEAD><TITLE>A Servlet</TITLE></HEAD>"); 
	    out.println("    <BODY>"); 
	    out.print("        This is "); 
	    out.print(this.getClass()); 
	    out.println(", using the POST method");      
	     
	    out.println("<br>"); 
	    String x = request.getParameter("x"); 
	    String y = request.getParameter("y"); 
	    out.println("x="+x); 
	    out.println("<br>"); 
	    out.println("y="+y); 
	    out.println("<br>"); 
	     
	    out.println("    </BODY>"); 
	    out.println("</HTML>"); 
	    out.flush(); 
	    out.close(); 
	    System.out.println("outing servlet");
	  } 

 

public void destroy(){		
System.out.println("servlet销毁");
		super.destroy();
	}

 console:

servlet初始化

in  filter 1.

in servlet

before HttpServletRequest

after HttpServletRequest

outing servlet

outing filter 1

当tomcat容器停止的时候,输出:servlet销毁

分享到:
评论

相关推荐

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

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

    拦截器和过滤器的区别

    - **拦截器**:在Action请求的处理过程中可以被多次调用,这使得开发者可以根据实际需求灵活地控制拦截逻辑的执行顺序。 - **过滤器**:在容器初始化时只会被调用一次,后续的每次请求都会触发`doFilter()`方法的...

    SpringMVC的拦截器(Interceptor)和过滤器(Filter)的区别与联系

    过滤器的执行顺序由`&lt;filter-mapping&gt;`标签中的`filter-name`和`url-pattern`决定,过滤器链中所有过滤器的`doFilter`方法都会被调用。过滤器不关心Spring MVC的Controller,它们直接作用于Servlet容器。 **区别与...

    SpringBoot中使用过滤器(Filter)和拦截器(Interceptor)案例

    2、通过执行案例了解多个过滤器和拦截器的执行顺序 【本案例包含源码以及可执行的jar文件,源码文件建议使用IDEA进行导入查看学习,建议使用CURL命令进行URI请求。 在通过Google Chrome进行URI请求时Filter的...

    struts2 拦截器

    2. **配置拦截器**:在`struts.xml`配置文件中定义拦截器,指定其执行顺序和关联的Action。 3. **注册拦截器**:将自定义拦截器加入到`struts-default`或`struts-plugin`拦截器栈中,或者创建新的拦截器栈并应用到...

    SpringBoot拦截器Filter的使用方法详解

    在开发过程中,还应该注意拦截器和过滤器的执行顺序。在SpringBoot中,所有注册的拦截器会按照注册顺序执行,过滤器也是如此。但具体到拦截器和过滤器之间,谁先谁后则需要开发者在实际开发中根据具体需求进行设计和...

    过滤器/拦截器

    在Web开发领域,过滤器(Filter)和拦截器(Interceptor)是两种常见的机制,它们用于在请求被实际处理之前或之后执行特定的操作。这两种技术在Java Web应用中尤为常见,尤其是使用Servlet API或者Spring框架的时候...

    springmvc 拦截器

    虽然拦截器与Servlet Filter在功能上有相似之处,但它们的执行时机和作用范围不同。Filter更底层,作用于所有请求,而拦截器只作用于Spring MVC的请求处理路径。 10. **最佳实践** - 尽可能地将通用逻辑抽取到...

    struts2拦截器原理

    这些拦截器按照配置的顺序逐个执行,每个拦截器执行完毕后,会将控制权传递给下一个拦截器,直到最后一个拦截器执行完后再调用Action的`execute`方法。当`execute`方法执行完毕,控制权会反向传递回之前的拦截器,...

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

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

    使用struts2拦截器对登陆权限验证

    拦截器是基于AOP(面向切面编程)的概念设计的,它们形成一个链,每个拦截器按照定义的顺序依次执行。当请求到达Action时,Struts2会调用这个链上的所有拦截器,然后才执行实际的动作方法。通过在拦截器中实现权限...

    拦截器、过滤器、参数读取坑记录

    在Java Web开发中,拦截器(Interceptor)和过滤器(Filter)是两种常见的处理请求和响应的机制。它们都在请求到达目标Servlet之前进行介入,但各自有着不同的应用场景和功能特点。参数读取则是从客户端传递到服务器...

    Springmvc登录拦截器Demo

    Spring MVC支持多个拦截器组成一个拦截器链,每个拦截器的`preHandle()`方法都会按顺序执行,只有当所有拦截器都返回true时,请求才会继续被处理。如果有一个返回false,请求处理将被中断。 7. **最佳实践** - ...

    SpringMvc 拦截器

    现在,当请求匹配到MyInterceptor配置的URL时,拦截器的`preHandle`、`postHandle`和`afterCompletion`方法就会按顺序执行。 在实际应用中,拦截器可以结合Spring Security进行权限控制,例如检查用户是否已登录,...

    基于java的企业级应用开发:拦截器.ppt

    如果有多个拦截器,它们的执行顺序与配置文件中定义的顺序有关。首先,按照配置顺序依次执行`preHandle`,如果所有`preHandle`都返回`true`,则按配置顺序反向执行`postHandle`,最后按配置顺序正向执行`...

    struts03:拦截器、过滤器与拦截器的区别、文件上传

    本文将深入探讨Struts框架中的拦截器(Interceptor)以及它与过滤器(Filter)的区别,并结合文件上传功能进行讲解。 1. 拦截器与过滤器的概念 - **拦截器**:在Struts2框架中,拦截器是基于AOP(面向切面编程)的...

    java拦截器

    拦截器按照预定义的顺序执行,形成一个拦截器链。当一个请求到来时,Struts2框架会调用这个链上的每个拦截器,直到到达Action。每个拦截器都可以决定是否允许请求继续传递到下一个拦截器或Action。如果拦截器返回`...

    过滤器与拦截器的区别

    执行顺序通常是:先执行过滤器,然后是拦截器,接着是Action处理,之后是拦截器的后置处理,最后是过滤器的后置处理。过滤器通常用于处理通用问题,如安全控制,而拦截器更适合用于更具体的业务逻辑处理。 面向切面...

    浅谈SpringMVC的拦截器(Interceptor)和Servlet 的过滤器(Filter)的区别与联系 及SpringMVC 的配置文件

    在本文中,我们将深入探讨SpringMVC的拦截器(Interceptor)和Servlet的过滤器(Filter)之间的差异和联系,以及如何配置SpringMVC的拦截器。理解这两者的区别对于开发高效且安全的Web应用程序至关重要。 首先,让我们...

    Struts2拦截器详解源码

    与Servlet规范中的Filter相比,虽然两者都用于处理请求,但拦截器在Struts2中具有独立的生命周期和更灵活的调用顺序管理。 4.1.1 拦截器的调用时机与流程 拦截器的调用主要由`...

Global site tag (gtag.js) - Google Analytics