interceptor 顾名思义:拦截器;
interceptor也是struts除了action外的一大特点,今天做SSH应用涉及到权限控制,初用interceptor感觉十分方便,且功能强大.
要实现struts拦截器;要继承AbstractInterceptor
内部有三个 方法 init()初始化方法;destory()销毁方法;
还有就是intercept(ActionInvocation invocation);我们拦截后要进行的操作,例如校验用户权限,就重写在这个方法里面。
例如的WEB应用,校验是否为登录用户:
package interceptor;
import java.util.Map;
import object.Admin;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
@SuppressWarnings("serial")
public class AdminInterceptor extends AbstractInterceptor {
@SuppressWarnings("rawtypes")
@Override
public String intercept(ActionInvocation invocation) throws Exception {
ActionContext ctx = invocation.getInvocationContext();
Map session = ctx.getSession();
// 取出名为user的session属性
Admin admin = (Admin) session.get("ADMIN");
// 如果没有登陆,返回重新登陆
if (admin != null) {
return invocation.invoke();
} else {
ctx.getSession().put("tip", "请先登录系统!");
return "login";
}
}
}
拦截器的类实现了,接下来要做的就是 将其配置到 struts.xml的action中
个action添加拦截器前,需要声明:
<interceptors>
<interceptor name="AdminInterceptor" class="interceptor.AdminInterceptor" />
</interceptor>
注意拦截器的声明值只在相同的package生效的;
所以要想使用此拦截器 那么对应的action应与它处于同一包下;
对于用户登录校验,因结果都是一样 我们可以声明全局结果:
<!-- 定义全局结果 -->
<global-results>
<result name="login" type="redirect">login.jsp</result>
</global-results>
我们也可以封装拦截器栈:拦截器栈 是多个拦截器按一定顺序封装在一起;合作达到某种需求。
<interceptors>
<interceptor name="AdminInterceptor" class="interceptor.AdminInterceptor" />
<interceptor-stack name="mydefault">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="AdminInterceptor"></interceptor-ref>
</interceptor-stack>
</interceptors>
我们也可以为同一package下的action指定默认的拦截器:
<default-interceptor-ref name="mydefault"></default-interceptor-ref>
下面给我 我对账户增删改差操作前进行用户是否登陆的拦截器配置:
<package name="adminaction" extends="struts-default">
<interceptors>
<interceptor name="AdminInterceptor" class="interceptor.AdminInterceptor" />
<interceptor-stack name="mydefault">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="AdminInterceptor"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="mydefault"></default-interceptor-ref>
<!-- 定义全局结果 -->
<global-results>
<result name="login" type="redirect">login.jsp</result>
</global-results>
<action name="loginAction" class="adminaction.LoginAction">
<result name="success">index.jsp</result>
<result name="error">login.jsp</result>
<result name="input">login.jsp</result>
<result name="none">login.jsp</result>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
<action name="addAction" class="adminaction.AdminAddAction">
<result name="success">upDataStudentListAction</result>
<result name="error">addAdmin.jsp</result>
<result name="input">addAdmin.jsp</result>
</action>
<action name="deleteAction" class="adminaction.AdminDeleteAction">
<result name="success" type="redirectAction">exitAction</result>
<result name="error">deleteAdmin.jsp</result>
<result name="input">deleteAdmin.jsp</result>
</action>
<action name="repasswordAction" class="adminaction.AdminRepasswordAction">
<result name="success">upDataStudentListAction</result>
<result name="error">AdminRepassword.jsp</result>
<result name="input">AdminRepassword.jsp</result>
</action>
<action name="exitAction" class="adminaction.ExitAction">
<!-- 定义处理结果字符串和资源之间的映射关系 -->
<result name="success" type="redirect">login.jsp</result>
</action>
</package>
注:因为登录操作 不需要校验用户权限:所以 在loginAction 里面添加系统默认拦截器,这样就覆盖掉package的拦截器。防止登录失效。