-
理解
Interceptor攔截器類似於我們學過的過濾器,是可以在action執行前后執行的代碼.是我們做web開發是經常使用的技術,比如權限控制,日志.我們也可以把多個interceptor連在一起組成一個棧.
攔截器是一種AOP(面向切面編程)思想的編程方式.它提供一種機制是開發者能夠把相對獨立的代碼抽離出來,配置到Action前后執行.
Struts2攔截器,每個攔截器只有一個對象實例,屬於單例模式,struts2核心功能都是通過攔截器來實現的.
-
作用
對action的一些公共處理代碼可以放到攔截器中實現,比如權限控制,日志.
-
執行流程
-
實現步驟
- 編寫攔截器(實現interceptor接口或繼承AbstractInterceptor抽象類即可, )
- 在struts.xml中配置攔截器
- 在action中使用攔截器
下面寫一個自定義攔截器的例子,判斷用戶是否登錄,就是檢查當前用戶的session中的user屬性是否為空,如果為空,就跳到登錄頁面,否則,繼續執行.
1.編寫攔截器,在interceptor包下常見一個java類,名為LoginInterceptor,繼承AbstractInterceptor:
public class LoginInterceptor extends AbstractInterceptor{ @Override public String intercept(ActionInvocation invocation) throws Exception { //得到攔截到的action的名稱,看是否是login,當是login的時候,不用進行下面的檢測了,直接執行下一個攔截器
String actionName=invocation.getProxy().getActionName(); if("login".equals(actionName)){ return invocation.invoke(); } //如果不是login.則判斷是否已登錄,及檢測session中key為user的值是否存在,如果不存在,跳回到登錄頁面
String user=(String)invocation.getInvocationContext().getSession().get("user"); if(user==null){ System.out.println("未登錄"); return "login"; } //進行到這里.說明用戶已登錄,則跳轉到下一個攔截器
return invocation.invoke(); } }
2,在struts.xml中配置interceptor,主要特別注意的是,當使用了自定義的攔截器后,默認攔截器將不起作用,默認攔截器實在struts-default.xml中配置的,當引用了自定義攔截器,又想使用struts2提供的默認攔截器功能,需要手動配置:這里我將默認攔截器和我寫的進行登錄權限驗證的攔截器,寫到一個攔截器棧里,然后調用這個默認攔截器棧:
<package name="default" namespace="/" extends="struts-default"> <interceptors> <!-- 配置自定義的攔截器--> <interceptor name="checkLogin" class="com.wang.interceptor.LoginInterceptor"/> <!--配置一個攔截器棧,里面包含自己定義的攔截器和defaultStack默認攔截器--> <interceptor-stack name="myStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="checkLogin"></interceptor-ref> </interceptor-stack> </interceptors> <!--引用默認的攔截器(棧)--> <default-interceptor-ref name="myStack"></default-interceptor-ref>
<!--配置一個全局結果集-->
<global-results> <result name="login">/login.jsp</result> </global-results> <action name="login" class="com.wang.action.LoginAction" > <result>/succ.jsp</result> <result name="error">/login.jsp</result> </action> </package>
這里我使用了默認攔截器標簽,即相當於在每個action標簽下,使用了 <interceptor-ref name="myStack"></interceptor-ref>.jsp頁面和LoginAction類這里就省略了.
再來介紹一下方法攔截器,方法攔截器比action攔截器控制的更加精細,大體實現方式和action攔截器相同,不同的是它繼承的是MethodFilterInterceptor類,重寫的是doInterceptor()方法,在struts.xml的配置上也有些不同,大體是這樣:
<interceptor-ref name="methodInterceptor">
<!--配置被攔截的方法-->
<param name="includeMethods">methodA,methodsB</param>
<!--配置不被攔截的方法-->
<param name="excludeMethods">methodsC,methodsD</param>
</interceptor-ref>