首页 > 代码库 > Struts2自定义拦截器

Struts2自定义拦截器

作者:禅楼望月

尽管Struts2已经内置了很多的拦截器,但是有时这些拦截器可能不能满足我们的需求,这时我们就必须自定义我们自己的拦截器。

如果我们要创建自己的拦截器,则必须实现com.opensymphony.xwork2.interceptor.Interceptor接口。

import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.Interceptor;public class MyInterceptor implements Interceptor {    @Override    public void destroy() {        // 在拦截器实例销毁之前被调用,主要用于销毁在 init() 中打开的资源    }    @Override    public void init() {        /* 拦截器实例化之后,拦截器执行拦截之前,系统将回调该方法。对于每个拦截器,        该方法只被执行一次,和Servlet的init方法一样。因此方法主要用于初始化性资源。*/    }    @Override    public String intercept(ActionInvocation invocation) throws Exception {        /* 这里执行拦截动作,和Action的execute方法一样,该方法返回一个字符串,作为         * 逻辑视图。如果该方法直接返回了一个字符串,系统则直接跳到该字符串所对应的页面,         * 而不会调用被拦截的Action,该方法的参数invocation包含了被拦截的Action         * 的引用,可以通过调用该参数的invoke方法,将控制权转给下一个拦截器,或者转给Action的execute方法*/        return null;    }}

如果我们的拦截器不需要打开资源则可以使用com.opensymphony.xwork2.interceptor.AbstractInterceptor类,该类为我们实现了init()和destroy()方法,我们只需要实现intercept方法即可。

如,实现这样一个拦截器:登陆的时候验证用户名如果为“毛爷爷”,则转到错误页面,否则为请求添加一个日期的属性:

import java.util.Date;import javax.servlet.http.HttpServletRequest;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;import com.stbc.web.Action.LoginAction;public class InterceptorHello extends AbstractInterceptor {    private static final long serialVersionUID = -5407269431454126006L;        private String name;    public void setName(String name) {        this.name = name;    }    @Override    public String intercept(ActionInvocation invocation) throws Exception {        HttpServletRequest request=ServletActionContext.getRequest();        if(request.getParameter("username").equals("毛爷爷")){            return "error";        }else {            request.setAttribute("datetime", new Date());            LoginAction action=(LoginAction) invocation.getAction();            return action.execute();        }            }}
实用的方法和使用内置拦截器的方法一样:
<package name="loginPackage" extends="struts-default"  namespace="/login">    <interceptors>        <interceptor name="interceptormaoyeye" class="test.InterceptorHello">            <param name="name">你好!</param>        </interceptor>    </interceptors>    <action name="login" class="com.stbc.web.Action.LoginAction">        <result name="success">welcome.jsp</result>        <result name="error">welcome.jsp</result>        <interceptor-ref name="interceptormaoyeye">            <!-- 这里使用了反射的方法,实际上调用的是拦截器类的setName方法 -->            <param name="name">覆盖了默认值</param>        </interceptor-ref>    </action></package>

欢迎转载,请注明出处.

Struts2自定义拦截器