Struts2自定义拦截器

前面已经转载过一份关于Struts2拦截器的详细分析,这里就不写的那么清楚了,简单的写一个Struts2 对session的拦截器。

首先 明确一下我们的页面流程:

  userLogout.action 当我们执行这个操作的时候,应该进入退出界面。

  http://localhost:8080/OA/userLogout.action

  

问题在于,如果我们没有登录,或者说session过期了。我们还能进入这个页面吗?显然是不应该进入的,应该跳转到登录界面。如果是一个action我们可以在action里面进行对session的获取和相应参数的判断,但是多个action都重复这一个过程就有些臃肿了,我们可以用struts2的拦截器来实现这个过程。

1:我们先定义一个拦截器:

   我们看到的ActionContext以及Map类型的session,只是Struts2获取servlet支持的一种方式,还可以用继承Aware接口的方式。这个就不再深究了。invocation的invoke方法是有拦截器就接着往下执行,没有就执行真正的action。最后return Action.LOGIN就跟我们经常用的return SUCCESS一样,都是父类给定义好的,我们直接用而已。

package com.oa.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;

/**
 * 
 * @author: zhao
 * @time: 2016年5月3日
 * 
 * @description:Struts2拦截器,判断当前用户是否在线,即在session中是否有记录,session默认不工作十分钟便销毁
 */
public class SessionInterceptor extends AbstractInterceptor{

    private static final long serialVersionUID = 1L;

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        ActionContext context=invocation.getInvocationContext();
        Map<String, Object> session=context.getSession();
        String id=(String) session.get("id");
        if(id!=null&&!"".equals(id)){
            return invocation.invoke();
        }
        return Action.LOGIN;
    }

}

2:struts.xml

 我们定义了把自己写好的拦截器类在下面定义好了,名字是sessionInterceptor,又定义了一个拦截器栈,把我们的自己写的拦截器和系统默认的拦截器都写在了一起。这是因为当我们使用了自定义拦截器时,默认拦截器就不起作用了,所以必须必须把默认拦截器显式的写在下面。

    <package name="default" extends="struts-default">
        <interceptors>
            <interceptor name="sessionInterceptor" class="com.oa.interceptor.SessionInterceptor"></interceptor>
            <interceptor-stack name="systemStack">
                <interceptor-ref name="defaultStack"/>
                <interceptor-ref name="sessionInterceptor"/>
            </interceptor-stack>
        </interceptors>
    </package>

3:strtus_system.xml

 我把这个文件的内容进行了删减,留下来最直观的东西。有一个全局的结果,name是login,这个和上面自定义拦截器中的Action.Login是对应的。现在我们的userLogoutAction用的是默认的拦截器栈,所以才会出现最上面那种直接进入退出界面的结果,这显然是不对的。

    <package name="system" extends="default">
        <global-results>
            <result name="login">/WEB-INF/content/home.jsp</result>
        </global-results>
        <action name="userLogout" class="com.oa.action.UserLogoutAction">
            <interceptor-ref name="defaultStack" />
            <result>/WEB-INF/content/exit.jsp</result>
        </action>
    </package>

4:修改struts_system.xml

 把拦截器引用改成我们写好的拦截器栈就好了,这个拦截器栈中有默认的拦截器,所以不用担心别的界面不能中英文切换的问题。现在再执行一次看看效果

        <action name="userLogout" class="com.oa.action.UserLogoutAction">
            <interceptor-ref name="systemStack" />
            <result>/WEB-INF/content/exit.jsp</result>
        </action>

原文地址:https://www.cnblogs.com/zhao307/p/5456586.html