最近在學習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