Take a look at GW

【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

 

posted @ 2017-08-10 23:51  HDWK  阅读(269)  评论(0编辑  收藏  举报