转载自:http://listenup.iteye.com/blog/1559553

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构架的程序中,要优先使用拦截器。

实际上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代码:

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

interceptor代码:

    @Override

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

action代码:

  1. @Override
  2. public String execute() throws Exception {
  3. System.out.println("in loginaciton");
  4. ActionContext context=ActionContext.getContext();
  5. Map<String, Object> session=context.getSession();
  6. session.put("userName", userName);
  7. /* HttpServletRequest request = ServletActionContext. getRequest();
  8. HttpSession session = request.getSession();
  9. session.putValue("userName", userName);*/
  10. System.out.println("outing loginaciton");
  11. return SUCCESS;
  12. }

jsp代码:

  1. <script type="text/javascript">
  1. function submitForm(){
  2. document.getElementById("form1").submit();
  3. }
  4. </script>
  5. </head>
  6. <body>
  7. This is Login page. <br>
  8. <form action="<%=path %>/login2.action" method="post" id="form1" name="form1">
  9. UserName:<input type="text" id="userName" name="userName"/><input type="button" value="submit" onclick="submitForm()" id="submit1" />
  10. </form>
  11. </body>

struts.xml

  1. <struts>
  1. <package name="default" extends="struts-default" namespace="/">
  2. <interceptors>
  3. <interceptor name="MyInterceptor" class="Login.LoginInterceptor"></interceptor>
  4. <interceptor-stack name="myInterceptorStack">
  5. <interceptor-ref name="MyInterceptor"/>
  6. <interceptor-ref name="defaultStack"/>
  7. </interceptor-stack>
  8. </interceptors>
  9. <action name="login2" class="Login.LoginAction">
  10. <result name="success">
  11. /Login/success.jsp
  12. </result>
  13. <interceptor-ref name="myInterceptorStack"></interceptor-ref>
  14. </action>
  15. </package>
  16. </struts>

console:

in  filter 1.

in logininterceptor

in loginaciton

outing loginaciton

outing logininterceptor

outing filter 1

3.servlet、filter的执行顺序

servlet代码:

  1. public void init() throws ServletException {
  2. System.out.println("servlet初始化");
  3. }
  1. public void doPost(HttpServletRequest request, HttpServletResponse response)
  1. throws ServletException, IOException {
  2. System.out.println("in servlet");
  3. response.setContentType("text/html");
  4. PrintWriter out = response.getWriter();
  5. out
  6. .println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
  7. out.println("<HTML>");
  8. out.println("    <HEAD><TITLE>A Servlet</TITLE></HEAD>");
  9. out.println("    <BODY>");
  10. out.print("        This is ");
  11. out.print(this.getClass());
  12. out.println(", using the POST method");
  13. out.println("<br>");
  14. String x = request.getParameter("x");
  15. String y = request.getParameter("y");
  16. out.println("x="+x);
  17. out.println("<br>");
  18. out.println("y="+y);
  19. out.println("<br>");
  20. out.println("    </BODY>");
  21. out.println("</HTML>");
  22. out.flush();
  23. out.close();
  24. System.out.println("outing servlet");
  25. }
  1. public void destroy(){
  1. System.out.println("servlet销毁");
  2. super.destroy();
  3. }

console:

servlet初始化

in  filter 1.

in servlet

before HttpServletRequest

after HttpServletRequest

outing servlet

outing filter 1

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

