1.1. 什麼是攔截器 :
2. 攔截器的配置
Struts 2已經爲您提供豐富多樣的,功能齊全的攔截器實現。大家可以至struts2的jar包內的struts-default.xml查看關於默認的攔截器與攔截器鏈的配置。
< interceptors >
<!-- 定義攔截器 -->
< interceptor name ="攔截器名" class ="攔截器實現類" />
<!-- 定義攔截器棧 -->
< interceptor-stack name ="攔截器棧名" >
< interceptor-ref name ="攔截器一" />
< interceptor-ref name ="攔截器二" />
</ interceptor-stack >
</ interceptors >
......
</ package >
一旦定義了攔截器和攔截器棧後,就可以使用這個攔截器或攔截器棧來攔截Action了。攔截器的攔截行爲將會在Action的exceute方法執行之前被執行。
< result name ="success" > /success.jsp</ result >
< result name ="error" > /error.jsp</ result >
<!-- 使用攔截器,一般配置在result之後, -->
<!-- 引用系統默認的攔截器 -->
< interceptor-ref name ="defaultStack" />
< interceptor-ref name ="攔截器名或攔截器棧名" />
</ action >
作爲“框架(framework)”,可擴展性是不可或缺的。雖然,Struts 2爲我們提供如此豐富的攔截器實現,但是這並不意味我們失去創建自定義攔截器的能力,恰恰相反,在Struts 2自定義攔截器是相當容易的一件事。
import java.util.Map;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
/**
* 權限檢查攔截器
*
* @author qiujy
* @version 1.0
*/
public class AuthorizationInterceptor extends AbstractInterceptor {
/*
* 攔截Action處理的攔截方法
*
*/
public String intercept(ActionInvocation invocation) throws Exception {
Map session = invocation.getInvocationContext().getSession();
String userName = (String) session.get("userName" );
if (null != userName && userName.equals("test" )) {
System.out.println("攔截器:合法用戶登錄---" );
return invocation.invoke();
} else {
System.out.println("攔截器:用戶未登錄---" );
return Action.LOGIN;
}
}
}
5.3. 配置權限控制攔截器 :
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
< struts >
< package name ="my" extends ="struts-default" >
< interceptors >
<!-- 定義權限控制攔截器 -->
< interceptor name ="authority" class ="org.qiujy.common.AuthorizationInterceptor" />
</ interceptors >
<!-- 定義全局處理結果 -->
< global-results >
<!-- 邏輯名爲login的結果,映射到/login.jsp頁面 -->
< result name ="login" > /login.jsp</ result >
</ global-results >
< action name ="listall" class ="org.qiujy.web.struts2.action.UserAction" method ="listAllUser" >
< result name ="success" > /listall.jsp</ result >
<!-- 使用攔截器 -->
< interceptor-ref name ="defaultStack" />
< interceptor-ref name ="authority" />
</ action >
< action name ="userOpt" class ="org.qiujy.web.struts2.action.UserAction" >
< result name ="success" > /success.jsp</ result >
</ action >
</ package >
</ struts >
登錄後:
如果爲了簡化struts.xml文件的配置,避免在每個Action重複配置該攔截器,可以將攔截器配置成了一個默認攔截器棧。如下:
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
< struts >
< package name ="my" extends ="struts-default" >
< interceptors >
<!-- 定義權限控制攔截器 -->
< interceptor name ="authority"
class ="org.qiujy.common.AuthorizationInterceptor" />
<!-- 定義一個包含權限控制的攔截器棧 -->
< interceptor-stack name ="mydefault" >
< interceptor-ref name ="defaultStack" />
< interceptor-ref name ="authority" />
</ interceptor-stack >
</ interceptors >
<!-- 定義默認攔截器 -->
< default-interceptor-ref name ="mydefault" />
<!-- 定義全局處理結果 -->
< global-results >
<!-- 邏輯名爲login的結果,映射到/login.jsp頁面 -->
< result name ="login" > /login.jsp</ result >
</ global-results >
< action name ="listall"
class ="org.qiujy.web.struts2.action.UserAction"
method ="listAllUser" >
< result name ="success" > /listall.jsp</ result >
</ action >
</ package >
< package name ="font" extends ="struts-default" >
< action name ="userOpt" class ="org.qiujy.web.struts2.action.UserAction" >
< result name ="success" > /success.jsp</ result >
</ action >
</ package >
</ struts >