Struts2框架是基於攔截器實現的,能夠對某個Action進行攔截,而後處理一些邏輯。攔截器至關於AOP裏面的環繞通知,即在Action方法的執行以前和以後根據須要添加相應的邏輯。事實上,即便struts.xml 沒有任何關於攔截器的配置,Struts2也會爲咱們添加一組默認的攔截器,最多見的是,請求參數自動綁定到Action對應的字段上(default Stack 默認攔截器棧中params攔截器)。html
Struts2中自定義攔截器的步驟是:java
1.定義攔截器類apache
2.爲Action配置自定義的攔截器類數據結構
以定義一個檢查是否有請求HelloWorldAction的權限爲例:框架
package com.tom.interceptors; ide
import com.opensymphony.xwork2.ActionInvocation; this
import com.opensymphony.xwork2.interceptor.AbstractInterceptor; spa
import org.apache.struts2.ServletActionContext; orm
//繼承AbstractInterceptor
public class PermissionCheckInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
//取permit請求參數,true表示有權限,其它表示沒有權限
String value = ((String[])invocation.getInvocationContext().getParameters().get("permit"))[0];
Boolean permit = Boolean.valueOf(value);
if (Boolean.TRUE.equals(permit)) {
return invocation.invoke(); //調用Action的方法,並返回那個方法對應的結果視圖
}
//在checkResult視圖上顯示message信息
ServletActionContext.getRequest().setAttribute("message", "Permission denies");
return "checkResult"; //結果轉到checkResult對應的視圖
}
}
package com.tom.actions;
public class HelloWorldAction {
private String permit; //頁面上輸出permit的值
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String execute() {
this.message = "Permission OK, the permit value is: " + permit;
return "checkResult";
}
public String getPermit() {
return permit;
}
public void setPermit(String permit) {
this.permit = permit;
}
}
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="hellopkg" namespace="/hellons" extends="struts-default">
<!--定義包級別攔截器,供包內action引用-->
<interceptors>
<interceptor name="permissionCheckInterceptor" class="com.tom.interceptors.PermissionCheckInterceptor"/>
</interceptors>
<action name="hi" class="com.tom.actions.HelloWorldAction">
<!--引用權限檢查攔截器,能夠定義多個-->
<interceptor-ref name="permissionCheckInterceptor"/>
<result name="checkResult">/htmls/checkResult.jsp</result>
</action>
</package>
</struts>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title></title>
</head>
<body>
Check Result: ${message}
</body>
</html>
1. http://localhost:8080/hellons/hi?permit=false
頁面顯示:Check Result: Permission denies
2. http://localhost:8080/hellons/hi?permit=true
頁面顯示:Check Result: Permission OK, the permit value is: null
在訪問http://localhost:8080/hellons/hi?permit=true時,結果顯示permit的值爲null,而根據Struts2的請求參數與Action字段的對應關係,value的值應該爲true纔對。這裏爲null表示Struts2並無完成請求參數與action字段的自動綁定,緣由是,當咱們配置HelloWorldAction的攔截器時,把Struts2默認配置到Action中的攔截器覆蓋了,這其中就包括參數綁定攔截器
Struts2在配置攔截器時,採用的是一種遞歸的數據結構,攔截器棧interceptor-stack能夠包含一組interceptor-ref也能夠包含interceptor-stack。
Struts2爲每一個Action默認配置的一組攔截器放置於名稱爲defaultStack的攔截器棧中。因此,當爲Action配置攔截器時,須要把默認攔截器配置上,而且默認攔截器應該在最前,由於默認攔截器包含了Struts基礎和核心功能,應該讓這些攔截器優先執行。
修改後的struts2.xml
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="hellopkg" namespace="/hellons" extends="struts-default">
<!--定義包級別攔截器,供包內action引用-->
<interceptors>
<interceptor name="permissionCheckInterceptor" class="com.tom.interceptors.PermissionCheckInterceptor"/>
</interceptors>
<action name="hi" class="com.tom.actions.HelloWorldAction">
<!--配置默認攔截器-->
<interceptor-ref name="defaultStack"/>
<!--引用權限檢查攔截器,能夠定義多個-->
<interceptor-ref name="permissionCheckInterceptor"/>
<result name="checkResult">/htmls/checkResult.jsp</result>
</action>
</package>
</struts>
此時訪問http://localhost:8080/hellons/hi?permit=true,頁面顯示Check Result: Permission OK, the permit value is: true
1.定義並引用攔截器棧
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="hellopkg" namespace="/hellons" extends="struts-default">
<!--定義包級別攔截器,供包內action引用-->
<interceptors>
<!--自定義攔截器-->
<interceptor name="permissionCheckInterceptor" class="com.tom.interceptors.PermissionCheckInterceptor"/>
<!--攔截器棧-->
<interceptor-stack name="permissionCheckInterceptorStack">
<!---攔截器內部只能引用其它的攔截器(<interceptor-ref name=... ),而不能使用定義攔截器(<interceptor name=... )-->
<!--默認攔截器-->
<interceptor-ref name="defaultStack"/>
<!--自定義攔截器-->
<interceptor-ref name="permissionCheckInterceptor"/>
</interceptor-stack>
</interceptors>
<action name="hi" class="com.tom.actions.HelloWorldAction">
<!--攔截器棧包含默認攔截器和自定義攔截器-->
<interceptor-ref name="permissionCheckInterceptorStack"/>
<result name="checkResult">/htmls/checkResult.jsp</result>
</action>
</package>
</struts>
2.定義默認攔截器
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="hellopkg" namespace="/hellons" extends="struts-default">
<!--定義包級別攔截器,供包內action引用-->
<interceptors>
<!--自定義攔截器-->
<interceptor name="permissionCheckInterceptor" class="com.tom.interceptors.PermissionCheckInterceptor"/>
<!--攔截器棧-->
<interceptor-stack name="permissionCheckInterceptorStack">
<!---攔截器內部只能引用其它的攔截器(<interceptor-ref name=... ),而不能使用定義攔截器(<interceptor name=... )-->
<!--默認攔截器-->
<interceptor-ref name="defaultStack"/>
<!--自定義攔截器-->
<interceptor-ref name="permissionCheckInterceptor"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="permissionCheckInterceptorStack"/>
<action name="hi" class="com.tom.actions.HelloWorldAction">
<!--不配置攔截器,則若是包內有default-interceptor-ref定義的攔截器,則使用之。default-interceptor-ref定義的攔截器必須包含defaultStack攔截器棧-->
<!--若是配置了攔截器,則default-interceptor-ref定義的攔截器不生效,defaultStack定義的攔截器也不生效-->
<result name="checkResult">/htmls/checkResult.jsp</result>
</action>
</package>
</struts>