Spring filter和拦截器(Interceptor)的区别和执行顺序的更多相关文章

  1. Spring中过滤器(Filter)和拦截器(Interceptor)的区别和联系

    在我们日常的开发中,我们经常会用到Filter和Interceptor.有时同一个功能.Filter可以做,Interceptor也可以做.有时就需要考虑使用哪一个比较好.这篇文章主要介绍一下,二者的 ...

  2. 过滤器(Filter)与拦截器(Interceptor)的区别

    1 .拦截器是基于java的反射机制的,而过滤器是基于函数回调. 2 .拦截器不依赖与servlet容器,过滤器依赖与servlet容器. 3 .拦截器只能对action请求起作用,而过滤器则可以对几 ...

  3. 二十五、过滤器Filter,监听器Listener,拦截器Interceptor的区别

    1.Servlet:运行在服务器上可以动态生成web页面.servlet的声明周期从被装入到web服务器内存,到服务器关闭结束.一般启动web服务器时会加载servelt的实例进行装入,然后初始化工作 ...

  4. 过滤器(Filter)和拦截器(Interceptor)

    过滤器(Filter) Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序.它依赖于servlet容器,在实现上,基于函数回调,它可以对几乎所有请求 ...

  5. Java 中的过滤器Filter 和拦截器 Interceptor

    1.先说拦截器 Interceptor 本项目以springboot为例: 新建 InterceptorConfig package com.opendev.mystudy.MyInterceptor ...

  6. 过滤器(Filter)、拦截器(Interceptor)、监听器(Listener)

    一.Filter 过滤器 1.简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servle ...

  7. JavaWeb—拦截器Interceptor

    1.概念 java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了一种可以提取A ...

  8. struts 拦截器 Interceptor

         拦截器是AOP中的概念,它本身是一段代码,可以通过定义“织入点”,来指定拦截器的代码在“织入点”的前后执行,从而起到拦截的作用.正如上面 Struts2的Reference中讲述的,Stru ...

  9. Filter(过滤器) 和 interceptor(拦截器)的区别

    Filter(过滤器) 和 interceptor(拦截器)的区别 1.拦截器是基于java反射机制的,而过滤器是基于函数回调的. 2.过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容 ...

随机推荐

  1. I Hate It:线段树:单点修改+区间查询

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  2. HDFS essay 2 - Clarify Name Node / Checkpoint Node/ Backup Node

    为什么想用英文写了?我获取知识.技术的大部分途径都是通过英文,所以按照自己的理解用英文写下来也比较容易,另外,很多term都是不能翻译的,如果要持续学习技术和知识,那就不但要习惯去阅读,听,还要写,说 ...

  3. 头文件#ifndef #define #endif使用

    想必很多人都看过“头文件中的 #ifndef #define #endif 防止该头文件被重复引用”.但是是否能理解“被重复引用”是什么意思?是不能在不同的两个文件中使用include来包含这个头文件 ...

  4. 软件工程课堂作业(二)续——升级完整版随机产生四则运算题目(C++)

    一.设计思想: 1.根据题目新设要求,我将它们分为两类:一类是用户输入数目,根据这个数目改变一系列后续问题:另一类是用户输入0或1,分情况解决问题. 2.针对这两类要求,具体设计思路已在上篇博文中写出 ...

  5. .net改善程序性能建议

    对改善程序性能的建议. 文章:https://msdn.microsoft.com/zh-cn/library/ms973838.aspx

  6. Node js MySQL简单操作

    //win7环境下node要先安装MySQL的相关组件(非安装MySQL数据库),在cmd命令行进入node项目目录后执行以下语句 //npm install mysql var mysql = re ...

  7. C#下Label的多行显示

    效果如图 1. tableLayout 三行两列 第一行 存放二维码的信息 第二行空白,用于分割 第三行存储LOGO信息 2. Lable4个,Dock属性都为Fill 第一列TextAlign使用M ...

  8. Java中的日志——Java.util.logging、log4j、commons-logging

    Java中给项目程序添加log主要有三种方式,一使用JDK中的java.util.logging包,一种是log4j,一种是commons-logging.其中log4j和commons-loggin ...

  9. DBGrid相关技术整理

    DBGrid相关技术整理: 注:对于DBGrid相关属性.方法的学习融入到技术整理过程中 一,多选 设置属性: Options->dgMultiSelect = True; ->dgRow ...

  10. bzoj1143-祭祀

    题目 给出一个有向无环图,要在上面安放祭祀点.两个祭祀点必须不可达,求最多能安放多少个祭祀点. 分析 由于一条无法再延伸链上只能安放一个祭祀点,而我们要求的是最多能安放祭祀点的个数,所以要求的就是最长 ...