1、Struts2实现原理:
当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器,如图所示。
2、Struts2默认的所有拦截器:
在struts-default.xml中已经配置了以上的拦截器。如果您想要使用上述拦截器,只需要在应用程序struts.xml文件中通过“<include file="struts-default.xml" />”将struts-default.xml文件包含进来,并继承其中的struts-default包(package),最后在定义Action时,使用“<interceptor-ref name="xx" />”引用拦截器或拦截器栈(interceptor stack)。一旦您继承了struts-default包(package),所有Action都会调用拦截器栈 ——defaultStack。当然,在Action配置中加入“<interceptor-ref name="xx" />”可以覆盖defaultStack。
3、Struts2为我们提供了一个Interceptor接口,该接口源代码如下:
1)init():在拦截器执行之前调用,主要用于初始化系统资源。
2)destroty():与init()对应,用于拦截器执行之后销毁资源。
3)intercept():拦截器的核心方法,实现具体的拦截操作。与action一样,该方法也返回一个字符串作为逻辑视图。如果拦截器成功调用了action,则返回该action中execute()方法返回的逻辑视图,反之,则返回一个自定义的逻辑视图。
Struts2还为我们提供了一个AbstractInterceptor类,该类的init()和destroy()都是空实现。我们开发自己的拦截器只需要继承这个类就行了。
4、下面以一个登录的例子为例自定义拦截器:首先自定义一个拦截器类,该类可以实现Interceptor接口或继承AbstractInterceptor类:
如果希望包下的所有action都使用自定义的拦截器,可以通过<default-interceptor-ref name="permissionStack" />把拦截器定义为默认的拦截器。注意:每个包只能指定一个默认拦截器,另外,一旦我们为该包中的某个action显示指定了某个拦截器,则默认拦截器不会起作用。
配置后所有action默认拦截器都是permissionStack了,如果当需求需要为某个单独的action引入拦截器,又需要保留默认的拦截器permissionStack,就应该在action下做
以下配置:
Struts2提供MethodFilterInterceptor类,该类是AbstractInerceptor的子类,
①protectedabstractStringdoIntercept(ActionInvocationinvocation)throwsException; 必须重写此方法,实现拦截。
②String interceptor(ActionInvocation invocation):继承自AbstractInterceptor类,方法不需要强制重写
③void setExcludeMethods(String excludeMethods):设置拦截器黑名单,参数为Action一方法名。拦截器不拦截该方法
④void setIncludeMethods(String includeMethods):设置拦截器白名单,参数为Action一方法名。拦截器会拦截该方法
⑤Set<String>getExcludeMethodsSet():获得拦截器的黑名单
⑥Set<String>getIncludeMethodsSet():获得拦截器的白名单
在使用方法拦截器的action只要不在<param name="exculdeMethods"></param>节点内的当前action方法就会被拦截,当同时出现在黑白名单时也会被拦截。也可以用通配符或逗号隔开表示多个,或组合使用: