struts2拦截器总结

以下是struts2拦截器的内容:
Struts2运转流程图:
10.jpg

其实拦截器Interceptors是struts2的最核心的内容,拦截器支撑起了struts2整个的运转流程。
要想理解拦截器,首先要理解过滤器。两个差不太多。

拦截器的作用:拦截用户的请求,对请求进行一些预处理,当请求完毕之后,又可以对请求进行后续的处理,对相应进行后续的处理。作用和过滤器很类似。

创建一个拦截器要是吸纳Interceptor接口。实现里面的三个方法:init()、intercept()、destroy()
Init():初始化方法;
Intercept():拦截逻辑处理方法
destroy():释放资源。
这三个方法和过滤器里面的方法很类似,作用也很类似。

在拦截器里面处理业务逻辑的是Intercept()方法,处理完之后还需要往后走,调用的是ActionInvocation类里面的invoke()方法,这个方法就和过滤器里面的change.doFilter()方法,就是让后续的被执行的action接着去执行。同时也可以配置多个拦截器,如果有多个拦截器的话invoke()方法就会调用下一个拦截器。反正就是让程序继续往下走。

申明拦截器:在struts.xml里面申明interceptor元素。

在tomcat服务器一起来的时候拦截器就被加载了,已经调用了拦截器的init()方法。

拦截器执行流程:
1、先执行inteceptor的intercept()方法;
2、在intercept()里面执行ActionInvocation.invoke()方法,继续往下走,执行action里面的execute()方法,如果执行成功了返回success;
3、execute()方法返回成功success回到inteceptor的intercept()方法,把这个结果返回到action配置的result里面去匹配,回到结果页面。

注意:在默认情况下如果我们在某个action的配置里面没有申明任何拦截器,那么struts2会自动为我们配置一个默认的拦截器defaultStack,而如果我们自己定义了拦截器,并且为某个action配置上了,那么struts2就不会再为这个action配置默认的拦截器,那个默认的拦截器就不会起作用了,只执行我们自定义的拦截器。而这种情况下我们除了使用自定义的拦截器外还必须使用struts2为我们提供的那个默认的拦截器defaultStack(要不然结果参数无法带回到页面上)。所以我们在申明了自定义的拦截器的同时,还要加上struts2为我们提供的默认的拦截器defaultStack,而且配置的时候必须把我们自定义的拦截器配置到上面,最后跟上struts2为我们默认提供的拦截器defaultStack。

实现拦截器的三个步骤:
1、定义一个类,让这个类实现Interceptor这个接口。
2、在struts.xml里面申明这个拦截器。申明不代表使用。
3、在action的配置里面引用拦截器,这才是真正的使用。

具体为interceptor配置参数的示例在拦截器的实例代码里面有标注。

但是如果我们通过事先Interceptor接口来完成拦截器类,那么我们必须得实现这个接口里面的三个方法init()、intercept()、destroy(),其中init()和destroy()方法我们基本上用不到,那么怎么办呢,struts2为我们考虑到了这点,struts2为我们又提供了一个AbstractInterceptor抽象类,这个类实现了Interceptor接口。我们只要在类里面继承这个类就能完成拦截器,而这个类里面的init()和destroy()方法它都给空实现了,intercept()方法定义为抽象方法让我们自己去实现,我们的目的达到了。

拦截器的配置顺序和请求执行的流程是这样的:
首先请求会经过在这个action里面配置的拦截器,拦截器执行顺序是按照拦截器的配置顺序执行,请求先经过第一个拦截器,执行完之后这个拦截器将请求交给第二个拦截器,最后经过struts2提供的默认拦截器,所有拦截器执行完之后请求才会来到action里面去执行execute()方法。Execute()方法执行完之后响应又会按照相反的顺序回到拦截器栈里面去,响应先经过struts2提供的默认的拦截器,然后按照想法顺序一个个经过自定义的拦截器,最后回到成功页面。

下面是过滤器的工作流程,拦截器的工作流程和这个基本相同:
77.jpg
接下来遇到的问题是,如果我们在某个action里面配置了两个拦截器,那么这个action里面的所有方法都会被这些拦截器拦截,但有的时候我们希望我们的action里面的某些方法不被拦截器拦截。所以我们需要通过一些手段让拦截器去拦截我们想让它拦截的方法。前者称为针对类的拦截器,后者称为针对方法的拦截器。

对于针对方法的拦截器struts2又为我们提供了一个抽象类MethodFilterInterceptor,这个抽象类继承了AbstractInterceptor父类,如果我们想要编写针对方法的拦截器的话,继承MethodFilterInterceptor抽象类即可。我们的子类去重写此抽象类里面的doIntercept()方法去实现自己的逻辑。配置需要进行拦截和不拦截方法的配置方式见实例里面。

另外:也可以自定义拦截器栈interceptor-stack,一个拦截器栈里面可以包含多个拦截器,当引用的时候应用这一个拦截器栈就相当于应用了它所包含的所有拦截器。

默认的拦截器栈default-interceptor-ref需要配置在struts.xml里面interceptors下面,执行的时候即使不显示的去应用这些拦截器,它们也会自动执行(默认拦截器栈都是自动执行,不需要引用)

Strtus.xml配置文件里面有一种全局结果global-results,指的是项目里的每一个action都可以使用的结果,这就叫做全局结果。在配置的时候global-results下面的result节点里面有一个type属性,这个属性可选的有两个值,dispatcher和redirect,其中dispatcher表示请求转发的方式,redirect表示重定向的方式。

拦截器的使用场合:权限验证


对于请求转发用户提交完表单之后只要一刷新浏览器表单都会重新提交一次;而对于重定向,用户提交完表单之后再刷新浏览器表单就不会重复提交,因为重定向已经定向到结果页面了,刷新也是刷新结果页面。因此对于开发来说,防止表单重复提交有两种方式:1、使用重定向;2、使用token(令牌机制),

重点见附件实例:Struts2Interceptor.zip

你可能感兴趣的:(struts)