1. Interceptor介绍
Struts2中的interceptor它是基于spring aop思想,而aop思想它本质上是通过动态代理来实现。我们strtus2的拦截器它主要是拦截Action的操作,在action的执行前或执行后进行一些其它的功能操作。
拦截器链(拦截器栈)简单说,就是可以将多个拦截器形成一个链,在访问它们时依次访问。
以下是struts2的执行流程图
执行的过程:
当我们发送请求访问Action时,会被StrutsPrepareAndExecuteFilter拦截
在其doFilter方法内执行了
execute.executeAction(request, response, mapping);
这个代码执行后
dispatcher.serviceAction(request, response, mapping);
serviceAction方法执行
在这个方法执行过程中会创建Action代理对象
ActionProxy proxy = getContainer().getInstance(ActionProxyFactory.class).createActionProxy(
namespace, name, method, extraContext, true, false);
通过proxy去执行了proxy.execute();
在execute方法内
return invocation.invoke();
invocation它是ActionInvocation一个对象
在invoke方法内
会去加载我们的配置文件,将配置文件中所有的interceptor得到进行遍历。
在struts-default.xml文件中定义了默认加载的拦截器栈 defaultStack
在每一个拦截器的interceptor方法内,又调用了DefaultActionInvocation的invoke方法,其实就是递归调用。
2. Interceptor作用与自定义Interceptor
我们使用intercep[tor可以在action执行前后进行处理工作。例如,完成权限控制。
问题:如何定义Interceptor?
所有的Interceptor都要实现一个接口
com.opensymphony.xwork2.interceptor.Interceptor
在配置文件中声明Interceptor
我们也可以将多个interceptor封装成一个stack
可以在Action的配置中引入自己的interceptor
在使用时name也可以引入一个interceptor stack.
注意:当我们显示的引入了一个自定义的Interceptor,那么默认的defaultStack就不会在导入,需要手动导入。
3. Interceptor练习
如果用户没有登录,不可以查看所有的商品信息。
创建一个Interceptor
在struts.xml文件中声明,并在指定的action中引用
完成功能
修改登录action中操作
将用户存储到session中。
在interceptor中完成权限控制
问题1:如何在login指定的视图页面上展示错误信息,例如权限不足。
问题2:我们在struts.xml文件中配置action时,可以使用*通配置符,这时它可以处理多个方法,你指定的interceptor只想拦截某一个方法,怎样处理?
我们可以使用Interceptor接口的一个实现类来完成操作
在配置时,就可以指定哪些方法拦截,哪些方法不拦截
原文地址:http://blog.51cto.com/13587708/2129811