分类: Java
2008-05-21 10:03:23
作为“框架(framework)”,可扩展性是不可或缺的。虽然,Struts 2为我们提供如此丰富的拦截器实现,但是这并不意味我们失去创建自定义拦截器的能力,恰恰相反,在Struts 2自定义拦截器是相当容易的一件事。
所有的Struts 2的拦截器都直接或间接实现接口com.opensymphony.xwork2.interceptor.Interceptor。该接口提供了三个方法:
1) void init(); 在该拦截器被初始化之后,在该拦截器执行拦截之前,系统回调该方法。对于每个拦截器而言,此方法只执行一次。
2) void destroy();该方法跟init()方法对应。在拦截器实例被销毁之前,系统将回调该方法。
3) String intercept(ActionInvocation invocation) throws Exception; 该方法是用户需要实现的拦截动作。该方法会返回一个字符串作为逻辑视图。
除此之外,继承类com.opensymphony.xwork2.interceptor.AbstractInterceptor是更简单的一种实现拦截器类的方式,因为此类提供了init()和destroy()方法的空实现,这样我们只需要实现intercept方法。
两个步骤:
l 通过
l 通过
使用自定义拦截器来完成用户权限的控制:当浏览者需要请求执行某个操作时,应用需要先检查浏览者是否登录,以及是否有足够的权限来执行该操作。
AuthorizationInterceptor.java
package org.qiujy.common; 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; } } } |
struts.xml:
DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" ""> <struts> <package name="my" extends="struts-default"> <interceptors> <interceptor name="authority" class="org.qiujy.common.AuthorizationInterceptor"/> interceptors> <global-results> <result name="login">/login.jspresult> global-results> <action name="listall" class="org.qiujy.web.struts2.action.UserAction" method="listAllUser"> <result name="success">/listall.jspresult> <interceptor-ref name="defaultStack"/> <interceptor-ref name="authority"/> action> <action name="userOpt" class="org.qiujy.web.struts2.action.UserAction"> <result name="success">/success.jspresult> action> package> struts> |
其它页面见源代码。
在浏览器地址栏直接输入 来访问,此动作配置了权限拦截器,所有被转到登录页面。
登录后:
再访问 这个链接:
如果为了简化struts.xml文件的配置,避免在每个Action重复配置该拦截器,可以将拦截器配置成了一个默认拦截器栈。如下:
DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" ""> <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> <result name="login">/login.jspresult> global-results> <action name="listall" class="org.qiujy.web.struts2.action.UserAction" method="listAllUser"> <result name="success">/listall.jspresult> action> package> <package name="font" extends="struts-default"> <action name="userOpt" class="org.qiujy.web.struts2.action.UserAction"> <result name="success">/success.jspresult> action> package> struts> |
一旦在某个包下定义了默认拦截器栈,在该包下的所有action都会使用此拦截器栈。对于那些不想使用些拦截器栈的action,则应该将它放置在其它的包下。