一.struts2拦截器概述
1.struts2是框架,封装了很多功能,struts2里面封装的功能都是在拦截器里面2.struts2里面封装了很多功能,有很多拦截器,不是每次这些拦截器都执行,每次执行默认拦截器
3.struts2里面默认的拦截器位置
4.拦截器在什么时候执行?![]()
a.在action对象创建之后,在action的方法执行之前。
二.拦截器底层原理
1.拦截器底层使用的两个原理
AOP思想a.AOP是面向切面编程,有基本功能,扩展功能,不通过修改源代码的方式来扩展功能。
责任链模式
a.在Java中有许多的设计模式,责任链就是其中的一种
b.责任链模式和过滤链很相似
i.过滤链:
一个请求可以有多个过滤器进行过滤,每个过滤器只有做放行才能到下一个过滤器。ii.责任链:
要执行多个操作,有添加、修改、删除三个操作。每次执行操作后都要做一个类似放行的操作。2.AOP思想和责任链模式如何应用到拦截器里面?
- 拦截器在action对象创建之后,action方法执行之前,执行拦截器。
- 在action方法执行之前执行默认拦截器,执行过程使用AOP思想,在action里面没有直接调用拦截器的方法,使用配置文件方式进行操作。
- 在执行拦截器时候,执行很多拦截器,这个过程使用责任链模式。(例如,执行三个拦截器,执行拦截器1之后做放行操作;执行拦截器2,执行拦截器2后做放行;执行拦截器3,执行拦截器3之后放行,执行acion的方法)
源码分析:
i.执行action
execute.executeAction(request, response, mapping);ii.创建action对象,使用动态代理方式
iii.执行action里面的方法
proxy.execute();iv.执行很多的拦截器,遍历执行
if (interceptors.hasNext()) {//类似于放行的方法return invocation.invoke();
3.过滤器和拦截器的区别
a.过滤器过滤器理论上可以过滤任意内容,如html,jsp,servlet,图片路径
b.拦截器
拦截器只可以拦截action
4.Servlet和action的区别
a.Servlet默认第一次访问时创建,创建一次,单实例对象。
b.action
每次访问时创建,创建多次,多实例对象。
三.自定义拦截器
1.在struts2里面有很多拦截器,这些拦截器是struts2封装的功能,但是在实际开发中,struts2里面的拦截器中可以没有要使用的功能,这个时候就需要自己写拦截器实现功能
2.拦截器结构:
a.查看源代码
-继承类:public class ModelDrivenInterceptor extends AbstractInterceptor
public abstract class AbstractInterceptor implements Interceptor
b.在接口里面有三个方法
public interface Interceptor extends Serializable {void destroy();
void init();
String intercept(ActionInvocation invocation) throws Exception;
}
destroy():方法指示拦截器的生命周期结束,它在拦截器被销毁前调用,用于释放拦截器在初始化时占用的一些资源。
init():方法用于对拦截器执行一些初始化操作,此方法在拦截器被实例化后和intercept()方法执行前调用。
intercept():是拦截器中的主要方法,用于执行Action对象中的请求处理方法及其前后的一些操作,动态增强Action的功能
c.AbstractInterceptor对象是一个抽象类,实现了 Interceptor 接口,在创建拦截器时可以通过继承该对象创建。在继承 AbstractInterceptor对象后,创建拦截器的方式更加简单,除了重写必需的 Interceptor()方法外,如果没有用的 init()和destroy()方法,则不必实现。
d.开发中,建议使用另一种方式:
继承 MethodFilterInterceptor类实现,可以让action里面某个方法不进行拦截e.让拦截器和action有关系
不是在action调用拦截器的方法,而是通过配置文件的方式让建立关系3.自定义登录拦截器
a.需求:
在项目中,有很多action的超链接,实现只有是在登录状态下,才可以点击action的超链接实现功能,如果不是登录状态,点击action超链接返回到登录页面。b.登录状态:使用session域对象实现:
i.登录成功之后,把数据放到session里面ii.判断session是否有值,可以知道是否是登录状态
c.实现登录的基本功能
4.添加登录拦截器功能
a.判断是否登录,判断session里面是否有名称是 username的值
b.拦截器实现过程
1)第一步:创建类,继承 MethodFilterInterceptor类2)第二步:重写 MethodFilterInterceptor类里面的方法写拦截器逻辑
3)第三步:配置action和拦截器的关系(注册拦截器)
i.在要拦截的action标签所在package标签里面声明拦截器
ii.在具体的action标签里面使用声明的拦截器
iii.struts2里面执行很多的默认拦截器,但是如果在action里面配置自定义拦截器,默认拦截器就不会执行了。所以把默认拦截器再声明一次
c.配置拦截器,对action里面所有方法都进行拦截
1)在action里面有login的登录方法,这个方法不需要拦截,如果这个方法都拦截,那么永远登录不进去2)解决:不拦截login()方法
继承MethodFilterInterceptor类实现,可以让action里面某个方法不进行拦截
<interceptor-ref name="LoginIntercepor">
<!-- 配置action里面的某些方法不进行拦截 name属性:excludeMethods -->
<param name="excludeMethods">login</param>
</interceptor-ref>