要自定义拦截器需要实现com.opensymphony.xwork2.interceptor.Interceptor接口:
public class PermissionInterceptor implements Interceptor {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void init() {
// TODO Auto-generated method stub
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// TODO Auto-generated method stub
Object user = ActionContext.getContext().getSession().get("user");
if(user!=null) //如果user不为null,表示用户已经登录
return invocation.invoke(); //调用这个方法 那么被拦截到的action就会执行
ActionContext.getContext().put("message", "你没有权限");
return "message";
}
}
在配置文件struts.xml中
<package name="itcast" namespace="/test" extends="struts-default">
<!-- 自定义拦截器 -->
<interceptors>
<interceptor name="permission" class="cn.itcast.interceptor.PermissionInterceptor"></interceptor>
<!-- 拦截器栈,由一个或多个拦截器组成 -->
<interceptor-stack name="permissionStack">
<!-- struts2给我们提供的核心功能,原有的拦截器栈 ,系统的拦截器必须放在第一位,先执行-->
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="permission"></interceptor-ref>
</interceptor-stack>
</interceptors>
<action name="list_*" class="cn.itcast.action.HelloWorldAction" method="{1}">
<result name="success">/WEB-INF/page/message.jsp</result>
<interceptor-ref name="permissionStack"></interceptor-ref>
</action>
</package>
因为struts2中如文件上传,数据验证,封装请求参数到action等功能都是由系统默认的defaultStack中的拦截器实现的,所以我们可以在定义的拦截器时用拦截器栈来包含系统默认的defaultStack,这样应用才可以使用struts2框架提供的众多功能。
如果希望包下的所有action都使用自定义的拦截器,可以通过把拦截器定义为默认拦截器。
注意:每个包只能指定一个默认拦截器,另外,一旦我们为该包中的某个action显示指定了某个拦截器,则默认拦截器不会起作用