最近在学习struts的拦截器,现在来总结一下。
1、拦截器是什么?
拦截器相当于过滤器:就是将不想要的去掉,想要的留下。拦截器抽象出一部分代码可以用来完善原来的action。同时可以减轻代码冗余,提高重用率。通俗地讲就是一张网,过滤掉不需要的沙子,留下水。
2、拦截器的作用:
拦截器可以构成特定的功能。比如权限认证、日志记录和登陆判断。
3、拦截器的原理:
其每一个Action请求都在拦截器中,每一个action可以将操作转交给下面的拦截器,也可以直接退出到界面上。
4、定义拦截器:
(1)自定义一个实现Interceptor接口(不过我初学者一般直接实现框架中的Interceptor)
(2)在struts.xml中注册定义的拦截器
(3)可以需要的action中引用拦截器
Interceptor接口声明了三个方法
1
2
3
4
5
6
7
8
|
public interface Interceptor extends Serializable {
void destroy();
void init();
String intercept(ActionInvocation invocation) throws Exception;
}
|
Init方法是在action作用之前调用,就是开始给烂机器的初始化操作。
Destory方法在拦截器被垃圾回收之前调用,用来回收init方法初始化的资源。
interceptor方法是拦截器的主要操作。如果需要调用后续的Action或者拦截器,只需要在该方法中调用invocation.invoke()方法即可,在该方法调用的前后可以插入Action调用前后拦截器需要做的方法。
现在对用户登录进行拦截,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println( "在action执行之前" );
ActionContext actionContext=invocation.getInvocationContext();
Map<String,Object> session=actionContext.getSession();
Object currentUser=session.get( "currentUser" );
String result= null ;
if (currentUser!= null ){
result=invocation.invoke();
} else {
HttpServletRequest request=(HttpServletRequest)invocation.getInvocationContext().get(ServletActionContext.HTTP_REQUEST);
request.setAttribute( "error" , "请先登录" );
result= "error" ;
}
System.out.println( "result+" +result);
System.out.println( "在action执行之后" );
return result;
}
|
注册拦截器:
1
2
3
4
5
6
7
8
9
10
11
|
< interceptors >
< interceptor name = "myInterceptor"
class = "com.fangchao.interceptor.MyInterceptor" ></ interceptor >
< interceptor name = "loginInterceptor"
class = "com.fangchao.interceptor.LoginInterceptor" ></ interceptor >
< interceptor-stack name = "myStack" >
< interceptor-ref name = "loginInterceptor" ></ interceptor-ref >
< interceptor-ref name = "defaultStack" ></ interceptor-ref >
</ interceptor-stack >
</ interceptors >
|
上述代码中的interceptor-stack是个拦截器栈。到目前为止,就是在下面引用时,比较方便。一般来讲,每个action都会使用defaultStack。
拦截器参数:
配置参数:
- excludeMethods:过滤掉不使用拦截器的方法
- includeMethods:使用拦截器的方法。
有两种配置方式:
1
2
3
4
5
6
|
< interceptor-ref name = "validation" >
< param name = "excludeMethods" >myValidationExcudeMethod</ param >
</ interceptor-ref >
< interceptor-ref name = "workflow" >
< param name = "excludeMethods" >myWorkflowExcludeMethod</ param >
</ interceptor-ref >
|
或者
1
2
3
4
|
< interceptor-ref name = "defaultStack" >
< param name = "validation.excludeMethods" >myValidationExcludeMethod</ param >
< param name = "workflow.excludeMethods" >myWorkflowExcludeMethod</ param >
</ interceptor-ref >
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://www.cnblogs.com/TigerandRose/p/6506438.html