【JavaEE笔记】Struts2 (四) 拦截器相关

一.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>



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值