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>