Struts2(Interceptor篇):拦截器的实现原理以及代码示例

版权声明:本博客所有内容采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可 https://blog.csdn.net/Soinice/article/details/83341457

目录

Interceptor 简介

理解 Interceptor 概念

理解 Interceptor 原理

创建 Interceptor 监听器

在pom.xml加入相关依赖

自定义 Interceptor

自定义一个实现了Interceptor接口的类,或者继承抽象类AbstractInterceptor。

在配置文件中注册定义的拦截器。

过滤器(Filter)与拦截器(Interceptor)的区别

源码下载

Interceptor 简介

理解 Interceptor 概念

java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式。在AOP中,拦截器用于在某个方法或者字段被访问之前,进行拦截然后再之前或者之后加入某些操作。

目前,我们需要掌握的主要是Spring的拦截器,Struts2的拦截器不用深究,知道即可,本文仅作参考。

理解 Interceptor 原理

大部分时候,拦截器方法都是通过代理的方式来调用的。Struts2的拦截器实现相对简单。当请求到达Struts2的ServletDispatcher时,Struts2会查找配置文件,并根据配置实例化相对的拦截器对象,然后串成一个列表(List),最后一个一个的调用列表中的拦截器。Struts2的拦截器是可插拔的(也就是需要的时候装上去,不需要的时候可以拿下来,其实就是低耦合),拦截器是AOP的一个实现。Struts2拦截器栈就是将拦截器按一定的顺序连接成一条链。在访问被拦截的方法或者字段时,Struts2拦截器链中的拦截器就会按照之前定义的顺序进行调用。

创建 Interceptor 监听器

本例子使用maven 管理jar包

在pom.xml加入相关依赖

自定义 Interceptor

自定义一个实现了Interceptor接口的类,或者继承抽象类AbstractInterceptor。

1)创建一个InterceptorDemoOne实现Interceptor,注意是 xwork2.interceptor中的interceptor。

在Interceptor接口中,提供了 3 个方法供咱们使用,分别为init()、destroy()和intercept(),由于AbstractInterceptor实现了Interceptor接口,因此咱们就可以直接继承AbstractInterceptor,然后复写方法就可以啦!至于为什么继承AbstractInterceptor而不是直接实现Interceptor接口,是因为AbstractInterceptor已经帮咱们实现了空的init()和destroy()方法,不需要咱们自己去复写了,咱们直接复写intercept()方法就可以啦!现在,咱们大致了解一下这 3 个方法的作用:

  • init()方法,一般用来进行初始化操作;
  • destroy()方法,一般用来进行释放资源的操作;
  • intercept()方法,该方法是实现拦截功能的主要方法,咱们就在该方法中编写拦截的逻辑。

2)创建一个InterceptorDemoTwo继承抽象类AbstractInterceptor,注意是 xwork2.interceptor中的interceptor。

大多数采用这一种。

在配置文件中注册定义的拦截器。

在struts.xml中配置拦截器

在需要使用Action中引用上述定义的拦截器,为了方便也可以将拦截器定义为默认的拦截器,这样在不加特殊说明的情况下,所有的
Action都被这个拦截器拦截。

全局拦截与Action拦截,区别就在于配置文件,Action代码没任何区别。

struts.xml关于拦截器和全局结果集代码:

过滤器(Filter)与拦截器(Interceptor)的区别

过滤器可以简单的理解为“取你所想取”,过滤器关注的是web请求;

拦截器可以简单的理解为“拒你所想拒”,拦截器关注的是方法调用,比如拦截敏感词汇,拦截登录等。

  1. 拦截器是基于java反射机制来实现的,而过滤器是基于函数回调来实现的。(有人说,拦截器是基于动态代理来实现的)
  2. 拦截器不依赖servlet容器,过滤器依赖于servlet容器。
  3. 拦截器只对Action起作用,过滤器可以对所有请求起作用。
  4. 拦截器可以访问Action上下文和值栈中的对象,过滤器不能。
  5. 在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时调用一次。

源码下载

[相关示例完整代码]请获取 相关分支哦:feature-20180910-web 

猜你喜欢

转载自blog.csdn.net/Soinice/article/details/83341457
今日推荐