from: 成长之路 http://xugw.blog.sohu.com/124311370.html
做拦截器的两个步骤
1.写一个自己的拦截器
public class PrivilegeCheckInterceptor extends AbstractInterceptor {
//实现拦截器接口
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("PrivilegeCheckInterceptor");
return invocation.invoke();
}
}
2.配置全局的拦截器(struts.xml)
<struts>
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="myinterceptor" class="test.interceptor.PrivilegeCheckInterceptor" />
<interceptor-stack name="mystack">
<interceptor-ref name="myinterceptor" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="mystack" />
<action name="users1"
class="test.action.UserManagementAction">
<result name="input">/index.jsp</result>
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
这样配置后所有在package之内定义的Action,都将被PrivilegeCheckInterceptor 拦截
注解的方式(annotation)也可以配置拦截器,但是全局的拦截器还是要用struts.xml配置
注意:拦截的配置应该放在action的前面
问题:convention和拦截器(全局)的配合问题。convention是零配置的,而拦截器是要在struts.xml中定义的,
如何为所有的action指定一个全局的拦截器呢?(这个问题好,我找了好久才找到这个解答)
解决:利用struts2的package继承关系,ParentPackage的拦截器会被ChildPackage所继承。
在struts.xml中定义好拦截器
在struts.properties中加入
struts.convention.default.parent.package=default
注意这个包名(default)要和struts.xml中的包名一致
<package name="default" extends="struts-default">
也可以在Action中用@ParentPackage("default")的方式指定父包的名称
问题: 如何获得被截取的方法名
解决: 利用拦截器的对象ActionInvocation
ActionProxy proxy = actionInvocation.getProxy();
proxy.getMethod();