浅谈Struts2的拦截器

拦截器:

      在谈拦截器之前,我觉得有必要提一下和过滤器的区别。

      1. 首先拦截器是Struts2自己的,只有用了Struts2框架才可以使用拦截器,而过滤器是servlet规范中的一部分,任何java web工程都可以使用;

           2. 其次拦截器只可以拦截Action,而过滤器理论上可以拦截任何东西(jsp,html,css,image或者js等)。

      拦截器配置(在Struts2.xml中进行):

 1 <package name="default" extends="struts-default">
 2            .......
 3 <!-- 首先得声明一个拦截器,名字随便,类名是你自己编写的拦截器类的路径 -->
 4     <interceptors>
 5             <interceptor name="priceInterceptor" class="interceptor.priceInterceptor"></interceptor>
 6      </interceptors>
 7            .......
 8 <!-- 然后在某一action中使用这个拦截器 -->
 9 <action name="updateBook" class="action.BookAction" method="update">
10 <!-- 不仅要调用自己定义的拦截器,系统默认的拦截器也需要手动调用 -->
11             <interceptor-ref name="defaultStack"></interceptor-ref>
12             <interceptor-ref name="priceInterceptor"></interceptor-ref>
13             <result name="success">/updateBook.jsp</result>
14             <result name="error">/updateBook.jsp</result>
15 </action>
16 </package>

 

当有请求Action时,拦截器链(存放的是一系列的拦截器)就会进行拦截,拦截的流程是这样:顺序执行拦截器,每到一个拦截器都会找到该拦截器对应的类,并实例化这个类,然后执行类中的intercept方法(这个方法里面存放的是拦截逻辑),如果通过了,就会执行下一个拦截器,直到通过整个拦截器链,最后才会执行action方法。

 1 return arg0.invoke(); 

上面这行代码就是 通过了当前的拦截器,去执行下一个拦截器的代码(在intercept方法中)。

这里提一下为什么要有下面这行代码:因为如果你自己不定义拦截器,他并不是没有拦截器了,还存在系统默认的拦截器,当你没有自己定义拦截器时,这些默认的拦截器会在你请求时自动调用,但是当你自己定义了拦截器,并且在某一个action中调用了这个拦截器,那么这个action并不会自动调用系统默认的拦截器,需要你手动调用。

 

1 <interceptor-ref name="defaultStack"></interceptor-ref>

 

下面是我的工程下默认的拦截器:(interceptor-ref 就是那些系统默认的拦截器,需要被调用)

 

 1 <interceptor-stack name="defaultStack">
 2                 <interceptor-ref name="exception"/>
 3                 <interceptor-ref name="alias"/>
 4                 <interceptor-ref name="servletConfig"/>
 5                 <interceptor-ref name="i18n"/>
 6                 <interceptor-ref name="prepare"/>
 7                 <interceptor-ref name="chain"/>
 8                 <interceptor-ref name="scopedModelDriven"/>
 9                 <interceptor-ref name="modelDriven"/>
10                 <interceptor-ref name="fileUpload"/>
11                 <interceptor-ref name="checkbox"/>
12                 <interceptor-ref name="multiselect"/>
13                 <interceptor-ref name="staticParams"/>
14                 <interceptor-ref name="actionMappingParams"/>
15                 <interceptor-ref name="params">
16                   <param name="excludeParams">dojo\..*,^struts\..*</param>
17                 </interceptor-ref>
18                 <interceptor-ref name="conversionError"/>
19                 <interceptor-ref name="validation">
20                     <param name="excludeMethods">input,back,cancel,browse</param>
21                 </interceptor-ref>
22                 <interceptor-ref name="workflow">
23                     <param name="excludeMethods">input,back,cancel,browse</param>
24                 </interceptor-ref>
25                 <interceptor-ref name="debugging"/>
26             </interceptor-stack>

 

        好,拦截器的配置讲完了,下面来看看拦截器的3种创建方式:(可能这部分提到拦截器的配置前面讲更好)

        这里的3种创建方式也就是3中编写拦截器对应类的方法。

       1. 实现拦截器接口 Interceptor

    该接口中有3个方法init,intercept,destory,我们只需要把我们的拦截逻辑写进intercept中去就行了;

  2.继承抽象类 AbstractInterceptor

    我们只需要重写intercept就行了,因为AbstractInterceptor帮我们实现了Interceptor接口中的init()、destory()方法;

  3.继承抽象类MethodFilterInterceptor

    我们需要重写doIntercept方法,这种是我们常用的方式(推荐大家也用这种方式来创建),因为这种创建方式有个很大的优点,就是可以指定action中拦截的方法(通俗的讲就是该拦截的拦截,不该拦截的不拦截),下面举个例子:

 

 1 <action name="updateBook" class="action.BookAction" method="update">
 2         <interceptor-ref name="defaultStack"></interceptor-ref>
 3         <interceptor-ref name="priceInterceptor">
 4             <!-- 在这里加上不拦截的方法 -->
 5             <param name="这个随意1">方法名1</param>
 6             <param name="这个随意2">方法名2</param>
 7          </interceptor-ref>
 8          <result name="success">/updateBook.jsp</result>
 9          <result name="error">/updateBook.jsp</result>
10 </action>

 

 

拦截器的配置与创建都讲完了,希望对你有所帮助!

 

 

 

转载于:https://www.cnblogs.com/baikaizhuliangshui/p/11622111.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值