Struts2的拦截器采用的是AOP的思想,但是有人说拦截器能完成的工作servlet的filter也能完成。其实,struts2的拦截器更能显示出软件复用的思想。 在struts2的配置文件struts.xml中,每个package都有一个默认的拦截器,在默认的情况下会引用此拦截器。如果我们需要采用自己定义的拦截器时必须先引用默认的拦截器,因为,自己定义的拦截器会覆盖默认的拦截器,如果不引用的话会出现错误,不如下面的代码片断先引用了默认的拦截器: <interceptor-ref name="defaultStack"/> <interceptor-ref name="authority"/>
多个拦截器可以组成一个拦截器链,拦截器链的使用就如同一个拦截器一样,这体现了复用的思想。 如果在某个package中的每个Action都需要调用同一个拦截器,则可以将此拦截器与默认的拦截器组合成一个拦截器链,方便调用,因为使用自己定义的拦截器可以覆盖默认的拦截器。
下面举一个简单的例子: 登陆的LoginAction package com.hopeteam.struts.actions;
import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionContext;
public class LoginAction implements Action{ private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String execute() throws Exception { if (getUsername().equals("fengzhizi") && getPassword().equals("123456")) { ActionContext.getContext().getSession().put("user", getUsername()); return SUCCESS; } else return ERROR; } }
权限拦截器 package com.hopeteam.struts.Interceptor;
import java.util.Map;
import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class AuthorityInterceptor extends AbstractInterceptor{ public String intercept(ActionInvocation invocation)throws Exception { ActionContext ctx = invocation.getInvocationContext(); Map session = ctx.getSession(); String user =(String)session.get("user"); if(user!=null && user.equals("fengzhizi")) { return invocation.invoke(); } ctx.put("tip", "您还没登陆,请输入正确的用户名和密码!"); return Action.LOGIN; } }
在struts.xml中的配置: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts> <package name="fengzhizi" extends="struts-default"> <interceptors> <interceptor name="authority" class="com.hopeteam.struts.Interceptor.AuthorityInterceptor"/> </interceptors> <global-results> <result name="login">/login.jsp</result> </global-results> <action name="Login" class="com.hopeteam.struts.actions.LoginAction"> <result name="error">/error.jsp</result> <result name="success">/welcome.jsp</result>
</action> <action name="interceptorAction">
<result>/WEB-INF/jsp/test.jsp</result> <!-- 拦截器一般配置在result元素之后! --> <interceptor-ref name="defaultStack"/> <interceptor-ref name="authority"/> </action> </package> </struts>
来看一下运行的效果图,这是没登陆之前,想访问“测试Struts2拦截器”
这是登陆以后的界面
这是访问“测试Struts2拦截器”的界面
附件:
|