拦截器

作者: _FireFly_ | 来源:发表于2020-12-10 17:28 被阅读0次

struts框架内部请求-响应过程:

aop 面向切面编程 aop特点: 可以动态的增减功能,不需要改变其他功能 源代码。
aop相关对象
起始对象: 动作发起者,类比浏览器
目标对象: 动作的完成者(业务程序,action/service/dao)
切面对象: 在目标之前或之后完成一些功能
分类:

  1. 前置切面。 目标之前执行
  2. 后置切面。 目标之后执行
  3. 环绕切面。 基于责任链模式的切面。
  • 代理对象: 负责调用切面和目标。 n个起始对象只需要调用代理接口。
  • 链对象 : 体现责任链模式。 允许一个切面对象一部分代码在目标前执行,一部分代码在目标之后执行
    代理负责调用链,链中包含了所需要执行的切面和目标
struts中的拦截器就是切面,还是环绕切面。

在Struts中Action对象就是目标对象
ActionMapping对象,记录 <action>配置匹配对应的Action类对象,有mapping对象,可就表示有请求映射。

  • ActionProxy对象为代理对象 (代理action目标) 包含(链对象)
  • ActionInvocation对象为链对象。包含 (interceptor,result-type,action)
    Struts拦截器内部执行流程:
  • struts根据请求与<action>配置匹配,创建ActionMapping对象,然后根据ActionMapping 创建Actionproxy代理对象,在创建代理对象Actionproxy的内部,创建了ActionInvocation链对象
    在创建链对象ActionInvocation时,将默认19拦截器对象,目标action对象,result-type对象装入链对象,执行proxy (目的是为了执行目标)
  1. 首先会按照默认拦截器栈的配置顺序先执行每一个切面,再执行目标action
  2. 获得action处理方法返回值
  3. 根据返回值找到对应的reuslt-type对象完成响应

自定义拦截器

1. 拦截器定义与应用:

  • 自定义拦截器类 implements Interceptor接口 或 extends AbstractInterceptor父类
  • 重写intercept(ActionInvocation)
  • struts处理请求时会调用该方法开始拦截器功能
  • ActionInvocation链对象,包含了其他的拦截器和目标action对象,如果需要可以使用
  • actionInvocation.invoke(); //调用下一个拦截器或目标对象
public class MyInterceptor1 extends AbstractInterceptor {
    private int a ;
    public void setA(int a) {
        this.a = a;
    }

    @Override
    public String intercept(ActionInvocation actionInvocation) throws Exception {
        System.out.println("hello  bye");
        String r = actionInvocation.invoke(); //调用下一个拦截器或目标对象
        System.out.println("----------->>"+a);
        return r ;
    }
}

2. 在struts.xml文件的<package>中声明拦截器(IOC 控制反转)

  • 告诉struts框架,除了你默认的那小40个拦截器,现在多了n个
<interceptors>
    <interceptor name="m1" class="com.util.MyInterceptor1" />
</interceptors>
  • 在指定的<action>映射中,使用子标签<interceptor-ref>表示此次请求处理执行该拦截器
<action name="test1" class="com.action.TestAction1" method="t1">
    <interceptor-ref name="m1" />
</action>
注意:一旦引用了自定义拦截器。默认拦截器将不再自动执行。可以手动引入

拦截器栈配置

  • 在struts.xml文件的<package>中声明拦截器栈
<interceptors>
   <interceptor name="m1" class="com.util.MyInterceptor1" />           
   <interceptor-stack name="myStack" >
         <interceptor-ref name="m1" />
         <interceptor-ref name="defaultStack" />
   </interceptor-stack>
 </interceptors>
  • 在action的配置中引用拦截器栈
<action name="test3" class="com.action.TestAction1" method="t3">
    <interceptor-ref name="myStack" />
</action>
  1. 默认拦截器引用
  • 不需要在<action>中引用拦截器,每次请求都会自动执行
  • 在struts.xml文件的<package>中声明默认拦截器引用
    <default-interceptor-ref name="myStack" />
  1. 拦截器初始化参数
  • 在拦截器声明时或拦截器引用时,使用<param>子标签指定初始化参数
<interceptor name="m1" class="com.util.MyInterceptor1" >
    <param name="a">100</param>
</interceptor>
  • 在拦截器类中定义与参数同名的属性,并实现set方法。
  1. 方法拦截器
  • 通过传递初始化参数,可以指定那些方法拦截,哪些方法不拦截

  • 首先拦截器会根据引用配置

  • 在某次action请求时被调用

  • 方法拦截器在匹配action的同时,还需要匹配方法。

  • 自定义拦截器类 extends MethodFilterInterceptor父类

  • 在重写的方法中只需要写拦截的处理操作即可,不用考虑不拦截问题。

  • 在声明拦截器时,为其(父类)传参,指定可以处理的方法或不可以处理的方法。

<interceptor name="m2" class="com.util.MyInterceptor2" >
    <param name="excludeMethods">t2,t4,t5</param>
</interceptor>
<?xml version="1.0"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>

    <constant name="struts.action.extension" value="action,,do" />
    <constant name="struts.configuration.xml.reload" value="true" />

   <package name="dmc" extends="json-default" namespace="/">

       <interceptors>
           <interceptor name="m1" class="com.util.MyInterceptor1" >
               <param name="a">100</param>
           </interceptor>
           <interceptor name="m2" class="com.util.MyInterceptor2" >
                <param name="excludeMethods">t2,t4,t5</param>
           </interceptor>
           
           <interceptor-stack name="myStack" >
               <interceptor-ref name="defaultStack" />
               <interceptor-ref name="m1" >
                   <param name="b">200</param>
               </interceptor-ref>
               <interceptor-ref name="m2" />
           </interceptor-stack>
       </interceptors>

       <default-interceptor-ref name="myStack" />

       <action name="test1" class="com.action.TestAction1" method="t1">
            <interceptor-ref name="defaultStack" />
           <interceptor-ref name="m1" />
       </action>

       <action name="test2" class="com.action.TestAction1" method="t2"></action>

       <action name="test3" class="com.action.TestAction1" method="t3">
           <interceptor-ref name="myStack" />
       </action>


   </package>
</struts>

相关文章

网友评论

      本文标题:拦截器

      本文链接:https://www.haomeiwen.com/subject/cvvlgktx.html