• 拦截器


    了解拦截器

    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
            
        }
    
    }
  • 相关阅读:
    Jboss下jaxws的开发
    Jboss as 服务器基本设置
    classloader常见问题总结
    Servlet容器 Jetty
    Jetty 的工作原理以及与 Tomcat 的比较
    resin设置jvm参数
    Solr4.0使用
    Solr 4.0部署
    Solr 搜索功能使用
    HttpSolrServer 实例管理参考,来自org.eclipse.smila.solr
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/5319086.html
Copyright © 2020-2023  润新知