struts2 interceptor拦截器---【小白系列】0基础到熟练应用struts2框架(六)
2017-07-06 21:57
736 查看
interceptor概念:
我的理解吧,跟javaweb阶段的filter一样,因为看源码的话,有init 销毁 和放行操作,本质就是struts的过滤器。百度百科解释
和filter不同的是 interceptor只能拦截action,而filter可以拦截所有
这是struts的原理图,我们看到ActionProxy代理对象,调用Action invocation对象,然后经过很多interceptors再执行action
interceptor有struts定义好的,当然我们也可以自定义intercept。
struts定义好的在struts2-core-2.3.24.jar下的/struts-default.xml里面定义的。
、
拦截器的执行过程的源码分析:
---StrutsPrepareAndExecuteFilter---doFilter
---execute.executeAction(request, response, mapping);
---dispatcher.serviceAction(request, response, mapping);
---proxy.execute();
---invocation.invoke();
然后跟到这里
这里我们来看一下,interceptors它本质是一个 iterator在循环遍历,这里封装了interceptor对象。
try里面我们看一下intercept方法,随便点击去一个类
可以看到执行完intercept方法之后又返回invocation.invoke();再去循环那个iterator,直到没有过滤器需要执行,可以看出这是个递归。执行完毕所有过滤器之后,调用invokeActionOnly()方法,这翻译过来就是仅仅执行action
看了源码之后,我们也可以照着他的思路写一个自己的interceptor。接下来我们来说自定义iterator
自定义拦截器
1.继承我们以后常用的MethodFilterInterceptor这个过滤器,因为它内部有过滤/不过滤方法的配置public class TestInterceptor extends MethodFilterInterceptor { @Override protected String doIntercept(ActionInvocation invocation) throws Exception { System.out.println("过滤器前"); invocation.invoke();//相当于放行,去执行那个iterator System.out.println("过滤器后"); return null; } }
2.struts.xml中配置
<interceptors>//理解为这个标签里可以配好多过滤器 <interceptor name="test" class="com.test.interceptor.TestInterceptor"></interceptor>//起名,class属性是全路径 <interceptor-stack name="myStack">//可以来个栈,把好多过滤器放进来,也可以放别的栈 <interceptor-ref name="test"></interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="myStack"></default-interceptor-ref>//必须配置这项,不然会执行默认的
3.执行action
以上配置是全局配置,也就是说所有action都会执行这个过滤器,我们也可以在action内部定义局部的过滤器
<action name="test" class="com.test.struts.QuickTestAction" method="exec"> <interceptor-ref name="test"></interceptor-ref>//name属性为上面定义的过滤器名字即可 <result name="error" >/error.jsp</result> </action>
注意,当配置了局部和全局时,会使用局部的,因为就近原则。
到此为止一个简单的过滤器我们就配置好了。不过有一个小问题。大家可以试试,前台传值过来,我们后台是无法封装参数的,因为我们没有使用struts的封装参数的过滤器。所以我们在写的时候可以
<interceptors> <interceptor name="test" class="com.test.interceptor.TestInterceptor"></interceptor> <interceptor-stack name="myStack"> <interceptor-ref name="defaultStack"></interceptor-ref>//重点是这句!把默认的那个栈引进来 <interceptor-ref name="test"></interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="myStack"></default-interceptor-ref>
别忘了删除刚刚在action中测试的过滤器。
最后总结一下拦截器的功能,也就是增强一个action 的方法,另外就是权限校验。在我们执行action之前会帮我们做一些事情。
相关文章推荐
- struts2参数封装---【小白系列】0基础到熟练应用struts2框架(五)
- struts2获取作用域对象---【小白系列】0基础到熟练应用struts2框架(三)
- struts2环境搭建---【小白系列】0基础到熟练应用struts2框架(一)
- Struts2结果视图配置---【小白系列】0基础到熟练应用struts2框架(二)
- struts2值栈&struts ognl表达式---【小白系列】0基础到熟练应用struts2框架(四)
- hibernate实体类的创建规则---【小白系列】0基础到熟练应用hibernate框架(六)
- hibernate多对多关系---【小白系列】0基础到熟练应用hibernate框架(十三)
- hibernate主键生成策略---【小白系列】0基础到熟练应用hibernate框架(七)
- spring IoC注解开发---【小白系列】0基础到熟练应用spring框架(二)
- hibernate一对多|多对一关系---【小白系列】0基础到熟练应用hibernate框架(十二)
- hibernate事务---【小白系列】0基础到熟练应用hibernate框架(十)
- hibernate的Configuration,SessionFactory,Session详解---【小白系列】0基础到熟练应用hibernate框架(二)
- hibernate一级缓存---【小白系列】0基础到熟练应用hibernate框架(九)
- hibernatJPA---【小白系列】0基础到熟练应用hibernate框架(十五)
- spring环境搭建&spring快速入门---【小白系列】0基础到熟练应用spring框架(一)
- hibernate中对象视图导航查询|加载策略---【小白系列】0基础到熟练应用hibernate框架(十四)
- hibernate实体类的三种状态---【小白系列】0基础到熟练应用hibernate框架(八)
- HibernateUtils工具---【小白系列】0基础到熟练应用hibernate框架(四)
- spring AOP---【小白系列】0基础到熟练应用spring框架(三)
- hibernate环境搭建教程---【小白系列】0基础到熟练应用hibernate框架(一)