拦截器

了解拦截器

Iterceptor,是struts2框架中一个非常重要的核心对象,可以动态增强Action

对象的功能

拦截器API

在struts2API中,存在一个名为com.opensymphony.xwork2.interceptor的包,该包中的对象是Struts2内置的一些拦截器对象,它们具有不同的功能。

Interceptor是struts2框架中定义的拦截器对象。它是一个接口,无论是struts2的内置拦截对象,还是自定义拦截器,都需要直接或间接实现此接口。

Interceptor的3个方法:

public interface interceptor extends Serializable{
      void destory();
      void init();
      String interceptor(ActionInvocation invocation) throws Exception();
}

init()初始化方法

interceptor()拦截器主要方法,执行Action请求处理方法以及Action前后进行一些操作,动态增强Action功能

destory()销毁方法

只有调用了interceptor()参数invocation的invoke()方法才可以执行Action对象中的请求处理方法。

实现interceptor的实现接口AbstractInterceptor可以更简单的创建拦截器对象,不需要实现init()和destory()方法了,因为AbstractInterceptor类已经对interceptor中的init()和destory()进行了实现

使用拦截器的流程

浏览器--http请求-->FilterDispatcher---create-->ActoinProxy--调用-->Interceptor系列--前处理--execute()-->Action--result--后处理interceptor系列-->ActionProxy-->浏览器页面

使用拦截器:(package要继承struts-default才能使用Struts2里面的拦截器,默认拦截器配置是在struts-default里面的)

timer计时拦截器:

public class TestAction extends ActionSupport{
  public String execute() throwa Exception{
     Thread.sleep(1000);
     return SUCCESS;
  }
}
<struts>
   <constant name="struts.deMode" value="true"/>
   <constant name="struts.configuration.xml.reload" value="true"/>
    <package name="myPackage" extends ="struts-default">
         <action name="testAction" class="com.action.TestAction">
              <interceptor-ref name="timer"/>
              <result>success.jsp</result>
         </action>
    </package>
</struts>
timer是struts2的内置拦截器所以不需要创建直接配置就可以了
读取Action执行时间的拦截器

token防重复提交拦截器

public class TokenAction extends ActionSupport{
     public static final List<String> NAMES=new ArrayList<String>();
     private String name;
     public String execute(){
         NAMES.add(name);
         return SUCCESS;
    }
     public void setName(String name){
        this.name=name;
    }
     public static List<String> getNAMES(){
       return NAMES;
    }
}

struts.xml
<action name="token" class="com.action.Token">
   <interceptor-ref name="token" />
   <interceptor-ref name="basicStack" />
   <result name="input ">/tokenInput.jsp</result>
   <result name="invalid.token">/tokenInvalid.jsp</result>
   <result>/success.jsp</result>
</action>
tokenInput.jsp
<s:form action="token">
     <s:token/>      <!--token标记-->
     <s:label value="避免重复输入"/>
     <s:textfield name="name" labe="请输入命名" />
     <s:submit  name="提交" />
</s:form>
tokenInvalid.jsp

  <body>
     输入无效。<br/>
     已输入的姓名:<s:property value="NAMES" /><br/>
     <a href="tokenInput.action">&lt;&lt;重新输入</a>
  </body>

 使用token拦截器必须在<s:from>中插入<s:token>标记

basicStack拦截器是基础的多个拦截器集合,配置它struts2才会向action内自动赋值

execAndWait执行等待拦截器

public class WaitAction extends ActionSupport{
    public String execute()throws Exception{
        Thread.sleep(10000);//沉睡10秒,模拟大数据量处理
        return SUCCESS;
    }

}
 <action name="wait" class="com.action.WaitAction">
            <interceptor-ref name="completeStack" />
            <interceptor-ref name="execAndWait" />
            <result>/WEB-INF/jsp/waitSuccess.jsp</result>
            <result name="wait">/WEB-INF/jsp/waiting.jsp</result>
  </action> 
  <body>
    页面提交(下载)中。。。请等待。。。
    <script language="JavaScript">
       setTimeout("location=location;",1000);//1s后刷新本页
    </script>
  </body>

自定义权限验证拦截器

        <interceptors>
          <interceptor name="authentication" class="com.interceptor.AuthenticationInterceptor">
          </interceptor>
        </interceptors>
        
        <action name="authentication" class="com.action.AuthenticationAction">
          <interceptor-ref name="authentication"></interceptor-ref>
          <result>/WEB-INF/jsp/authenticationSuccess.jsp</result>
        </action>

public class AuthenticationInterceptor extends ActionSupport {
    public String intercept(ActionInvocation invocation)throws Exception{
        
        Map<String,Object> sessionValues=invocation.getInvocationContext().getSession();//通过invocation获取上下文
        String account=(String) sessionValues.get("account");
        
        if(account==null){
            return Action.LOGIN;//返回登陆页面
        }
        return invocation.invoke();//正常执行,走向下一个拦截器或者Action
        
    }

}
原文地址:https://www.cnblogs.com/aigeileshei/p/5319086.html