拦截器概述
- struts2是框架,封装了很多的功能,struts2里面封装的功能都是在拦截器里面的
- struts2里面封装了很多的功能,有很多拦截器,不是每次这些拦截器都要执行,每次执行默认的拦截器
- struts2里面默认的拦截器的位置
- 拦截器执行时间
- 在action对象创建之后,action的方法执行之前
拦截器原理
- 在action方法执行之前执行默认额拦截器,执行过程使用aop思想,在action没有直接调用拦截器的方法,使用配置文件方式进行操作
- 因为有多个拦截器,执行多个拦截器的时候,这个过程需要使用责任链模式
- aop思想
- 面向切面(方面)编程
- 不需要修改源代码扩展功能。
- 责任链模式
- 在Java中有很多的设计模式,责任链模式是其中的一种
- 责任链模式和过滤链很相似的
- 要执行多个操作,有三个拦截器,拦截器1执行,执行拦截器1的放行方法,执行拦截器2,执行拦截器2的放行方法,执行拦截器3,执行拦截器3的放行方法
- 过滤链:一个请求可能被多个过滤器进行过滤,每个过滤器只有放行才能到下一个过滤器
查看源代码
- 服务器启动,加载过滤器,过滤器中的init方法加载配置文件
- 访问action,过滤器doFilter方法执行
- 创建action对象,使用动态代理方式
- 执行action的方法
- 执行很多的拦截器,遍历执行
- 类似于放行的操作
过滤器和拦截器的区别
- 过滤器:过滤器理论上可以过滤任意的内容
- 拦截器:因为拦截器只有在action创建之后,action方法执行之前有效,只可以拦截action
Servlet和action的区别
- Servlet 默认的请求的时候创建,只是创建一次,是单实例对象
- action 每次访问都要创建,是多实例对象
自定义拦截器
- 在struts2 里面有很多的拦截器,这些拦截器是struts2封装的功能,但是在实际的开发中,struts2里面的拦截器中可以没有要使用的功能,这个时候就需要自定义拦截器的实现功能
- ==拦截器结构==
- 查看源代码看拦截器结构
- 继承类AbstractInterceptor
- 继承的类AbstractInterceptor实现了接口Interceport
- 接口里面的三个方法
- init()初始化操作
- destroy()销毁方法
- intercept(ActionInvocation invocation)执行拦截操作
- 接口里面的三个方法
- 在开发中推荐使用继承MethodFilterInterceptor 类实现
- 让action里面的某个方法不进行拦截
- 写出来的拦截器只是有一个独立的类,为了让拦截器和action有关系,那么通过aop思想,使用配置文件建立联系
案例:使用自定义拦截器实现登录判断功能
- 需求 :在项目中,有很多的功能,是只有登录状态才可以访问的,如果不是登录状态不能访问
- 每个资源都进行判断很繁琐
- 当然通过过滤器也是 可以实现的
- 通过拦截器同样可以实现
- 登录的 状态,使用Session域中是否有登录信息来判断
- 过程:
- 登录页面:
- action处理类:
- struts.xml对action的配置结果
- 添加登录拦截的功能:
- 通过判断Session域中是否有登录信息判断
- 拦截器的实现过程
- 创建类,继承MethodFilterInterceptor类,并且重写父类里面的 拦截方法
- ==配置拦截器和action的联系(注册拦截器)==
- 第一步:在要拦截的action标签所在的package标签里声明拦截器
- 第二步:在具体的action标签里使用声明的拦截器
- ==注意第三步==:struts2里面有很多的默认的拦截器,但是如果在struts2的核心配置文件中配置了自定义的拦截器,那么默认拦截将会失效,
- ==可以通过在struts2的核心配置文件中重新配置默认拦截器的 方式实现默认拦截器的作用==
- ==配置不拦截的方法==
- 当自定义了一个拦截器的时候,这个拦截器会拦截所有的action方法,但是如果需要不拦截某些方法,可以在struts2的核心配置文件中的interceptor-ref标签下定义一个子标签param 来执行不拦截的方法,如果有多个方法不需要拦截,使用逗号分隔