转自:http://enetq.blog.51cto.com/479739/542619
在Action中使用拦截器,默认情况下回拦截Action中所有的方法,但是在某些情况下,可能只需要拦截Action中的一个或多个方法,有时候也希望不拦截某个方法,这个在Struts2中是怎么实现的呢 ?
拦截器方法过滤:让拦截器有选择的拦截Action中的某个方法!
Struts2中提供了一个MethodFilterInterceptor类,开发者自定义的拦截器只需要继承该类就可以使用这个方法过滤的功能,来拦截Action中特定的方法!
查看API文档 可以看到这个类为:
是AbstractInterceptor拦截器的子类,实现了Interceptor和Serializable接口
MethodFilerInterceptor实现方法过滤中用到的两个参数
execludeMethods:该参数指定拦截器拒绝拦截的方法列表,多个方法用“,”隔开,指定了这个参数,拦截器不会拦截指定列表中的方法,就是所谓的黑名单 |
includeMethods:该参数指定拦截器需要拦截的方法列表,如果指定了参数,则指定的Action在执行前会被拦截,即白名单。 |
主要方法:
①protected abstract String doIntercept(ActionInvocation invocation) throws Exception; 必须重写此方法,实现拦截。
②String interceptor(ActionInvocation invocation):继承自AbstractInterceptor类,方法不需要强制重写
③void setExcludeMethods(String excludeMethods):设置拦截器黑名单,参数为Action一方法名。拦截器不拦截该方法
④void setIncludeMethods(String includeMethods):设置拦截器白名单,参数为Action一方法名。拦截器会拦截该方法
⑤Set<String> getExcludeMethodsSet():获得拦截器的黑名单
⑥Set<String> getIncludeMethodsSet():获得拦截器的白名单
一般开发者只需要重写doIntercept方法即可!下面给出一个实例:
一。实现方法过滤的拦截器实现类:FilterInterceptor.java继承自MethodFilterInterceptor类
在该类中name属性用来标识拦截器的名称,方便控制台的输出
二。Action:业务控制器FilterAction.java
三。配置文件struts.xml
四。jsp视图 MethodFilter.jsp
五:运行结果:
①
可以看出method1方法拦截了。而method2方法是放到了黑名单中。
②将JSP视图中action 换成FilterAction!method2.action 输出信息
因为指定method2为黑名单,不会拦截,因此是没有拦截信息的。
③将JSP视图中action 换成FilterAction!method3.action 输出信息
可以看到,虽然没有在黑名单中指定method3,因为配置文件显示指定了白名单,所以拦截器只拦截白名单中指定的方法!