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 >