您的位置:首页 > 编程语言 > Java开发

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之前会帮我们做一些事情。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