struts2系统自带了很多拦截器,有时需要我们自己定义,一般有两种方式:
一、实现Interceptor接口
1
2
3
4
5
|
public
interface
Interceptor
extends
Serializable{
public
void
init();
public
void
destroy();
public
String intercept(ActionInvocation invocation)();
}
|
二、继承AbstractInterceptor类,重写intercept()方法即可
此方法更可行,其实AbstractInterceptor类也就是实现了Interceptor接口
1
2
|
invocation.invoke();表示该方法执行完后执行Action的execute()方法或者执行下一个拦截器
invocation.getAction(); 可以将该法强制转换为Action的类类型
|
三、方法拦截器:继承MethodFilterInterceptor类,重写doIntercept()方法
MethodFilerInterceptor实现方法过滤中用到的两个参数
execludeMethods:该参数指定拦截器拒绝拦截的方法列表,多个方法用“,”隔开,指定了这个参数,拦截器不会拦截指定列表中的方法,就是所谓的黑名单 |
includeMethods:该参数指定拦截器需要拦截的方法列表,如果指定了参数,则指定的Action在执行前会被拦截,即白名单。 |
定义好自定义拦截器后,就要使用自定义拦截器,在struts.xml文档中
一、包内定义拦截器
1
2
3
4
5
6
|
<
package....
>
<
interceptors
>
<
interceptor
name
=
"myinterceptor"
class
=
"...."
>
</
interceptor
>
</
interceptors
>
</
package
>
|
1
2
3
4
5
|
<
action
.....>
<
result.....
></
result
>
<
interceptor-ref
name
=
"defaultStack"
></
interceptor-ref
>
<
interceptor-ref
name
=
"myinterceptor"
></
interceptor-ref
>
</
action
>
|
一下是例子:
MyMethodInterceptor
1
2
3
4
5
6
7
8
9
10
11
12
|
public
class
MyMethodInterceptor
extends
MethodFilterInterceptor{
protected
String doIntercept(ActionInvocation invocation)
throws
Exception {
// TODO Auto-generated method stub
System.out.println(
"进入MyMethodInterceptor方法拦截器!!!!!!!!!!!!!"
);
Map session = invocation.getInvocationContext().getSession();
String name = (String) session.get(
"uname"
);
if
(name !=
null
) {
return
invocation.invoke();
}
return
"input"
;
}
}
|
struts.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<
struts
>
<
constant
name
=
"struts.i18n.encoding"
value
=
"UTF-8"
></
constant
>
<
constant
name
=
"struts.enable.DynamicMethodInvocation"
value
=
"true"
></
constant
>
<!-- <constant name="struts.action.extension" value="action,abc"></constant>-->
<
package
abstract
=
"true"
name
=
"pk1"
namespace
=
"/"
extends
=
"struts-default"
></
package
>
<
package
name
=
"pk2"
extends
=
"pk1"
>
<
interceptors
>
<
interceptor
name
=
"test1"
class
=
"org.interceptors.MyTimerInterceptor"
/>
<
interceptor
name
=
"method1"
class
=
"org.interceptors.MyMethodInterceptor"
>
<
param
name
=
"excludeMethods"
>login</
param
>
</
interceptor
>
<
interceptor-stack
name
=
"myStack"
>
<
interceptor-ref
name
=
"defaultStack"
></
interceptor-ref
>
<
interceptor-ref
name
=
"method1"
></
interceptor-ref
>
<
interceptor-ref
name
=
"test1"
></
interceptor-ref
>
</
interceptor-stack
>
</
interceptors
>
<!-- <default-interceptor-ref name="myStack"></default-interceptor-ref>-->
<
action
name
=
"login_*_*"
class
=
"org.hzy.Actions.LoginAction"
method
=
"{1}"
>
<
interceptor-ref
name
=
"myStack"
></
interceptor-ref
>
<
result
name
=
"success"
type
=
"chain"
>{2}</
result
>
<
result
name
=
"input"
>index.jsp</
result
>
<
result
name
=
"error"
>/WEB-INF/Jsp/error.jsp</
result
>
</
action
>
<
action
name
=
"query_*"
class
=
"org.hzy.Actions.QueryAction"
method
=
"{1}"
>
<
result
>/WEB-INF/Jsp/show.jsp</
result
>
</
action
>
<
action
name
=
"upload_*"
class
=
"org.hzy.Actions.FileUploadAction"
method
=
"{1}"
>
<
result
>/WEB-INF/Jsp/show.jsp</
result
>
</
action
>
</
package
>
</
struts
>
|