概述
拦截器(interceptor):struts2独有的概念。struts2里面的很多功能封装在拦截器(表单获取中的模型驱动等,值栈传递数据等)
每次只执行默认拦截器
拦截器执行的时间
action对象创建之后,action方法执行之前
1、拦截器的底层原理
1.1 两种思想
1) aop思想(底层用到动态代理,spring时深入)
面向切面(方面)编程,不修改源代码来拓展功能(通过配置,把他们关联起来)。
2)责任链模式
设计模式中的一种,和过滤链很相似。
过滤链:一个请求,有多个过滤链进行过滤,每个过滤器只有放行,才能到下一个过滤器。
责任链:要执行一连串操作,只有当前操作放行,下一个操作才能执行
1.2 两种思想如何运用到拦截器的
拦截器中的默认拦截器,是在每次action方法之前生效的。
aop思想:在action没有直接使用拦截器的方法,而是通过配置文件配置进去。
责任链:很多个拦截器,使用责任链。
1.3 源代码分析
1、
2、创建action的代理对象
用动态代理创建代理对象,和new出来的不一样,ActionProxy 能实现和action一样的功能。
3、执行action的方法
4、执行很多拦截器,遍历执行
5、类似于放行操作
1.4 过滤器和拦截器的区别
(1) 过滤器:理论上过滤任意的内容,比如html、jsp、servlet、图片路径
(2)拦截器:拦截器只拦截action
2、自定义拦截器
(2) 开发中,写一个类,继承MethodFilterInterceptor类实现,这样做可以让action里面某个方法不进行拦截
(3) 让拦截器和action有关系,这运用了aop思想
不在action里面调用拦截器的方法,而是通过配置文件建立关系
2.2 需求分析
只有登陆的状态,才能点击action的超链接,否则返回到登陆页面
登陆成功后,让session中放入值,用于判读是否登陆
EL表达式复习: 在jsp中取域对象session中的值
${sessionScope.username} 或者 ${username}
2.3 实现登陆拦截器
拦截器判断session里面是否有名称是username的值
第一步:创建类,继承MethodFilterInterceptor
第二步:重写类里面的方法,写拦截器逻辑
第三步:配置action和拦截器的关系(注册拦截器)AOP思想。
(1)在你要拦截的action标签所在的package标签里面声明拦截器
(2)在具体的action标签里面使用声明好的拦截器
(3)struts2里面会执行很多默认的拦截器,但是我们一旦配置了自定义拦截器,那么默认拦截器不会执行,因此需要解决。
解决:手动把默认拦截器配置进去
可以把包里面的所有都复制进去,或者复制包。
2.4 对部分方法不拦截
我们配置完,拦截器会对所有方法进行拦截,可是我们的登陆功能也在里边,如果也进行拦截,那永远无法登陆。
对login进行不过滤
2.5 项目的小问题,表单递归了。
解决:
表示在它的父页面打开