zoukankan      html  css  js  c++  java
  • 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>

  • 相关阅读:
    02-高阶函数 map filter sorted
    01-切片的赋值操作
    学习资料记录
    django_初级学习(1)
    git配置使用
    openpyxl操作表格(2)
    openpyxl模块操作excell表格(1)
    精简语法
    MySQL常见面试题
    02-图片转字符画
  • 原文地址:https://www.cnblogs.com/zhao307/p/5456586.html
Copyright © 2011-2022 走看看