zoukankan      html  css  js  c++  java
  • 【Struts2】自定义拦截器interceptors

    下面给一张图片表示Struts2拦截器的处理流程。

    通过这个流程图,我们可以看出一个完整的请求大概的过程为:

     请求 -->filter 控制器 --> 拦截器 1/ 拦截器 2-->Action-->Result--> 拦截器 2/ 拦截器 1--> 响应输出 

    可以清楚地看出,当请求到服务器的时候首先会经过拦截器,然后当响应到用户界面的时候又会经过拦截器。

    下面我们来实现一个自定义的拦截器

    1.  编写拦截器实现类

    实现 Interceptor 接口(或者继承 AbstractInterceptor )

    如:

    MyInterceptor.java 文

    package cn.test.interceptor;
    
    import java.util.Map;
    
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionInvocation;
    import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
    
    public class MyInterceptor extends AbstractInterceptor{
    
        //如果下面逻辑执行了invoke方法,返回值无效;如果没有执行invoke方法返回String作为result标识符
        public String intercept(ActionInvocation ai) throws Exception {
            System.out.println("在Action之前调用");
            //登录检查
            Map<String,Object> session = 
                ActionContext.getContext().getSession();
            String username = (String)session.get("user");
            if(username!=null){//登录的用户
                ai.invoke();//调用后续拦截器或Action+Result
                System.out.println("在Result之后调用");
                return null;
            }else{//未登录
                return "login";//找<result name="login">
            }
    
        }
    
    }
    MyInterceptor.java


    2.  在 struts.xml 中配置拦截器

    <interceptors>
    <interceptor name="myinter" class="cn.test.interceptor.MyInterceptor"/>
    </interceptors>

    3.  使用拦截器
    只需要在action对拦截器进行引用即可:

    <interceptor-ref name="myinter"/>

    一旦使用了自定义的拦截器,那么struts2框架就不会去加载默认的拦截器了,因此有些功能会受损,这时候需要再次引用默认拦截器:

    <interceptor-ref name="defaultStack"/>

    比如下面的struts.xml案例:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
        "http://struts.apache.org/dtds/struts-2.1.7.dtd">
    
    <struts>
        
        <package name="demo" extends="struts-default" namespace="/">
        
            <interceptors>
                <interceptor name="myinter" class="cn.test.interceptor.MyInterceptor"/>
            </interceptors>
        
        <!--这里把result提升到全局是为了,插件也能够调用-->
           <global-results>
                <result name="login" type="redirectAction">
                    <!--跳转到/tologin-->
                    <param name="actionName">tologin</param>
                    <param name="namespace">/</param>
                </result>
            </global-results>
    
           <action name="delete" class="deleteAction">
                 <!--显示调用自定义的过滤器和默认的过滤器-->
                 <interceptor-ref name="myinter"/>
                 <interceptor-ref name="defaultStack"/>
                
                 <result name="success" type="redirectAction">
                     <param name="actionName">list</param>
                     <param name="namespace">/</param>
                 </result>
                <result name="error" type="dispatcher">/WEB-INF/error.jsp</result>
            </action>
            
    
        </package>
    </struts>
    struts.xml
  • 相关阅读:
    深度系统安装wine
    Android应用真正的入口在哪里?
    推荐系统算法概览
    Android面试题:Scrollview内嵌一个Button他的事件消费是怎样的?Move,Down,Up分别被哪个组件消费?
    Java面试题:多线程交替打印字符串
    EventBus使用初体验
    Andoird面试题:A活动启动B活动,他们的生命周期各是怎么样的?
    Android在开发过程中如何选择compileSdkVersion,minSdkVersion和targetSdkVersion
    华为2020暑期实习面经(已拿Offer)
    工商银行软件开发中心2020暑期实习面经(已拿Offer)
  • 原文地址:https://www.cnblogs.com/HDK2016/p/7342351.html
Copyright © 2011-2022 走看看